Окна и диалоговые виджеты
Виджет, не вложенный в родительский виджет, называется окном. (Как правило, окна имеют рамку и строку заголовка, хотя также возможно создание окон без такой декорации с помощью соответствующих флагов окна). В 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().
Обратите внимание, что различие имеет значение только для декорированных виджетов верхнего уровня. Для всех дочерних виджетов геометрия рамки равна геометрии клиентской области виджета.
На этом рисунке показано использование большинства функций:
Особенности 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/archives/qt-5.11/application-windows.html