• 10915阅读
  • 9回复

[提问]移除QGraphicsScene里面的item,重新添加 [复制链接]

上一主题 下一主题
离线lcl_data
 
只看楼主 倒序阅读 楼主  发表于: 2013-03-26
我有一个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 ,该怎么办啊。。。

离线lcl_data
只看该作者 1楼 发表于: 2013-03-26
不调用scene->clear(),是可以保证第2次添加Item1时显示正常,但是这个多显示一个Item2啊
离线彩阳

只看该作者 2楼 发表于: 2013-03-26
我也遇到了一个相似的问题,查了原因,是Qt对象树系统(父子机制)的问题。当clear( )的时候,会将它的孩子都释放掉。
上海Qt开发联盟,热忱地欢迎你的加入!
离线lcl_data
只看该作者 3楼 发表于: 2013-03-27
回 2楼(彩阳) 的帖子
那你是如果解决这个问题的?

我想到了一个不是很好的办法,那就是我有几组QGraphicsItem, 我就定义几个QGraphicsScene,每次只显示一个scene,只是初步想法,还没具体实施看。。
离线彩阳

只看该作者 4楼 发表于: 2013-03-27
和这个帖子联动一下:这里 ,你的方法可以。
目前得出一个结论,只要加入了QObject对象树系统(父子机制),那么内存管理不是你的事儿了,你也不应该管。
上海Qt开发联盟,热忱地欢迎你的加入!
离线lcl_data
只看该作者 5楼 发表于: 2013-03-27
回 4楼(彩阳) 的帖子
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问过同样的问题,不过没人回答实质性的内容。
离线XChinux

只看该作者 6楼 发表于: 2013-03-27
用removeItem().
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线lcl_data
只看该作者 7楼 发表于: 2013-03-27
我用多个view,每个view里面都有一个scene,一个scene之显示一组Items.

通过控制view 的show hide解决了问题。
离线lcl_data
只看该作者 8楼 发表于: 2013-03-27
回 6楼(XChinux) 的帖子
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应该也可以满足我的要求。
谢谢版主。
离线wahela

只看该作者 9楼 发表于: 2015-12-18
clear会移除且释放内存,也就是item1对象已经删除了,所以当然加不上了
快速回复
限100 字节
 
上一个 下一个