簡體   English   中英

PyQt5:我無法理解 QGraphicsScene 的 setSceneRect(x, y, w, h)

[英]PyQt5: I can't understand QGraphicsScene's setSceneRect(x, y, w, h)

我看到有人說如果你想把QGraphicsScene的坐標原點放在QGraphicsView的原點,即左上角。 您需要讓它們具有相同的大小。

所以這就是我要做的:

import sys
from PyQt5.QtWidgets import QApplication, QGraphicsLineItem, 
QGraphicsScene, QGraphicsView


class Demo(QGraphicsView):
    def __init__(self):
        super(Demo, self).__init__()
        self.resize(300, 300)

        self.line = QGraphicsLineItem()
        self.line.setLine(0, 0, 100, 100)

        self.scene = QGraphicsScene()
        self.scene.setSceneRect(0, 0, 300, 300)
        self.scene.addItem(self.line)

        self.setScene(self.scene)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

視圖的大小是 300x300,我使用setSceneRect()來確保場景的大小是 300x300。

在這種情況下,場景的原點位於左上角。 在此處輸入圖片說明

但是,當我使用setSceneRect(0, 0, 150, 150) ,原點不在那里,而是在 (75, 75) 處! 在此處輸入圖片說明

為什么? 我認為setSceneRect(x, y, w, h)的前兩個參數設置了坐標原點應該在哪里。 當 Scene 小於 View 時,我們如何確保 Scene 的原點在左上角?

任何幫助,將不勝感激!

正如文檔指出的那樣:

對齊:Qt::對齊

當整個場景可見時,此屬性保持視圖中場景的對齊方式。

如果整個場景在視圖中可見(即沒有可見的滾動條),視圖的對齊方式將決定場景在視圖中的渲染位置。 例如,如果對齊方式是Qt::AlignCenter,這是默認的,場景將在視圖中居中,如果對齊方式是(Qt::AlignLeft | Qt::AlignTop),場景將在頂部渲染- 視圖的左角。

因此,默認情況下,scenerect 以 QGraphicsView 的視口為中心,並且在具有相同大小的情況下,觀察到您指出的行為,但在第二種情況下,居中的屬性被突出顯示。

所以解決方案是建立對齊:

import sys
from PyQt5.QtWidgets import QApplication, QGraphicsLineItem, QGraphicsScene, QGraphicsView
from PyQt5.QtCore import Qt

class Demo(QGraphicsView):
    def __init__(self):
        super(Demo, self).__init__()
        self.resize(300, 300)

        self.line = QGraphicsLineItem()
        self.line.setLine(0, 0, 100, 100)

        self.scene = QGraphicsScene()
        self.scene.setSceneRect(0, 0, 150, 150)
        self.scene.addItem(self.line)

        self.setScene(self.scene)
        self.setAlignment(Qt.AlignTop | Qt.AlignLeft)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

在此處輸入圖片說明


解釋:

首先要了解scenerect是什么,首先要明白它是QGraphicsView和QGraphicsScene,這兩個概念用一個電影錄制的類比來解釋,QGraphicsView就是相機,QGraphicsScene代表錄制的內容,即現場。 場景由sceneRect 分隔,如果相機離場景很近,則不會觀察到它的界限,但是如果相機離得很遠,相機中的scenerect 投影不會占據整個屏幕,所以會有要在某個位置對齊,在 QGraphicsView 的情況下使用對齊屬性。


如果我使用 setSceneRect(50, 50, 150, 150),為什么場景不再在視圖中居中?

為了回答我使用以下示例,我使用 QGraphicsRectItem 使 Scenerect 可見:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class Demo(QtWidgets.QGraphicsView):
    def __init__(self):
        super(Demo, self).__init__()
        self.resize(300, 300)

        self.line = QtWidgets.QGraphicsLineItem()
        self.line.setLine(0, 0, 100, 100)

        self.scene = QtWidgets.QGraphicsScene()
        self.scene.setSceneRect(50, 50, 150, 150)
        self.scene.addItem(self.line)
        rect_item = self.scene.addRect(QtCore.QRectF(50, 50, 150, 150))
        rect_item.setPen(QtGui.QPen(QtGui.QColor("green")))

        self.setScene(self.scene)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

在此處輸入圖片說明

正如你所看到的,對齊不是關於 QRectF(0, 0, w, h) 而是 QRectF(x, y, w, h) 的中心,在這種情況下是 (100,100)。 所以保持以 QGraphicsView 中的 sceneRect 為中心。

暫無
暫無

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

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