QGraphicsScene中Qrubberband的渲染效果不佳

时间:2017-09-08 09:50:42

标签: python pyqt pyqt5 qgraphicsview qgraphicsscene

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

1 个答案:

答案 0 :(得分:1)

根据docs

  

QPointF QGraphicsSceneMouseEvent :: scenePos()const

     

返回场景坐标中的鼠标光标位置。

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

使用的方法是screenPos()

  

QPoint QGraphicsSceneMouseEvent :: screenPos()const

     

以屏幕坐标返回鼠标光标位置。

通过以上我们获得以下代码:

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)