LINUX.ORG.RU

mouseMoveEvent не всегда работает (eventFilter вообще не работает), как отслеживать мышь?

 , ,


0

1

Задача - отслеживать мышь у множества QWidget-ов (вешается декоратор на mouseMoveEvent и делает свои дела). Проблема в том, что ивент срабатывает только над голой формой. А есть такие виджеты, где какой-то элемент занимает всю форму, поэтому ивент не работает вообще. Насколько я понял, единственный вариант - ловить eventFilter. Но он не работает совсем. Так каким способом ловить мышь? Что я делаю не так? Вот пример с eventFilter, который не работает:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import QObject


class MyFilter(QObject):
    def eventFilter(self, obj, event):
        print(str((obj, event)))
        return False


class MainWidget(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.installEventFilter(MyFilter())


app = QApplication(sys.argv)
main = MainWidget()
main.show()
sys.exit(app.exec())
То, что тут MainWidget, не принципиально. Пробовал вешать на QWidget, на элементы внутри QWidget - всё бесполезно.

★★★★★

Ответ на: комментарий от ox55ff
class MainWidget(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setMouseTracking(True)
        self.installEventFilter(MyFilter())

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

InterVi ★★★★★
() автор топика
Ответ на: комментарий от InterVi

Ты не тому виджету устанавливаешь свойство и фильтр. Вот так у меня работает:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setMouseTracking(true);
    this->centralWidget()->setMouseTracking(true);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    qDebug() << event->x() << event->y();
}

ox55ff ★★★★★
()
Последнее исправление: ox55ff (всего исправлений: 1)
Ответ на: комментарий от ox55ff

А если нет этого центрального виджета? И setCentralWidget - не вариант, ибо предполагается, что будут использоваться сторонние виджеты, разрабам которых на всё плевать. Нужно наиболее универсальное решение. К тому же, в моём примере mouseMoveEvent будет работать, форма-то пустая. А вот eventFilter не работает.

Traceback (most recent call last):
  File "event_filter.py", line 20, in <module>
    main = MainWidget()
  File "event_filter.py", line 15, in __init__
    self.centralWidget().setMouseTracking(True)
AttributeError: 'NoneType' object has no attribute 'setMouseTracking'

InterVi ★★★★★
() автор топика
Ответ на: комментарий от InterVi

А если нет этого центрального виджета?

Определи, что у тебя на переднем плане и цепляй к этому виджету фильтр и ставь свойство. Я у себя создал проект и у меня на переднем плане был centralWidget. Что у тебя я не знаю.

ox55ff ★★★★★
()
Ответ на: комментарий от InterVi

Ты неправильно устанавливаешь фильтр. Нашёл ответ на SO, сам я в питоне ноль и не знаю почему так:

self.filter = MyFilter()
self.installEventFilter(self.filter)

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Ох, почему-то у меня всегда проблемы смешные оказываются. Я тоже видел тот ответ, но не обратил внимание. Дело вот в чём: если где-нибудь не сохранить фильтр, он выносится gc. Я его ставлю, он уничтожается, и конечно же не срабатывает. Хотя я думал, что фильтр должен хранится где-то в потрохах Qt, куда там его засовывает installEventFilter. Теперь всё работает.

А как получить центральный виджет, если он не установлен через setCentralWidget? Просто, для развития.

InterVi ★★★★★
() автор топика
Ответ на: комментарий от InterVi

А как получить центральный виджет, если он не установлен через setCentralWidget? Просто, для развития.

self.centralWidget()
Но у тебя его нет. Он у меня есть, потому что мастер в QtCreator по умолчанию так создаёт форму. Там у меня ещё барахло автоматом добавляется: меню и строка состояния.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Всё, проблема полностью решена. В топку move и фильтр, оказывается enterEvent прекрасно работает и его мне достаточно.

InterVi ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.