Spec-Zone.ru › Qt 6.1

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

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

Spec-Zone.ru

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