将信号/槽(QObject)添加到QGraphicsItem:性能命中?

时间:2011-02-07 15:07:37

标签: c++ qt qt4

我想在QGraphicsItem中添加信号/槽,以便从另一个线程到达QGraphicsItemObjects。我知道有两个选项:使用QGraphicsObject或从QObject和QGraphicsItem继承。

使用QGraphicsObject

这被认为是缓慢的。根据堆栈溢出的this answer,QGraphicsObjects由于它们的实现而很慢。当我查看QGraphicsObjects的源代码时,我可以看到根据对象所做的更改发出了很多信号。对我而言,这似乎是QGraphicsObjects缓慢的原因,但我认为第二种解决方案可以避免这种性能上升(如果真的是一次)。

继承自QObject和QGraphicsItem。

当构造一个继承自QObject和QGraphicsItem的类时,你似乎得到了QGraphicsObject最有趣的功能减去性能命中:你可以在你的类中定义槽和发出信号,但是你没有继承默认的实现QGraphicsObject会不断发出您可能不感兴趣的变化的信号。您现在能够发出信号,但不必担心为您不关心的事物发出信号(x值会发生变化发出信号)在QGraphicsObject中但在此解决方案中没有。)

我的问题摘要

  • QGraphicsObjects真的比QGraphicsItems慢吗?
  • 如果是,是因为实现发出信号(并且发射信号是 性能大打折?)
  • 如果是这样,第二个解决方案(多重继承)会避免这种惩罚吗?

3 个答案:

答案 0 :(得分:10)

  

QGraphicsObjects真的很慢吗?   比QGraphicsItems?

是。你的分析是正确的。由于它们执行的信令,QGraphicsObjects较慢。它们还具有更大的内存开销,因为它们继承自QObject,如果正在创建许多QGraphicsObjects,这可能会显着影响性能。

  

如果是,是因为   实现发出信号(和   发射信号是一个很大的表现   命中)?

是的,如果使用项目的方式会导致信号过多。然而,发射信号可能不像其他操作那样昂贵。在the talk "Qt GraphicsView in Depth"中,Alexis Menard说对itemChange的调用很慢,有时候直接监听更改会更好。 QGraphicsItems和QGraphicsObjects都会因使用itemChange而受到惩罚。

  

如果是这样,第二个解决方案   (多重继承)避免这种情况   罚?

是。通过继承QGraphicsItem和QObject并且仅发出所需信号,可以避免一些不必要的信令。当然,QObject的内存开销仍然会发生。

答案 1 :(得分:10)

This thread建议另一种选择:创建一个QObject子类,代表你的QGraphicsItems发出信号。

如果您有许多可以共享单个QObject的QGraphicsItem,那么这将比每个QGraphicsItem继承QObject更轻量级。

答案 2 :(得分:0)

您可以如下更改类继承:

类GraphicalButton:公共QObject,公共QGraphicsItem

然后在课程开始时添加 Q_OBJECT

现在您可以添加信号和插槽了。

在运行应用程序 clean 运行qmake

之前