Spec-Zone.ru › Qt 5.9

Окна и диалоговые виджеты

Виджет, который не встроен в родительский виджет, называется окном. (Обычно окна имеют рамку и строку заголовка, хотя также можно создать окна без такой декорации с помощью соответствующих флагов окна). В Qt QMainWindow и различные подклассы QDialog являются наиболее распространёнными типами окон.

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

Основные и дополнительные окна

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

Кроме того, QWidget, имеющий родителя, может стать окном, установив флаг Qt::Window. В зависимости от системы управления окнами такие дополнительные окна обычно располагаются поверх соответствующего родительского окна и не имеют собственной записи в панели задач.

Класс QMainWindow устанавливает флаг Qt::Window в своем конструкторе, так как он предназначен для использования в качестве окна и предоставляет средства, которые не требуются для дочерних виджетов.

Главные окна и диалоги

Главное окно приложения предоставляет основу для построения основного пользовательского интерфейса приложения и создаётся путём наследования от QMainWindow. QMainWindow имеет собственное макетирование, к которому можно добавить строку меню, панели инструментов, прикрепляемые виджеты и строку состояния. Центральную область можно заполнить любым виджетом QWidget.

Диалоговые окна используются в качестве дополнительных окон, которые представляют пользователю варианты и возможности. Диалоги создаются путём наследования от QDialog и использования виджетов и макетов для реализации пользовательского интерфейса. Кроме того, Qt предоставляет ряд готовых стандартных диалогов, которые можно использовать для стандартных задач, таких как выбор файла или шрифта.

И главные окна, и диалоги можно создать с помощью Qt Designer, визуального инструмента разработки Qt. Использование Qt Designer намного быстрее, чем ручное кодирование, и упрощает тестирование различных дизайнерских идей. Визуальное создание дизайна и чтение кода, сгенерированного uic, — это отличный способ изучить Qt!

Геометрия окна

QWidget предоставляет несколько функций, которые работают с геометрией виджета. Некоторые из этих функций работают с чистой клиентской областью (то есть окном без рамки), другие включают рамку окна. Различие делается таким образом, чтобы прозрачно охватить наиболее часто используемые случаи.

  • Включая рамку окна: x(), y(), frameGeometry(), pos() и move().
  • Исключая рамку окна: geometry(), width(), height(), rect() и size().

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

На этом рисунке показано использование большинства функций:

Geometry diagram

Особенности X11

В X11 у окна нет рамки до тех пор, пока менеджер окон не украсит его. Это происходит асинхронно в какой-то момент времени после вызова QWidget::show() и первого события рисования, которое получает окно, или это вообще не происходит. Имейте в виду, что X11 не имеет политики (другие называют это гибким). Таким образом, вы не можете сделать никаких безопасных предположений о рамке декорации, которую получит ваше окно. Основное правило: всегда есть пользователь, который использует менеджер окон, нарушающий ваше предположение, и который будет жаловаться вам.

Кроме того, среда разработки не может просто размещать окна на экране. Всё, что может сделать Qt, — это отправить определённые подсказки менеджеру окон. Менеджер окон, отдельный процесс, может либо выполнить их, либо проигнорировать, либо неверно их понять. Из-за частично неясного Руководства по межклиентским соглашениям (ICCCM) размещение окон обрабатывается довольно по-разному в существующих менеджерах окон.

В X11 нет стандартного или простого способа получить геометрию рамки после того, как окно будет декорировано. Qt решает эту проблему с помощью изящных эвристик и продуманного кода, который работает с широким спектром менеджеров окон, которые существуют сегодня. Не удивляйтесь, если вы найдёте такой, в котором QWidget::frameGeometry() возвращает неправильные результаты.

Кроме того, в X11 нет способа максимизировать окно. QWidget::showMaximized() должен эмулировать эту функцию. Его результат зависит от результата QWidget::frameGeometry() и возможности менеджера окон правильно разместить окно, ни одно из которых нельзя гарантировать.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.9/application-windows.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API