Developer Tales or everything about everything

16Янв/141

Перемещение окна без заголовка с помощью мыши

Что делать, если хочется сделать красивое окно с помощью всех возможностей стилизации Qt и нужно убрать стандартный каркас окна операционной системы?

С кнопками "Свернуть", "Развернуть во весь экран", "Закрыть" все ясно - просто добавляет кнопки с такой же функциональностью в QToolBar или в любое другое место в окне.

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

StackOverflow подсказывает одно из самых удачных решений, однако, автор лучшего поста не учел одну вещь: если в окне имеется QToolBar, или любая кнопка типа QPushButton, то появится неприятный баг: если нажать кнопку мыши на кнопке, и затем переместить курсор в свободную область окна, то окно начнет прыгать по экрану.

Поэтому, помимо mousePressEvent(MouseEvent*) и mouseMoveEvent(MouseEvent*), нужно добавить еще один обработчик событий: mouseReleaseEvet(QMouseEvent*).

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


Обнуление значений mpos в событии mouseReleaseEvent обеспечивает вменяемое поведение окна при нажатии на кнопки.
Просмотров: 3112