<p>信令不是QGraphicItem的一部分,因为它们不是从QObjects继承的。出于性能考虑,这是一个设计决定,允许非常大和快速的场景。如果你决定你真的需要特殊情况下的信号,QGraphicsWidget被创建来填补这个空白。它确实继承自QObject,并允许您混合使用QWidget和QGraphicsItem功能。不过,如果场景大小适中,建议您避免这样做。</p>
<p>另一个可能与您的情况相关的选项是使用sceneEventFilter方法。您可以将一个项目设置为接收另一个项目的事件,并决定是否应传播这些事件:
<a href="http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qgraphicsitem.html#sceneEventFilter" rel="noreferrer">http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qgraphicsitem.html#sceneEventFilter</a><br/>
一个项目可以设置为多个对象的筛选器。它可以识别出每个要响应的项目和事件。</p>
<p>一般来说,你应该利用场景来协调它的对象。这已经是用于事件的模式(协调将所有事件传递到项的场景)。</p>
<p>而且,您的选项A似乎是不可能的,因为QGraphicsItem甚至没有emit方法。您需要将QObject实例作为一个成员组合在其中,并使用它来发出信号。沿着<code>myItem.qobject.emit()</code>这条线的东西。否则,您将不得不从QGraphicsObject继承您自己完全自定义的一个</p>
<p><strong>更新1</strong>:处理您的主要评论更新</p>
<p>你的具体情况是一个带有“热角”的矩形。我认为这是一个自定义的QGraphicsItem。您可能会将QGraphicsRectItem子类化,然后将内部的子热角项组合为子项(<code>setParentItem()</code>)。现在,矩形项知道了它的子项,并且可以直接作用于它们。可以将矩形项设置为子级的sceneEventFilter并直接处理其事件。不用再回到现场了。让所有这些逻辑活在课堂上。</p>
<p><strong>更新2</strong>:解决添加的问题3</p>
<p>将通信传播到QWidget的场景之外,我可以想到以下几种方法:</p>
<ol>
<li>在这种情况下,您可以考虑是否要使用QGraphicsObject子类作为根项,然后将其余对象作为子项(rect,然后将热角作为rect的子项)组合。这将允许对象发出信号。为了清晰起见,它们可能仍然连接到场景,然后场景的高阶容器将连接到场景。根据场景的复杂性以及QGraphicsObject是否对其有任何性能影响,您必须逐个选择这种方法。如果有大量这样的实例,您可能应该避免这样做。</li>
<li>可以为rect类定义一个回调,场景可以为其设置。或者类似于:<code>graphicsRect.resizedCallback</code>作为属性,或者是setter<code>graphicsRect.setResizedCallback(cbk)</code>。在你的rect类中,你可以在适当的时候调用它。如果设置了回调,则可以使用它直接调用场景中的某些内容。rect类仍然不知道这个逻辑。只是回拨电话。</li>
</ol>
<p>这些只是一些建议。我肯定还有别的办法。</p>