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を持っていても、ウィンドウが表示されます。理由は分かりません!この行動の理由はありますか?
同様に、シーンのサイズがビューよりも大きい場合は、スクロールバーの表示が混乱します。たとえば、次のコードでは、いくつかの省略記号を含むビュー/シーンが作成され、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'コールがスクロールバーが現れる時にも役割を果たしていることに気付きました。 2番目の例では、 'setGeometry'が呼び出されたときにスクロールバーが表示されますが、' setSceneRect'は呼び出されません。当然、どちらも呼び出されなければ、ビューは自動的にすべての項目に適合するように調整されます( 'itemsBoundingRect'に従います)。 _both_が呼び出されると、 'setSceneRect'で定義されたシーンだけが表示され、スクロールバーはありません。 – XandYandZ