Событие PyQt4 MouseMove без MousePress - PullRequest
9 голосов
/ 20 октября 2011

Мне нужно ловить, когда пользователь перемещает мышь над графическим интерфейсом, но не когда он удерживает кнопку мыши (что может сделать что-то другое).

Я не могу найти какой-либо удобный методчтобы сделать это, за исключением периодического нахождения положения мыши и проверки ее на прежнее положение ... Что будет отстой.

MouseMoveEvent вызывается только тогда, когда мышь перемещается, пока нажата левая кнопка мыши, если толькоКонечно, виджет имеет «отслеживание мыши».Отслеживание мыши не вариант для меня, потому что графический интерфейс должен вести себя по-разному, когда мышь перемещается и левая кнопка мыши нажата.

Есть ли какие-либо встроенные методы для этого?(или просто какие-нибудь умные идеи?)

Например: есть ли способ проверить, нажата ли левая кнопка мыши в любое время?
Или событие «зависания мыши», которое можно применить кQRect (координаты)?

Muchas gracias.


Windows 7 (32)
python 2,7
PyQt4

Ответы [ 4 ]

10 голосов
/ 20 октября 2011

Самый простой способ сделать это - установить фильтр событий на 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_())
2 голосов
/ 20 октября 2011

Кажется, вы неправильно поняли, что делает mouseTracking.Это только заставляет mouseMoveEvent быть запущенным, ничего больше.Другими словами, это именно то, что вам нужно.

Проверьте кнопки события () , чтобы узнать, была ли нажата какая-либо кнопка:

Для событий перемещения мыши,это все кнопки, которые нажаты.

1 голос
/ 27 марта 2015

Как уже говорили, правильный подход, кажется, заключается в вызове 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"
1 голос
/ 20 октября 2011

сначала вызовите метод setMouseTracking (True). Тогда mouseMoveEvent будет запущен без нажатия какой-либо кнопки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...