如何在addItem或itemChange上从QGraphicsScene获取通知?

时间:2012-10-22 11:35:33

标签: qt notifications signals qgraphicsitem qgraphicsscene

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

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

我需要一个适用于任何QGraphicsItem的解决方案。

这是一个不起作用的事项清单:

  • 连接QGraphicsScene 的信号(如QAbstractItemModel::rowsInserted() - >没有。
  • 继承自QGraphicsScene并重载虚拟通知程序函数(如QTabWidget::tabInserted() - >没有。
  • 继承并重载addItem(),自行发送通知(如QMdiArea::addSubWindow() - > addItem不是虚拟的,而是从QGraphicsItems的构造函数调用。
  • 在新添加的QGraphicsItems上安装事件过滤器 - >不知道如何获取新添加的项目,它只能是sceneEventFilter,只能安装在其他QGraphicsItems上。
  • 连接到itemChange()的{​​{1}} - > QGraphicsItem不是信号并且重载itemChange不是一种选择。
  • wrap QGraphicsItem(将场景作为私有成员)并仅公开函数QGraphicsSceneaddItem - >但该场景中的removeItem仍然可以通过QGraphicsItems函数访问它,因此此解决方案不够安全。

如何收到有关商品更改的通知?

如果有一种简单的方法,我错过了,请指出我。另外,我非常欣赏这方面的想法。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我意识到OP的要求之一是不将其归类,但我希望这仍对最终使用此方法的人有所帮助。 Qt正在发送事件来做到这一点,它只需要扩展for方法以“得到通知”即可。然后,您可以像这里的示例一样插入回调方法,或提供信号,或任何您需要的东西。

这是在Python中,但我确定它与C ++中的模式相同:

def remove_adjacences(s):
    n = ""

    c = ''
    for new_c in s:
        if new_c != c:
            n += new_c
            c = new_c

    return n