Developer Tales or everything about everything

16Янв/143

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

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

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

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

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

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

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

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

Просмотров: 3378
Комментарии (3) Пинги (0)
  1. Спасибо за статью , очень помогла!)http://microfork.com/wp-content/plugins/wp-monalisa/icons/wpml_good.gif

  2. а как сделать, что бы когда он в максимально размере при переносе он стал в размер showNormal(); и как сделать так, что бы мышка работала на menuBar, что бы типа верхняя полоска могла только переносить, а не весь виджет?

    • По первому вопросу: в mousePressEvent выясняете, является ли окно Maximized, если да, то для окна нужно вызвать setWindowState(Qt.WindowNoState)
      По второму вопросу: тут нужно в том же mousePressEvent смотреть, в какой области произошло нажатие на кнопку мыши.


Leave a comment


7 × = двадцать один

http://microfork.com/wp-content/plugins/wp-monalisa/icons/wpml_bye.gif 
http://microfork.com/wp-content/plugins/wp-monalisa/icons/wpml_good.gif 
http://microfork.com/wp-content/plugins/wp-monalisa/icons/wpml_negative.gif 
http://microfork.com/wp-content/plugins/wp-monalisa/icons/wpml_scratch.gif 
http://microfork.com/wp-content/plugins/wp-monalisa/icons/wpml_wacko.gif 
http://microfork.com/wp-content/plugins/wp-monalisa/icons/wpml_yahoo.gif 
http://microfork.com/wp-content/plugins/wp-monalisa/icons/wpml_cool.gif 
http://microfork.com/wp-content/plugins/wp-monalisa/icons/wpml_heart.gif 
http://microfork.com/wp-content/plugins/wp-monalisa/icons/wpml_rose.gif 
http://microfork.com/wp-content/plugins/wp-monalisa/icons/wpml_smile.gif 
http://microfork.com/wp-content/plugins/wp-monalisa/icons/wpml_whistle3.gif 
http://microfork.com/wp-content/plugins/wp-monalisa/icons/wpml_yes.gif 
http://microfork.com/wp-content/plugins/wp-monalisa/icons/wpml_cry.gif 
http://microfork.com/wp-content/plugins/wp-monalisa/icons/wpml_mail.gif 
http://microfork.com/wp-content/plugins/wp-monalisa/icons/wpml_sad.gif 
http://microfork.com/wp-content/plugins/wp-monalisa/icons/wpml_unsure.gif 
http://microfork.com/wp-content/plugins/wp-monalisa/icons/wpml_wink.gif 
 

Trackbacks are disabled.