對于 qgraphicsitem 來說,信号/槽和屬性機制不是它的一部分,因為它不繼承自 qobject。這是一個出于性能考慮的設計決策,允許比較大的場景以及快速的互動。
特殊情況下,如果真的需要使用信号/槽,可以使用 qobject 的信号/槽和屬性機制來擴充 qgraphicsitem。
<a href="#%e7%ae%80%e8%bf%b0">簡述</a>
<a href="#%e7%bb%a7%e6%89%bf%e8%87%aa-qobject-%e5%92%8c-qgraphicsitem">繼承自 qobject 和 qgraphicsitem</a>
<a href="#%e7%bb%a7%e6%89%bf%e8%87%aa-qgraphicsobject">繼承自 qgraphicsobject</a>
<a href="#%e6%80%a7%e8%83%bd%e5%b7%ae%e5%bc%82">性能差異</a>
這種方式屬于多繼承,也是最容易想到的方式。
qgraphicsobject 類為需要信号/槽和屬性的所有 items 提供一個基類,将 qgraphicsitem 的許多基本 setters 和 getters 映射到屬性,并為其中的許多添加了通知信号。
由于 qgraphicsobject 繼承自 qobject 和 qgraphicsitem,是以,上述的自定義 item 可以變成這樣:
這時,很多人會陷入一種誤區,認為上述兩種方式一樣,而且“繼承自 qgraphicsobject”更簡單。真的是這樣嗎?不妨分析一下!
正如上面所說,由于 qgraphicsobject 繼承自 qobject 和 qgraphicsitem,是以其擁有 qobject 和 qgraphicsitem 的基本特性。除此之外,它還提供了額外的信号,例如:enabledchanged()、opacitychanged()、xchanged()、ychanged() 等等。
也就是說,如果使用 qgraphicsobject,會有一些不感興趣的信号自動發射。例如,調用 qgraphicsitem::setpos(),會執行以下代碼:
這時,qgraphicsobject 會有額外的開銷(發射 xchanged()、ychanged() 信号)。是以,性能如何?用事實說話!
雖然上述方式均繼承自 qobject,來自 qobject 的記憶體開銷不可避免,但 qgraphicsobject 效率明顯更低,因為其有額外的信号,如果建立許多 qgraphicsobject,可能會顯着影響性能。