Spec-Zone.ru › Qt 5.13

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

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

Spec-Zone.ru

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