12

在我的项目中,我QGraphicsScene在整个代码中使用并添加/删除项目。

现在,我想QGraphicsItem在添加或删除 a 时得到通知。许多 Qt 类具有通知信号或至少是在此类更改时调用的虚拟函数。我试图避免在许多地方添加多行代码,这不仅麻烦而且不安全(现在或将来忘记插入/删除)。

我需要一个适用于任何QGraphicsItem.

这是不起作用的事情的列表:

  • 连接到QGraphicsScene (如QAbstractItemModel::rowsInserted()的信号-> 没有。
  • 继承QGraphicsScene并重载一个虚拟通知函数(如QTabWidget::tabInserted() -> 没有。
  • 继承和重载addItem(),自己发送通知(如中QMdiArea::addSubWindow() ->addItem不是虚拟的,而是从QGraphicsItems.
  • 在新添加的设备上安装事件过滤器QGraphicsItems-> 不知道如何获取新添加的项目,并且它sceneEventFilter只能安装在其他QGraphicsItems.
  • 连接到itemChange()of QGraphicsItem->itemChange不是一个信号并且重载QGraphicsItem不是一个选项。
  • wrap QGraphicsScene(将场景作为私有成员)并且只公开函数addItemremoveItem-> 但QGraphicsItems在那个场景中仍然可以通过scene()函数访问它,所以这个解决方案不够安全。

如何获得有关项目更改的通知?

如果有一种我只是错过的简单方法,请指出我。否则,我非常感谢您对此的想法。

4

2 回答 2

1

我认为你能做的最好的就是连接到QGraphicsScene::changed()信号。

它不会告诉您更改/添加/删除了哪些项目,因为它旨在QGraphicsView更新显示。但是您应该能够使用提供的区域找出答案。

于 2012-10-22T13:49:25.757 回答
0

I realize one of the requirements of the OP is to not subclass the item, but I hope this still helps others who end up here. Qt is sending events to do this, it just requires extending the itemChange method to "get notified". You can then hook in a callback method like the example here, or provide signals, or whatever you need.

This is in Python but I'm sure it is the same pattern in C++:

def itemChange(self, change, value):
    """
    Runs if this item has the `ItemSendsGeometryChanges` flag set.

    This doesn't "accept" any of the changes, it is only to add hooks.
    """
    if change == QtWidgets.QGraphicsItem.ItemSceneChange:
        # The value for this event is the scene. None means the item was removed.
        if value:
            self.onAddedtoScene(value)
        else:
            self.onRemovedFromScene()

    return super(SceneNodeBase, self).itemChange(change, value)
于 2020-01-22T20:51:06.663 回答