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

StackOverflow https://stackoverflow.com/questions/927043

  •  06-09-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

virtual void moveEvent ( QMoveEvent * event )

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

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

Доступ к старой позиции возможен через QMoveEvent::oldPos().

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top