PyQt中如何在QGraphicsView的指定(x,y)坐标处绘制矩形?
PyQt中如何在QGraphicsView的指定(x,y)坐标处绘制矩形?
嘿,我明白你的困惑啦!你遇到的问题其实是QGraphicsView默认的显示逻辑在搞鬼,绝对不是你笨哦😉
你代码里的addRect(QRectF(10,10,10,10))其实已经把矩形画在场景的(10,10)位置了,但QGraphicsView默认会把场景里的所有内容居中显示——当你的场景内容(这个10x10的小矩形)比视图小很多时,它就会自动被放到视图中心,看起来像是坐标没生效。
解决这个问题很简单,只需要调整一下视图的对齐方式,让场景的左上角和视图的左上角对应起来就行,下面给你两种可行的方案:
方案一:修改视图对齐方式
直接设置QGraphicsView的对齐属性为左上角对齐,这样场景的(0,0)就会和视图的左上角重合,你设置的(10,10)坐标就会准确显示在视图左上角往下、往右各10像素的位置:
from PyQt5.QtWidgets import QMainWindow, QApplication, QGraphicsScene from PyQt5.QtCore import Qt, QRectF import uic class Ui(QMainWindow): def __init__(self): super().__init__() uic.loadUi('Stack.ui', self) self.scene = QGraphicsScene() self.graphicsView.setScene(self.scene) # 关键:设置视图对齐方式为左上角对齐 self.graphicsView.setAlignment(Qt.AlignTop | Qt.AlignLeft) self.scene.addRect(QRectF(10,10,10,10)) app=QApplication([]) window=Ui() window.show() app.exec()
方案二:同步场景与视图大小(可选增强)
如果希望场景的范围和视图大小完全一致,避免后续调整视图大小时出现坐标偏移,可以额外设置场景的范围,甚至监听视图的大小变化来同步场景:
from PyQt5.QtWidgets import QMainWindow, QApplication, QGraphicsScene from PyQt5.QtCore import Qt, QRectF, QEvent import uic class Ui(QMainWindow): def __init__(self): super().__init__() uic.loadUi('Stack.ui', self) self.scene = QGraphicsScene() self.graphicsView.setScene(self.scene) # 设置对齐方式 self.graphicsView.setAlignment(Qt.AlignTop | Qt.AlignLeft) # 设置场景范围和视图初始大小一致 self.scene.setSceneRect(0, 0, self.graphicsView.width(), self.graphicsView.height()) self.scene.addRect(QRectF(10,10,10,10)) # 重写resizeEvent,视图大小变化时同步场景范围 def resizeEvent(self, event: QEvent): super().resizeEvent(event) self.scene.setSceneRect(0, 0, self.graphicsView.width(), self.graphicsView.height()) app=QApplication([]) window=Ui() window.show() app.exec()
这样调整后,你画的矩形就会准确出现在你指定的(10,10)位置啦!
备注:内容来源于stack exchange,提问作者M.R.
相关产品推荐
相关产品推荐

