将QmouseEvent转换为QGraphicsSceneMouseEvent以实现拖动动作

1 投票
1 回答
1826 浏览
提问于 2025-04-17 13:54

我想移动QGraphicsScene,而不是移动整个小部件(因为这样会导致一些图形上的问题,因为小部件移动到了边界之外)。

这是我尝试做的:

def mousePressEvent(self, event):
    #super(SvgView, self).mousePressEvent(event)

    self.svgItem.mousePressEvent(event)

    self.x += event.pos().x()
    self.y += event.pos().y()
    event.accept()

(注意,我没有正确更新self.x和self.y,因为这是一个“拖动”动作,我应该使用“增量”来代替,但我不知道怎么获取这个增量)

这样做不行,因为svgItem需要一个QGraphicsSceneMouseEvent事件。

我尝试在场景上处理这个鼠标事件,而不是在QGraphicsView上处理,但这样并不能让物体拖动。

有没有办法在不进行转换的情况下做到这一点?如果必须转换的话,我该怎么做呢?

1 个回答

1

对我来说,SVG加上JavaScript非常容易理解,利用它我可以做任何我想做的事情。不过,我在使用PyQt开发桌面应用时遇到了一些困难。Avaris帮我理解了Qt中事件传播的一些内容。

我写了几行代码来做实验,也许对你有帮助。虽然不是最好的,但“即使如此,它还是在动”:

from PySide import QtGui, QtCore

class View(QtGui.QGraphicsView): # as separate class
    def BlahBlah():
        print dir()

class Scene_w_ellipse(QtGui.QGraphicsScene):
    def __init__(self):
        super(Scene_w_ellipse, self).__init__()
        self.setSceneRect(0,0,300,200)
        self.C = QtGui.QGraphicsEllipseItem(-4,-20,80,40)
        self.C.setPos(100,70)
        self.C.setFlags(QtGui.QGraphicsItem.ItemIsMovable)
        #self.C.mousePressEvent(QtGui.QGraphicsSceneMouseEvent)
        self.addItem(self.C)

    def mousePressEvent(self, event):
        print dir()

    def mouseMoveEvent(self, event):
        self.C.mouseMoveEvent(event)

    def mouseReleaseEvent(self, event):
        self.C.mouseReleaseEvent(event)

关于你的背景,不要去继承类,而是把它作为一个独立的类来构建。

撰写回答