QGraphicsScene的数据存储解决方案,该怎么解决

QgraphicsScene类为管理大量的2D图形item提供了一个管理界面,做为item的容器,它配合使用QgraphicsView使用来观察items,例如线,矩形,文本或者自定义的ite...
前言最近一直使用QGraphicsView框架在我的一个实际项目中,官方文档好多都没说清楚啊,有木有?!文档都翻光了,却还是有好多没明白。
一个令我恼火的bug就是,明明log打出来的每个It...
graphics view 框架结构主要包含三个类,场景类(qgraphicsscene),视图类(qgraphicsview)和图元类(qgraphicsitem)
在视图上显示一个场景,分别都可以相应mousePressEvent;
但是如果,两个同时打开,是有视图可以相应,场景无法响应;
解决方法是发消息:
void myGraphicsView::m...
在图形视图框架中,QGraphicsScene 提供一个快速的接口,用于管理大量 item,QGraphicsItem 是场景中 item 的基类。图形视图提供了一些典型形状的标准 item,当然,我...
QtGraphics主要由三部分组成,分别是View,Scene, Item。
Graphics View提供了一个界面,它既可以管理大数量的定制2D graphical items,又可与它们交互,有一个view widget可以把这些项绘制出来,并支持旋转与缩放。这个柜架也包...
这个类翻译了好久,实在是成员函数太多了,分享出来,希望对大家有用,多多支持哦~~
QGraphicsItem类是视图框架的一部分,是在一个QGraphicsScene中最基本的图形类,它...
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)QGraphicsView框架容易忽视的坐标有关问题-“画布”QgraphicsScene到底放在了哪儿 - HTML/CSS当前位置:& &&&QGraphicsView框架容易忽视的坐标有关问题-“画布”QGraphicsView框架容易忽视的坐标有关问题-“画布”QgraphicsScene到底放在了哪儿&&网友分享于:&&浏览:0次QGraphicsView框架容易忽视的坐标问题-“画布”QgraphicsScene到底放在了哪儿?前言
最近一直使用QGraphicsView框架在我的一个实际项目中,官方文档好多都没说清楚啊,有木有?!文档都翻光了,却还是有好多没明白。
一个令我恼火的bug就是,明明log打出来的每个Item的坐标都是预期的,但为什么最后结果不对呢?
我在视图中添加了一个直线项(QPoint(0,0),QPoint(100,100));
结果却是:
有的同行看到可能会一下指出,我没有设置QGraphicsScene的SceneRect,所以所有的元素默认显示。
是的,上面这个例子的确如此,但是即使我们设置了呢,结果却是这样:
直线项确实不居中了,但是端点也没有在左上角啊!下面,我们就来深入结合例子弄清楚这一些问题。
先上demo代码,很简单,
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include &QMainWindow&
#include &QGraphicsView&
#include&QGraphicsScene&
#include&QDebug&
namespace Ui {
class MainW
class MainWindow : public QMainWindow
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void showView();
QGraphicsScene *graphicsS
QGraphicsView *graphicsV
Ui::MainWindow *
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui-&setupUi(this);
graphicsScene = new QGraphicsScene(this);
graphicsView = new QGraphicsView(graphicsScene,this);
QSize window =this-&size();
graphicsView-&setFixedSize(this-&width(),this-&height());
graphicsScene-&addLine(0,0,100,100);
void MainWindow::showView()
graphicsView-&show();
MainWindow::~MainWindow()
#include "mainwindow.h"
#include &QApplication&
int main(int argc, char *argv[])
QApplication a(argc, argv);
qDebug() &&"line location:"&&"\n";
qDebug()&&"startPoint:" &&QPoint(0,0);
qDebug()&&"endPoint:" &&QPoint(100,100);
w.showView();
return a.exec();
这份代码确实是QGraphicsScene和QGraphicsView的基本代码,并没有设置QGraphicsScene的sceneRect,所以结果也是大家可以预测的那样居中显示:
但是!很多时候框架中自认为很令人方便的设计一点都不利于我们开发,我们开发人员习惯的坐标系统是左上角为(0,0)的坐标系统!
于是,官方给出了解决方案:使用void setSceneRect(const QRectF & rect)控制sceneRect区域,这很人迷惑,就在我们这个例子中,我们想让scene左上角坐标是(0,0),是不是说只需要scene-&setSceneRect(QRectF(0,0,W,H)就可以了呢?很遗憾的是,实验结果告诉我们不是:
我们在上面的mainwindow.cpp里面设置scenRect为(0,0,150,150)试试看!:
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui-&setupUi(this);
graphicsScene = new QGraphicsScene(this);
graphicsView = new QGraphicsView(graphicsScene,this);
QSize window =this-&size();
graphicsView-&setFixedSize(this-&width(),this-&height());
graphicsScene-&setSceneRect(0,0,150,150);
graphicsScene-&addLine(0,0,100,100);
void MainWindow::showView()
graphicsView-&show();
MainWindow::~MainWindow()
结果不是预期!
其实,正确的解决方案是setSceneRect(0,0,W,H);而且需要
W&=static_cast& QWidget *&(graphicsScene-&parent())-&size().width()
H&=static_cast& QWidget *&(graphicsScene-&parent())-&size().height()
看再次修改后的代码:
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include&QWidget&
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui-&setupUi(this);
graphicsScene = new QGraphicsScene(this);
graphicsView = new QGraphicsView(graphicsScene,this);
QSize windowsize =this-&size();
graphicsView-&setFixedSize(this-&width(),this-&height());
graphicsScene-&setSceneRect(0,0
,static_cast&QWidget *&(graphicsScene-&parent())-&size().width()
,static_cast&QWidget *&(graphicsScene-&parent())-&size().height());
graphicsScene-&addLine(0,0,100,100);
void MainWindow::showView()
graphicsView-&show();
MainWindow::~MainWindow()
下面有相应的工程下载:
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 1234567891011 Copyright & &&版权所有2015年5月 Java大版内专家分月排行榜第二2013年5月 Java大版内专家分月排行榜第二
2011年5月 Java大版内专家分月排行榜第三2011年1月 Java大版内专家分月排行榜第三
2015年5月 Java大版内专家分月排行榜第二2013年5月 Java大版内专家分月排行榜第二
2011年5月 Java大版内专家分月排行榜第三2011年1月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。关于QGraphicsScene 和 QGraphicsView 和 QDialog 的杂乱笔记【或说指针复习。。】 - lettry47 - 博客园
1 LtCalibrateDlg::~LtCalibrateDlg()
if (m_pIplImageGray) cvReleaseImage(&m_pIplImageGray);
MYDELETE(m_pKeyboard);
MYDELETE(m_pNumKeyboard);
delete m_pV
LtCalibrateView*
成员变量;
delete m_pS
QGraphicsScene*
成员变量;
delete m_pAboveW
LtCalibrateDlg类中含有LtCalibrateView* 成员变量; QGraphicsScene* 成员变量; IplImage* 成员变量 etc.
1 LtCalibrateView::~LtCalibrateView()
MYDELETE(m_pCircle);
MYDELETE(m_pRing);
MYDELETE(m_pFitCircle);
MYDELETE(m_pLineRect);
MYDELETE(m_pFitLine);
if (m_pIplImageGray) cvReleaseImage(&m_pIplImageGray);
m_pDlg = NULL;
LtCalibrateView*
成员变量;
m_pScene = NULL;
QGraphicsScene*
成员变量;
LtCalibrateView类中含有LtCalibrateDlg* 成员变量; QGraphicsScene* 成员变量; IplImage* 成员变量 etc.
&1 #define MYDELETE(p) {if (p) { p = NULL;}}&在该项目中(Smart2016):有且只有一个 LtCalibrateDlg 型变量 和 LtCalibrateView 型变量,各自中相应类型的指针成员指向对方,共用同一个 scene ,即 俩者中的 m_pScene 指向同一份内存。(注意 view 和 dlg 中的 IplImage* 指向俩份不同内存而 item 变量在 view 类中分配内存。故释放空间时(以 LtCalibrateDlg 窗口关闭为触发时机),先删除 view ,在其析构中回收 Item 内存,而只将 dlg 指针 和 scene 指针 置为 NULL(未 delete, 真正的 delete 操作在dlg中)。而由于俩者的 IplImage* 成员指针指向不同内存,故直接删除即可。 
ps: Qt中 delete scene 操作默认会执行 scene.clear(); 在执行相关操作时需注意
阅读(...) 评论()移除QGraphicsScene里面的item,重新添加 - QTCN开发网 - Powered by phpwind
查看完整版本: [--
移除QGraphicsScene里面的item,重新添加
我有一个QMap&itemID,QGraphicsItem *& mMap,里面有N个QGraphicsItem 。第一次,我用scene-&addItem来添加itemID为“item1”的QGraphicsItem 。显示正常。然后scene-&clear(),调用scene-&addItem来添加itemID为“item2”的QGraphicsItem 。显示正常。此时,若在调用scene-&addItem来添加itemID为“item1”的QGraphicsItem ,发现item1没有显示,且mMap里面的对应的QGraphicsItem *地址还是原来的地址,不过内容变成了0xfeeefeee是不是调用scene-&clear()时调用delete ,把QGraphicsItem *指向的地方全回收了?我要是还想多次显示这些个QGraphicsItem ,该怎么办啊。。。
不调用scene-&clear(),是可以保证第2次添加Item1时显示正常,但是这个多显示一个Item2啊
我也遇到了一个相似的问题,查了原因,是Qt对象树系统(父子机制)的问题。当clear( )的时候,会将它的孩子都释放掉。
那你是如果解决这个问题的?我想到了一个不是很好的办法,那就是我有几组QGraphicsItem, 我就定义几个QGraphicsScene,每次只显示一个scene,只是初步想法,还没具体实施看。。
和这个帖子联动一下: ,你的方法可以。目前得出一个结论,只要加入了QObject对象树系统(父子机制),那么内存管理不是你的事儿了,你也不应该管。
void QGraphicsView::setScene(QGraphicsScene * scene)Sets the current scene to scene. If scene is already being viewed, this function does nothing.这个是Qt助手里的解释,看来多定义几个scene没用,需要多定义几个view.控制view的show hide来完成显示多个item我也在csdn问过同样的问题,不过没人回答实质性的内容。
用removeItem().
我用多个view,每个view里面都有一个scene,一个scene之显示一组Items.通过控制view 的show hide解决了问题。
Removes the item item and all its children from the scene. The ownership of item is passed on to the caller (i.e., QGraphicsScene will no longer delete item when destroyed).removeItem应该也可以满足我的要求。谢谢版主。
clear会移除且释放内存,也就是item1对象已经删除了,所以当然加不上了
查看完整版本: [--
Powered by
Gzip disabled}

我要回帖

更多关于 视频存储解决方案 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信