2012-02-29 34 views
8

我試圖理解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維持對象的位置。

我覺得我缺少的視圖/場景拼圖一些重要的一塊...

回答

3

從文件

如果場景RECT未設置,PySide.QtGui.QGraphicsScene將使用所有>項目的邊界區域,由PySide.QtGui.QGraphicsScene.itemsBoundingRect()返回,作爲場景矩形。

因此,它將圖像的矩形設置爲場景矩形,場景的中心位於控件的中心。

當場景矩形大於小部件大小時,將出現滾動條。當您註釋掉setSceneRect行時,您的場景會自動調整大小,但是當您的圖像被添加到scenRect的界限之後時,您將不得不更新sceneRect以顯示它。

+0

謝謝@Jeff。我注意到'setGeometry'調用在滾動條出現時也起作用。在第二個例子中,當'setGeometry'被調用,但'setSceneRect'被調用_not_時,滾動條出現。當然,如果兩個都不被調用,視圖會自動調整以適應所有項目(符合'itemsBoundingRect')。如果_both_被調用,則只顯示由'setSceneRect'定義的場景,不帶滾動條。 – XandYandZ 2012-03-01 03:53:27

1
import sys from PyQt4 import QtGui, QtCore 

class MyView(QtGui.QGraphicsView): 
    def __init__(self): 
     QtGui.QGraphicsView.__init__(self) 

     self.setGeometry(QtCore.QRect(100, 100, 600, 250)) 

     self.scene = QtGui.QGraphicsScene(self) 
     self.scene.setSceneRect(QtCore.QRectF()) 

     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_())