我試圖理解QGraphicsView和QGraphicsScene,特別是如何放置圖形項目,並讓它們出現在我想要它們的位置。如果場景大於查看區域,我也會對滾動條的顯示時間感到困惑。PyQt:試圖瞭解圖形場景/視圖
例如,這個代碼位將創建一個小的圖形查看與在右上角的橢圓:
import sys
from PyQt4 import QtGui, QtCore
class MyView(QtGui.QGraphicsView):
def __init__(self):
QtGui.QGraphicsView.__init__(self)
self.scene = QtGui.QGraphicsScene(self)
self.scene.setSceneRect(QtCore.QRectF(0, 0, 245, 245))
self.setScene(self.scene)
self.item = QtGui.QGraphicsEllipseItem(0, 0, 60, 40)
self.scene.addItem(self.item)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
view = MyView()
view.show()
sys.exit(app.exec_())
然而,如果省略self.scene.setSceneRect(QtCore.QRectF(0, 0, 245, 245))
,則橢圓出現在中間該窗口儘管橢圓有x,y = 0,0。我不知道爲什麼!是否有這種行爲的原因?
同樣,當場景尺寸大於視圖時,我對滾動條的外觀感到困惑。例如,下面的代碼創建一個包含多個省略號的視圖/場景,並且itemsBoundingRect
大於sceneRect
。只顯示一些橢圓,但沒有滾動條來查看隱藏的橢圓,您必須增加窗口的大小。但是當你這樣做時,橢圓的位置會發生變化,所以省略橢圓的x,y。
import sys
from PyQt4 import QtGui, QtCore
class MyView(QtGui.QGraphicsView):
def __init__(self):
QtGui.QGraphicsView.__init__(self)
self.setGeometry(QtCore.QRect(100, 100, 250, 250))
self.scene = QtGui.QGraphicsScene(self)
self.scene.setSceneRect(QtCore.QRectF(0, 0, 200, 200))
self.setScene(self.scene)
for i in range(5):
self.item = QtGui.QGraphicsEllipseItem(i*75, 10, 60, 40)
self.scene.addItem(self.item)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
view = MyView()
view.show()
sys.exit(app.exec_())
如果self.scene.setSceneRect(QtCore.QRectF(0, 0, 200, 200))
行被省略,則出現滾動條。但同樣,橢圓的x,y位置被忽略,並且它們在視圖中居中。
我想要做的是:創建一個視圖,其中的項目去我想要的地方,如果項目的數量導致場景大於視圖大小,滾動條出現,但爲x, y維持對象的位置。
我覺得我缺少的視圖/場景拼圖一些重要的一塊...
謝謝@Jeff。我注意到'setGeometry'調用在滾動條出現時也起作用。在第二個例子中,當'setGeometry'被調用,但'setSceneRect'被調用_not_時,滾動條出現。當然,如果兩個都不被調用,視圖會自動調整以適應所有項目(符合'itemsBoundingRect')。如果_both_被調用,則只顯示由'setSceneRect'定義的場景,不帶滾動條。 – XandYandZ 2012-03-01 03:53:27