PySide:计算自上次调用mouseMoveEvent函数以来x轴和y轴的移动量

时间:2015-01-02 20:21:11

标签: python pyside

我是Pyside的新手,我需要计算自上次调用 mouseMoveEvent 函数以来x和y轴的移动量

想法是获得鼠标(A)和当前位置(B)的先前位置。我们计算从A开始到B

结束的向量

我的问题如下:QMouseEvent没有lastPos()函数,而是pos()函数。因此,我无法获得鼠标的上一个位置(最后记录的位置是创建事件的视图接收的上一个鼠标事件的位置)

在Pygame中,这被称为 pygame.mouse.get_rel()。我怎样才能做到这一点 ?

下面是一个示例代码,用于在按下和移动时打印鼠标的当前位置

 # -*- coding: utf-8 -*-
import sys
from PySide import  QtGui

class Frame(QtGui.QFrame):

    def __init__(self, (width, height)):
        super(Frame, self).__init__()

        self.setGeometry(0, 0, width, height)
        self.setWindowTitle('Frame')
        self.show()
        self.loop()

    def loop(self):
        while 1:
            self.update()
            QtGui.QApplication.processEvents()

    def mouseMoveEvent(self, event):
        # Get the current position of the mouse
        x, y = event.x(), event.y()
        print (x, y)


def main():
    app = QtGui.QApplication(sys.argv)
    Frame((500, 500))
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:0)

我无法在没有PySide的情况下对此进行测试,我目前无法安装,但我认为你想要这样的东西(阅读NOTE1NOTE2):

import sys
from PySide import  QtGui

class Frame(QtGui.QFrame):

    def __init__(self, (width, height)):
        super(Frame, self).__init__()

        # NOTE1: indicate if mouse was clicked
        self.clicked= False

        self.setGeometry(0, 0, width, height)
        self.setWindowTitle('Frame')
        self.show()
        self.loop()

    def loop(self):
        while 1:
            self.update()
            QtGui.QApplication.processEvents()

    def mouseMoveEvent(self, event):
        # Get the current position of the mouse
        x, y = event.x(), event.y()
        print (x, y)

    def mousePressEvent(self, event):
        # NOTE 2: track clicks, not movements
        if self.clicked:
            # calculate vector
            vector = ((self.x, self.y,), (event.x(), event.y(),))
            print "vector: %s" % str(vector)
            self.clicked = False
            return vector
        # set vector start
        self.x = event.x()
        self.y = event.y()
        self.clicked = True
        print "vector set to start from: (%d,%d)" % (self.x, self.y)
        return None

def main():
    app = QtGui.QApplication(sys.argv)
    Frame((500, 500))
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

这样您就可以设置从第一次点击到第二次的矢量,每次鼠标点击都会启动矢量。这可能有一些错误,但这个想法很清楚。如果您希望鼠标跟踪移动而不是单击,请应用相同的原则(在子类中存储最后一个位置,设置标志以查看是否应该计算向量...)到mouseMoveEvent

我以后会在我的电脑上测试它。