@Molodoy42

Почему конструкция if не происходит в событие PyQt?

Нужно написать программу на PyQt, чтобы при наведении курсора на кнопку, она исчезала и появлялась в другом случайном месте. В событие mouseMoveEvent есть if конструкция, которая происходит только при зажатой кнопки на мышке, хотя отслеживание мышки включено. В чем проблема? Почему при просто наведении, без зажатой кнопки, if конструкция не происходит?
import sys
from random import randrange
from PyQt5.QtWidgets import QWidget, QApplication, QPushButton


class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(300, 300, 600, 600)
        self.btn = QPushButton(self)
        self.btn.setText('Нажми меня')
        self.btn.resize(100, 50)
        self.btn.move(250, 250)
        self.btn_x = 250
        self.btn_y = 250
        self.setMouseTracking(True)

    def mouseMoveEvent(self, event):
        if self.btn_x < event.x() < self.btn_x + 100 and self.btn_y < event.y() < self.btn_y + 50:
            self.btn_x, self.btn_y = randrange(500), randrange(500)
            self.btn.move(self.btn_x, self.btn_y)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    wnd = Window()
    wnd.show()
    app.exit(app.exec())
  • Вопрос задан
  • 70 просмотров
Решения вопроса 1
@Andy_U
Добавьте в код mouseMoveEvent() первой строкой:

print(event.x(), event.y(), self.btn_x < event.x() < self.btn_x + 100, self.btn_y < event.y() < self.btn_y + 50)


и убедитесь, что пока вы водите мышкой над окном, в консоль идут строчки с выводом, а как мышка оказывается над кнопкой, так сразу перестают. Кнопка начинает мышку отслеживать...

Если добавьте в __init__ строчку:

self.btn.setMouseTracking(True)

то все заработает.

P.S. Но кнопку все еще можно tab'ом выбрать и на Enter нажать...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы