簡體   English   中英

PyQt:試圖理解圖形場景/視圖

[英]PyQt: Trying to understand graphics scene/view

我正在嘗試理解QGraphicsView和QGraphicsScene,特別是如何放置圖形項目並將它們顯示在我想要的位置。 如果場景大於觀看區域,我也會在滾動條出現時感到困惑。

例如,這段代碼將在頂角創建一個帶有橢圓的小圖形視圖:

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位置要維護的對象。

我覺得我錯過了一些重要的視圖/場景拼圖......

從文件

如果未設置場景rect,PySide.QtGui.QGraphicsScene將使用PySide.QtGui.QGraphicsScene.itemsBoundingRect()返回的所有>項的邊界區域作為場景rect。

因此,它將圖像的矩形設置為場景矩形,場景的中心是窗口小部件的中心。

當場景rect大於小部件大小時,將出現滾動條。 當您注釋掉setSceneRect行時,您的場景會自動調整大小,但是當您擁有該行時,您的圖像將被添加到scenRect的邊界scenRect因此您必須更新sceneRect以顯示它。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM