我看到有人说是否要将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)
的前两个参数设置了坐标原点应在的位置。当“场景”小于“视图”时,如何确定场景的原点在左上角?
任何帮助将不胜感激!
答案 0 :(得分:1)
docs指出:
alignment:Qt :: Alignment
此属性保存 整个场景可见时视图中的场景。
如果整个场景在视图中可见,(即 滚动条),视图的对齐方式将决定场景的位置 在视图中呈现。例如,如果对齐方式为 Qt :: AlignCenter,默认情况下,场景将居中 视图,并且如果对齐方式是(Qt :: AlignLeft | Qt :: AlignTop),则 场景将呈现在视图的左上角。
因此,默认情况下,screctrect以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_())
说明:
要了解场景首先是什么,必须理解它是QGraphicsView和QGraphicsScene,这些概念的解释类似于电影的录制,QGraphicsView是摄像机,QGraphicsScene表示什么记录,即场景。场景由sceneRect界定,如果摄像机非常靠近场景,则不会观察到其限制,但是如果摄像机距离很远,则摄像机中的场景正投影将不会占据整个屏幕,因此要对齐到某个位置,如果使用QGraphicsView,则使用alignment属性。
如果我使用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为中心。