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