MouseMoveEvent (), пока курсор находится на кнопке

Мне нужно активировать какую-то функцию, когда курсор движется. Итак, я использовал self.setMouseTracking (Истина) в 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()

Что делать?

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

eyllanesc 09.12.2018 15:13

Да примерно так.

Fizz Areh 09.12.2018 15:17

Да или нет??????

eyllanesc 09.12.2018 15:18

Я вызываю функцию, которая перемещает кнопки. Но какое это имеет значение?

Fizz Areh 09.12.2018 15:19

Объясните лучше, я думаю, у вас есть XY проблема, если вы хотите перемещать кнопки с помощью mouseMoveEvent. Какова ваша конечная цель: перемещать кнопки или отслеживать мышь?

eyllanesc 09.12.2018 15:21

Кнопки движутся отлично, пока курсор не касается их, но они останавливаются, когда курсор перемещается НА одну из них, из-за некоторого фильтра в функции mouseMoveEvent ().

Fizz Areh 09.12.2018 15:28

В комментариях вы говорите о перемещении кнопок, а в своем вопросе ничего об этом не говорит, вам не кажется, что это смущает? В своем вопросе вы должны четко указать, что вы хотите, а не только возможное решение, которое никто не гарантирует, что работает для того, что до сих пор предполагало, что вы хотите вызвать некоторую функцию, пока мышь находится на кнопке (предположим, что вызываемая функция работает правильно)

eyllanesc 09.12.2018 15:32

Потому что перемещение кнопок - не проблема. Я уверен, что мне не следует публиковать здесь весь код, когда мне нужно найти краткое решение в небольшом его фрагменте.

Fizz Areh 09.12.2018 15:35

попробуйте с моим вторым решением.

eyllanesc 09.12.2018 15:38
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
9
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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_())

Другие вопросы по теме