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