2010-11-07 76 views
2

我正在第一次使用QGraphicsView/Scene。這是在PyQt中,但除了Python與多繼承不同之外,我認爲這是一個通用的Qt問題。QGraphicsWidget與QGraphicsLayoutItem

我開始時創建了幾個QGraphicsItem重載作爲構建塊。一旦我按照我想要的方式工作,我想嘗試將它們結合起來,並且發現我無法使用QGraphicsLayouts中的令人不愉快的驚喜。這是由於QGraphicsLayouts採用從QGraphicsLayoutItem繼承的項目,而QGraphicsItems由QGraphicsLayoutItems繼承,QGraphicsLayoutItems繼承了QGraphicsWidgets。

有一個QGraphicsItem/QGraphicsWidget的graphicsItem屬性,但看着代碼,我不認爲我可以分配我的物品到這個屬性,並讓他們正常工作。我確實發現了this example,但奇怪的是它有兩個類都繼承的例子。我很困惑。

所以我試圖找到讓我的項目在佈局中工作的最簡單的方法。有沒有比重寫和繼承這兩個類更容易的方法嗎?

第二個問題,是否應該從QGraphicsWidget繼承,還是從QGraphicsLayoutItem繼承?

用於說明何時使用sizeHint vs. boundingRect的額外功勞。

感謝幫助, 佈雷特

回答

3

得到的佈局工作項目的最簡單的方法是改變繼承QGraphicsWidget並覆蓋setGeometry()和sizeHint()方法。應該是一個簡單的改變,因爲你的項目通過繼承祖先仍然是QGraphicsItems。

Qt Graphics View框架設計得儘可能輕便。因此,組裝具有不同能力的物品有很多選擇。如果佈局中的項目大小不是問題,則可以從QGraphicsWidget繼承。否則,從QGraphicsLayoutItem繼承(除非你需要QGraphicsWidget的額外功能)。既然你不能乘以PyQt類的繼承,你將不得不使用合成來創建一個由QGraphicsLayoutItem控制的項目,就像你引用的例子。

場景使用boundingRect()方法來管理項目。 sizeHint()方法由佈局使用來確定佈局項目的大小。 shape()方法被場景用來更精確地確定項目的位置(用於碰撞,命中測試等)。

+0

你能詳細說一下嗎?我的問題是,如果我從QGraphicsItem繼承,我必須覆蓋boundingRect。但是如果我從QGraphicsWidget繼承,我不會。即使QGraphicsWidget從QGraphicsItem繼承。所以顯然是一個非抽象的實現。看起來(對我來說)sizeHint,setGeometry和boundingRect都是耦合的。爲了解釋您的答案,在我看來,boundingRect()和sizeHint()都是「由場景用來管理項目」。 – 2010-11-09 05:40:59

+0

是的,sizeHint,setGeometry和boundingRect是耦合的,因爲它們都與小部件的大小和位置有關。 sizeHint告訴佈局小部件想要的大小。 setGeometry是佈局如何告訴小部件它應該是的大小。 boundingRect是小部件告訴場景它是多大的。 QGraphicsScene不使用sizeHint()。它只用於QGraphicsLayout(和相關的類)。 – baysmith 2010-11-10 20:16:08