在我的项目中,我正在使用 QGraphicsScene
并在代码中不断添加/删除项。
现在我想在 QGraphicsItem
被添加或移除时得到通知。许多 Qt 类都有通知信号或至少在这些更改时调用的虚拟函数。我试图避免在许多地方添加许多代码行,这既麻烦又不安全(现在或将来可能会忘记插入/删除)。
我需要一个适用于任何 QGraphicsItem
的解决方案。
以下是不起作用的内容清单:
- 连接到
QGraphicsScene
的信号 (如QAbstractItemModel::rowsInserted()
中的信号) -> 没有信号。 - 继承自
QGraphicsScene
并重载虚拟通知函数 (如QTabWidget::tabInserted()
中的函数) -> 没有此功能。 - 继承并重载
addItem()
,手动发送通知 (如在QMdiArea::addSubWindow()
中的方式) ->addItem
不是虚拟的,并且在QGraphicsItems
的构造函数中调用。 - 在新添加的
QGraphicsItems
上安装事件过滤器 -> 不知道如何获取新添加的项,并且它将是一个只能安装在其他QGraphicsItems
上的sceneEventFilter
。 - 连接到
QGraphicsItem
的itemChange()
->itemChange
不是信号,并且重载QGraphicsItem
不可行。 - 包装
QGraphicsScene
(将场景作为私有成员),并仅公开函数addItem
和removeItem
-> 但该场景中的QGraphicsItems
仍然可以通过scene()
函数访问它,所以这个解决方案还不够安全。
如何获得有关项目更改的通知?
如果有我错过的简单方法,请指出来。否则,我非常感谢有关此的想法。
addItem()
函数。 - pmrQGraphicsItem
进行子类化,因为它的所有场景变化(包括场景的添加/移除)都通过它的sceneEvent(QEvent* event)
方法实现 - 这为解决您的问题提供了一个非常简洁且可调节的解决方案。 - cmannett85addItem()
函数不是虚函数,并且从QGraphicsItem
的构造函数中调用。因此这不是一个完整的解决方案。 - Martin HenningsQGraphicsObject
(也在使用中),这样会导致代码重复。更糟糕的是,为了从QGraphicsItem
发送信号,我还必须继承QObject
,这将打破我的项目中的几个继承层次结构。 - Martin Henningsscene()->removeItem(this)
- 我仍然无法防止或至少得到通知。 - Martin Hennings