没有MousePress的PyQt4 MouseMove事件

时间:2011-10-20 00:31:23

标签: python pyqt mouseevent pyqt4 mouseover

我需要在用户将鼠标移到GUI上时捕获,但不是当他们按住鼠标按钮时(这会做一些不同的事情)。

我找不到任何方便的方法来做到这一点, 除了定期找到鼠标位置并检查它以前的位置... 哪个会很糟糕。

只有在按下鼠标左键的同时移动鼠标时才会调用mouseMoveEvent, 除非当然小部件有'鼠标跟踪'。鼠标跟踪对我来说不是一个选项,因为当移动鼠标并按下鼠标左键时,GUI的行为必须不同。

有没有内置方法可以做到这一点? (或者只是任何聪明的想法?)

例如: 有没有办法检查是否在任何时候按下鼠标左键? 或者可以应用于QRect(坐标)的“鼠标悬停”事件?

Muchas gracias。


Windows 7(32)
python 2.7
PyQt4的

4 个答案:

答案 0 :(得分:10)

最直接的方法是在qApp上安装事件过滤器:

from PyQt4 import QtGui, QtCore

class Window(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        widget = QtGui.QWidget(self)
        layout = QtGui.QVBoxLayout(widget)
        self.edit = QtGui.QLineEdit(self)
        self.list = QtGui.QListWidget(self)
        layout.addWidget(self.edit)
        layout.addWidget(self.list)
        self.setCentralWidget(widget)

    def eventFilter(self, source, event):
        if event.type() == QtCore.QEvent.MouseMove:
            if event.buttons() == QtCore.Qt.NoButton:
                pos = event.pos()
                self.edit.setText('x: %d, y: %d' % (pos.x(), pos.y()))
            else:
                pass # do other stuff
        return QtGui.QMainWindow.eventFilter(self, source, event)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    win = Window()
    win.show()
    app.installEventFilter(win)
    sys.exit(app.exec_())

答案 1 :(得分:2)

似乎你误解了mouseTracking的作用。它只会导致mouseMoveEvent被解雇,没有别的。换句话说,这正是你所需要的。

检查事件的buttons()以查看是否按下了任何按钮:

  

对于鼠标移动事件,这是所有按下的按钮。

答案 2 :(得分:1)

首先调用setMouseTracking(True)方法。然后在没有按任何按钮的情况下触发mouseMoveEvent。

答案 3 :(得分:1)

正如人们所说,正确的方法似乎是在小部件上调用setMouseTracking(True)。我想补充的是,完成此操作后,您可以区分鼠标移动和鼠标拖动,如下所示:

def mouseMoveEvent(self, event):
    if event.buttons() == QtCore.Qt.NoButton:
        print "Simple mouse motion"
    elif event.buttons() == QtCore.Qt.LeftButton:
        print "Left click drag"
    elif event.buttons() == QtCore.Qt.RightButton:
        print "Right click drag"