【问题标题】:Bad rendering of Qrubberband in QGraphicsSceneQGraphicsScene 中 Qrubberband 的错误渲染
【发布时间】:2017-09-08 09:50:41
【问题描述】:

我的 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 值的情况下正确地在场景中绘制橡皮筋?

【问题讨论】:

    标签: python pyqt pyqt5 qgraphicsview qgraphicsscene


    【解决方案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)
    

    【讨论】:

    • 不,wiyh screenPos 我在整个屏幕上都得到了一个 qrubberband。 scenePos 是我想要的,然后我制作了一个裁剪图像,就可以了。 pb是渲染没有跟随鼠标光标(?)
    • 似乎,好的(我重新实现了我的信号等以裁剪表格等中的选择......)。最后 pb (:p),qrubberband 是 0% 透明的,而它之前是半透明的(我在橡皮筋矩形下看不到任何东西)......我想我可以用专门的方法修复它,但这很奇怪。无论如何,非常感谢屏幕和场景位置
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 2019-11-02
    • 2013-04-16
    相关资源
    最近更新 更多