C++ 向QGraphicsItem添加信号/插槽(QObject):性能命中?

C++ 向QGraphicsItem添加信号/插槽(QObject):性能命中?,c++,qt,qt4,C++,Qt,Qt4,我想向QGraphicsItem添加信号/插槽,以便可以从另一个线程访问QGraphicsItemObjects。我知道有两个选项:使用QGraphicsObject或从QObject和QGraphicsItem继承 使用QGraphicsObject 这被认为是缓慢的。根据OnStackOverflow,QGraphicsObject由于其实现速度较慢。当我查看QGraphicsObject的源时,我可以看到很多信号是根据对对象所做的更改发出的。对我来说,这似乎是一个合理的理由来解释为什么QG

我想向QGraphicsItem添加信号/插槽,以便可以从另一个线程访问QGraphicsItemObjects。我知道有两个选项:使用QGraphicsObject或从QObject和QGraphicsItem继承

使用QGraphicsObject 这被认为是缓慢的。根据OnStackOverflow,QGraphicsObject由于其实现速度较慢。当我查看QGraphicsObject的源时,我可以看到很多信号是根据对对象所做的更改发出的。对我来说,这似乎是一个合理的理由来解释为什么QGraphicsObject很慢,但我认为第二种解决方案可以避免这种性能影响(如果真的是这样的话)

从QObject和QGraphicsItem继承。 当构造一个从QObject和QGraphicsItem继承的类时,似乎您得到了QGraphicsObject最有趣的特性,减去性能影响:您可以在类中定义插槽并发出信号,但您不能继承QGraphicsObject的默认实现,该实现会不断发出更改信号可能不感兴趣。现在,您可以发出信号,但不必担心因您不关心的事情而发出的信号(在QGraphicsObject中改变的x值会发出信号,但在本解决方案中不会)

我的问题摘要
  • QGraphicsObject真的比QGraphicsSitems慢吗
  • 如果是,是因为实现发出信号(而发出信号是 大的性能打击
  • 如果是这样,第二种解决方案(多重继承)是否避免了这种惩罚
QGraphicsObject真的很慢吗 比QMS更重要

对。你的分析是正确的。QGraphicsObject速度较慢,因为它们执行的是信号发送。它们还有更大的内存开销,因为它们继承自QObject,如果创建了许多QGraphicsObject,这可能会显著影响性能

如果是,是因为 实现发出信号(和 发射信号是一个巨大的性能 击中

是的,如果项目的使用方式导致过多的信号。然而,发射信号可能不像其他操作那样昂贵。在一篇文章中,亚历克西斯·梅纳德说,对itemChange的调用很慢,有时直接倾听更改会更好。QGraphicsSitems和QGraphicsObjects都会因使用itemChange而受到惩罚

如果是的话,第二种解决方案是什么 (多重继承)避免这种情况 惩罚

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

建议另一种选择:创建QObject子类以代表QGraphicsSitems发出信号


如果您有许多QGraphicsItem可以共享一个QObject,那么这将比让每个QGraphicsItem继承QObject更轻

您可以更改类继承,如下所示:

类图形按钮:公共QObject、公共QGraphicsItem

然后在课程开始时添加Q_对象

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


在运行应用程序clean&runqmake

之前,我会尝试对其进行评测,看看如果不使用额外发出的信号,是否会对性能产生任何影响。只要它们没有连接到插槽,它们就可能不在那里,对吗?根本的区别是什么(除了这里更具体)关于这个问题:?这两个问题涉及同一个主题,但我确实更具体:我特别感兴趣的是多重继承是否是克服QGraphicsObject产生的开销问题的正确解决方案。分析显然是正确的检查方法。我可以想象,正是QoObject的所有权特性使它们在创建或销毁时变得缓慢。您可能需要考虑一个选项3——将QObjtC类成员放置在QGoLICSITEM中,而不是图形项本身。应该注意,<代码> QGraceCsObjs<代码>本身也继承了从<代码> QObjult<代码>和<代码> QGraceCITEM> 。