Мне нужно активировать какую-то функцию, когда курсор движется. Итак, я использовал 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()
Что делать?
Да примерно так.
Да или нет??????
Я вызываю функцию, которая перемещает кнопки. Но какое это имеет значение?
Объясните лучше, я думаю, у вас есть XY проблема, если вы хотите перемещать кнопки с помощью mouseMoveEvent. Какова ваша конечная цель: перемещать кнопки или отслеживать мышь?
Кнопки движутся отлично, пока курсор не касается их, но они останавливаются, когда курсор перемещается НА одну из них, из-за некоторого фильтра в функции mouseMoveEvent ().
В комментариях вы говорите о перемещении кнопок, а в своем вопросе ничего об этом не говорит, вам не кажется, что это смущает? В своем вопросе вы должны четко указать, что вы хотите, а не только возможное решение, которое никто не гарантирует, что работает для того, что до сих пор предполагало, что вы хотите вызвать некоторую функцию, пока мышь находится на кнопке (предположим, что вызываемая функция работает правильно)
Потому что перемещение кнопок - не проблема. Я уверен, что мне не следует публиковать здесь весь код, когда мне нужно найти краткое решение в небольшом его фрагменте.
попробуйте с моим вторым решением.






Если вы хотите определять положение мыши, даже когда мышь находится над дочерним элементом, возможный вариант - использовать фильтр событий.
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_())
вы можете предоставить минимальный воспроизводимый пример, насколько я понимаю, у вас есть окно, в котором есть несколько виджетов, таких как QPushButton, QLineEdit и т.д., а затем вы хотите получить позицию, даже когда есть кнопка под мышью. Я не ошибаюсь?