gpt4 book ai didi

python - QGraphicsScene 中 Qrubberband 的渲染错误

转载 作者:太空宇宙 更新时间:2023-11-03 14:47:50 26 4
gpt4 key购买 nike

我的 q qrubberband 显示效果不好,认为想要的坐标没问题:

class Viewer(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()

self.graphicsView = QtWidgets.QGraphicsView()
self.hbox = QtWidgets.QVBoxLayout()
self.scene = Scene(self)
self.splitter = QtWidgets.QSplitter()
self.splitter.addWidget(self.graphicsView)
self.widget.setLayout(self.hbox)
self.setCentralWidget(self.widget)

我在场景中加载像素图:

def open_picture(self):
self.scene.setSceneRect(0, 0, self.pixmap.width(), self.pixmap.height())
self.scene.addPixmap(self.pixmap)
self.graphicsView.setScene(self.scene)
self.graphicsView.show()

我的场景继承自 QGraphicsScene,主要处理场景上的 qrubberband

class Scene(QtWidgets.QGraphicsScene):

def __init__(self, parent=None):
super(Scene, self).__init__(parent)

def mousePressEvent(self, event):
self.originQPoint = event.scenePos()
self.originQPoint = self.originQPoint.toPoint()
self.currentQRubberBand = QtWidgets.QRubberBand(QtWidgets.QRubberBand.Rectangle)

def mouseMoveEvent(self, event):
self.currentQRubberBand.setGeometry(QtCore.QRect(self.originQPoint, event.scenePos().toPoint()).normalized())
self.currentQRubberBand.show()

def mouseReleaseEvent(self, event):
print(self.items)
self.currentQRubberBand.hide()
self.currentQRect = self.currentQRubberBand.geometry()
print(self.currentQRect)

我的问题是矩形显示在我的笔记本电脑的屏幕上,但坐标没问题(场景坐标)如何在不更改 self.currentQRect 值的情况下正确绘制场景中的橡皮筋? enter image description here

最佳答案

根据docs :

QPointF QGraphicsSceneMouseEvent::scenePos() const

Returns the mouse cursor position in scene coordinates.

从上面我们可以得出结论,我们得到的点是相对于场景而不是屏幕的,所以这不是我们想要的。

使用方法是screenPos() :

QPoint QGraphicsSceneMouseEvent::screenPos() const

Returns the mouse cursor position in screen coordinates.

通过上述我们得到以下代码:

class Scene(QtWidgets.QGraphicsScene):
def __init__(self, parent=None):
super(Scene, self).__init__(parent)

def mousePressEvent(self, event):
self.originQPoint = event.screenPos()
self.currentQRubberBand = QtWidgets.QRubberBand(QtWidgets.QRubberBand.Rectangle)
self.originCropPoint = event.scenePos()

def mouseMoveEvent(self, event):
self.currentQRubberBand.setGeometry(QtCore.QRect(self.originQPoint, event.screenPos()))
self.currentQRubberBand.show()

def mouseReleaseEvent(self, event):
self.currentQRubberBand.hide()
currentQRect = self.currentQRubberBand.geometry()
self.currentQRect = QtCore.QRect(self.originCropPoint.toPoint(), event.scenePos().toPoint())
print(self.currentQRect)

关于python - QGraphicsScene 中 Qrubberband 的渲染错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46113608/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com