mouseMoveEvent (), когда курсор находится на кнопке - PullRequest
0 голосов
/ 09 декабря 2018

Мне нужно активировать какую-то функцию, когда курсор движется.Итак, я использовал self.setMouseTracking (True) в MainWidget.Но таким образом mouseMoveEvent () работает только тогда, когда под курсором есть пустая форма.Я попытался создать другой виджет поверх основного, но он не работает вообще.

class ClickButton(QPushButton):
    def __init__(self, text, window):
        ...

    def run(self):
        ...

class Window(QWidget):
    def __init__(self):
        super().__init__() 
        self.setGeometry(0, 0, 1000, 1000)
        self.setMouseTracking(True)
        self.clickers = [ClickButton('OK', self) for i in range(8)]

    def mouseMoveEvent(self, ev):
        for e in self.clickers:
            e.run()

Что делать?

1 Ответ

0 голосов
/ 09 декабря 2018

Если вы хотите определить положение мыши, даже если мышь находится над дочерним элементом, возможный вариант - использовать фильтр событий.

from PyQt5 import QtCore, QtGui, QtWidgets

class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        w_ = QtWidgets.QWidget()
        lay_w = QtWidgets.QHBoxLayout(w_)
        for c in (QtWidgets.QPushButton(), QtWidgets.QLineEdit()):
            lay_w.addWidget(c)

        lay = QtWidgets.QVBoxLayout(self)
        for w in (QtWidgets.QPushButton(), QtWidgets.QLineEdit(), QtWidgets.QTextEdit(), w_):
            lay.addWidget(w)

        for ws in self.findChildren(QtWidgets.QWidget) + [self]:
            ws.setMouseTracking(True)
            ws.installEventFilter(self)

    def eventFilter(self, obj, event):
        if event.type() == QtCore.QEvent.MouseMove:
            p_respect_to_window = self.mapFromGlobal(obj.mapToGlobal(event.pos()))
            print(p_respect_to_window)
        return super(Widget, self).eventFilter(obj, event)


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

С другой стороныесли вы хотите сделать это только в одном типе пользовательского виджета, лучше переписать метод mouseMoveEvent пользовательского виджета:

from PyQt5 import QtCore, QtGui, QtWidgets

class ClickButton(QtWidgets.QPushButton):
    def __init__(self, text, parent=None):
        super(ClickButton, self).__init__(text=text, parent=parent)
        self.setMouseTracking(True)

    def mouseMoveEvent(self, event):
        self.run()
        super(ClickButton, self).mouseMoveEvent(event)

    def run(self):
        print("call to run function in button{} and time: {}".format(self.text(), 
            QtCore.QDateTime.currentDateTime().toString()))

class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        lay = QtWidgets.QVBoxLayout(self)
        for i in range(10):
            w = ClickButton(str(i), self)
            lay.addWidget(w)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...