2012-02-29 4 views
8

QGraphicsViewとQGraphicsSceneの意味を理解しようとしています。具体的にはグラフィックアイテムを配置し、私はまた、シーンが表示領域よりも大きい場合にスクロールバーが表示されることについて混乱します。PyQt:グラフィックのシーン/ビューを理解しようとしています

例えば、コードのこのビットは小さなグラフィック上隅に楕円で表示、作成されます:self.scene.setSceneRect(QtCore.QRectF(0, 0, 245, 245))が省略されている場合、

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

しかし、次に楕円は、中央に表示され楕円がx、y = 0,0を持っていても、ウィンドウが表示されます。理由は分かりません!この行動の理由はありますか?

同様に、シーンのサイズがビューよりも大きい場合は、スクロールバーの表示が混乱します。たとえば、次のコードでは、いくつかの省略記号を含むビュー/シーンが作成され、itemsBoundingRectsceneRectよりも大きくなります。いくつかの楕円のみが表示されますが、隠れたものを見るためのスクロールバーはありません。ウィンドウのサイズを大きくする必要があります。しかし、そうすると、楕円の配置がシフトするので、楕円の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()がシーンrectとして返す、すべての>項目の境界領域です。

画像の矩形をシーンの矩形として設定し、シーンの中心がウィジェットの中心になります。

シーン矩形がウィジェットサイズより大きい場合、スクロールバーが表示されます。 setSceneRectラインをコメントアウトすると、シーンのサイズが自動的に変更されますが、ラインがある場合、画像はの境界を超えて追加されますので、sceneRectを更新する必要があります。

+0

ありがとう@Jeff。私は 'setGeometry'コールがスクロールバーが現れる時にも役割を果たしていることに気付きました。 2番目の例では、 'setGeometry'が呼び出されたときにスクロールバーが表示されますが、' setSceneRect'は呼び出されません。当然、どちらも呼び出されなければ、ビューは自動的にすべての項目に適合するように調整されます( 'itemsBoundingRect'に従います)。 _both_が呼び出されると、 'setSceneRect'で定義されたシーンだけが表示され、スクロールバーはありません。 – XandYandZ

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_()) 
関連する問題