Окна и диалоговые виджеты
Виджет, не вложенный в родительский виджет, называется окном. (Обычно окна имеют рамку и строку заголовка, хотя также можно создать окна без такой декорации с помощью соответствующих флагов окна). В 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() и способности менеджера окон правильно размещать окна, ни одно из которых нельзя гарантировать.
Особенности BlackBerry
На платформе BlackBerry можно установить альтернативное окно-обложку, которое отображается при минимизации приложения. Окно-обложка должно быть отдельным окном с установленным флагом Qt::CoverWindow.
Окно должно иметь фиксированный размер, зависящий от разрешения экрана (например, для экрана 768x1280, 334 пикселя в ширину и 396 пикселей в высоту). Окно можно отрисовывать как обычно, однако обновления должны происходить очень редко (не более нескольких обновлений в минуту), чтобы экономить заряд батареи.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.6/application-windows.html