Есть ли способ определить, было ли перемещено окно Qt верхнего уровня?

Я пытаюсь определить, когда было перемещено главное окно моего приложения. Главное окно является стандартным QMainWindow, и мы установили фильтр событий в QApplication для поиска событий moveEvents для QMainWindow, но ни одно из них не запускается. По ряду причин создание подкласса QMainWindow на самом деле не вариант.

Буду очень признателен за любые мысли по этому поводу, кроме запуска QTimer для постоянной проверки позиции.


person Joe Corkery    schedule 29.05.2009    source источник


Ответы (2)


Я думаю, что лучше установить фильтр событий в окне верхнего уровня, а не в приложении. Однако, если вы по-прежнему не получаете QMoveEvent и работаете в Windows, вы, вероятно, можете переопределить winEventFilter() и дождаться WM_MOVE. Аналогичные функции могут быть доступны для Linux и Mac.

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

person beef2k    schedule 29.05.2009

Подклассы - действительно лучшее решение: -/

В классе, который реализует ваши окна верхнего уровня, вы просто перегружаете эту функцию:

virtual void moveEvent ( QMoveEvent * event )

Из документации:

Этот обработчик событий может быть повторно реализован в подклассе для получения событий перемещения виджета, которые передаются в параметре события. Когда виджет получает это событие, он уже находится в новой позиции.

Старая позиция доступна через QMoveEvent::oldPos().

Это должно позволить вам определить, переместилось ли ваше главное окно. Почему вы не можете создать подкласс? Вы используете экземпляр QMainWindow напрямую? Обычный вариант использования - все равно создать подкласс.

person Evan Teran    schedule 29.05.2009
comment
Интересующий класс главного окна является частью отдельно поддерживаемого набора кода и поэтому не может быть тривиально подклассом для решения этой проблемы. - person Joe Corkery; 31.05.2009