• 10081阅读
  • 10回复

QT graphics view框架下如何实现一个窗体含有多个页面? [复制链接]

上一主题 下一主题
离线luosw27
 
只看楼主 倒序阅读 楼主  发表于: 2011-03-25
各位大侠:
    最近新学习QT并马上要用到项目中,有哪位大侠愿意指导下我的?不胜感激!
    graphics view框架下,一个view对应一个scene时,背景图可以设置在scene,也可以在view的drawBackground绘制。item都加载到scene下,可以实现简单的图形界面应用。
    如果一个应用含有多个界面,需要做界面的切换,我的理解是:一个界面就是一个场景,界面中的控件,都是此场景中的item。那么按这思维,一个应用,应该是含有一个view和n个scene。但是,graphics view框架中是一个scene对应有n个view(由函数QList<QGraphicsView *>  views () const 获取views),跟我想要实现的恰恰相反。我该怎么去设计我的程序架构
    另外,此为嵌入式平台的应用,有性能上的要求。需求我描述得不好,大家不明白的提出来。
离线luosw27
只看该作者 1楼 发表于: 2011-03-25
或者自行管理scene,每一个view,对应一个scene栈,先入后出,要显示哪个scene,view就绑定此scene。至此,又有以下问题:(1)view和scene的绑定与取消绑定操作该如何实现?(2)当删除scene的时候,资源释放需要哪些操作?
离线yleesun

只看该作者 2楼 发表于: 2011-03-25
用一个VIEW对应多个SCENE.切换可以用view的setScene方法实现。
每个SCENE中的ITEM自行管理,ITEM在会展SCENE释放时,自动被释放。
离线luosw27
只看该作者 3楼 发表于: 2011-03-25
谢谢yleesun !!

new 创建的scene、item,能自动释放吗?我感觉不安全。但我发现程序没有进入scene的析构函数。
我是这样操作的:CGraphScene是我从QGraphicsScene派生的类,CMyItem是从QGraphicsItem派生的item类;
在view类中
CGraphScene* scene1 = new CGraphScene(this);
CMyItem* pItem = new CMyItem;
scene1->addItem(pItem);
开始时为setScene(scene1);

当切换由scene1切换到scene2时;
setScene(scene2);
那么应该如何释放scene1的资源?

离线luosw27
只看该作者 4楼 发表于: 2011-03-26
有个问题很奇怪,CGraphScene是我从QGraphicsScene派生的类。
析构函数定义
CGraphScene::~CGraphScene ()
{
    qDebug("CGraphScene::~CGraphScene\n");
    QGraphicsScene::~QGraphicsScene();
}
当创建
CGraphScene* scene = new CGraphScene();
然后
delete scene;
调试发现报错了,程序打印了CGraphScene::~CGraphScene之后就崩溃了。
离线roywillow

只看该作者 5楼 发表于: 2011-03-26
其实我觉得……QGraphicsScene::~QGraphicsScene()好像没见过这么用的……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线luosw27
只看该作者 6楼 发表于: 2011-03-28
我疏忽了
不必QGraphicsScene::~QGraphicsScene(),派生类调用析构函数后会自动调用基类的析构函数。
离线luosw27
只看该作者 7楼 发表于: 2011-03-28
又出现新的拦路虎了,希望也是只“纸老虎”。
我在item中响应鼠标事件,在item的mouseReleaseEvent中处理退出当前scene并销毁当前scene。
这样的操作引发了一个问题:scene.clear时,删除所有的item,那么当item的mouseReleaseEvent返回的时候,程序就又崩溃了。
是否考虑使用信号-槽机制来实现这个功能?在item的mouseReleaseEvent设置当前view的一个信号,来响应view中自定义的槽函数,由槽函数来销毁scene。
我对QT的学习才刚刚开始,对QT的很多机制都不了解。
有做过类似工作的大虾帮忙解答下,或者提供更好的办法,谢谢!
离线dbzhang800

只看该作者 8楼 发表于: 2011-03-28
引用第7楼luosw27于2011-03-28 11:40发表的  :
又出现新的拦路虎了,希望也是只“纸老虎”。
我在item中响应鼠标事件,在item的mouseReleaseEvent中处理退出当前scene并销毁当前scene。
这样的操作引发了一个问题:scene.clear时,删除所有的item,那么当item的mouseReleaseEvent返回的时候,程序就又崩溃了。
是否考虑使用信号-槽机制来实现这个功能?在item的mouseReleaseEvent设置当前view的一个信号,来响应view中自定义的槽函数,由槽函数来销毁scene。
我对QT的学习才刚刚开始,对QT的很多机制都不了解。
.......

考虑
QObject::deleteLater ()
离线luosw27
只看该作者 9楼 发表于: 2011-03-28
事实证明 dbzhang800 建议的使用QObject::deleteLater () 解决了我的问题。
原来代码为
  pScene->clear();
     delete pScene;
改为
  pScene->deleteLater();
后,程序先执行完item的鼠标事件函数,接着才析构scene和items。

谢谢大家!
看来QT的很多功能,是以前在WIM32下没有用过的。
  
离线luosw27
只看该作者 10楼 发表于: 2011-04-01
奇怪了,如何结贴?是不是因为没有设置积分奖励?
快速回复
限100 字节
 
上一个 下一个