Краткое описание
Прежде чем делиться всеми базовыми знаниями, необходимо представить здесь широко используемые windows-QWidget, QDialog, QMainWindow.
Студенты, знакомые с Qt, должны знать, что они будут встречаться при выборе информации о классе для новых проектов Qt Widgets. Да, это совпадение, что они могут встречаться каждый раз. Поэтому в будущем развитии Qt мы будем часто иметь с ними дело. Как говорится, знание себя и знание друг друга означает, что вы не будете поражены. Только поняв их и познакомившись с ними, мы сможем лучше их контролировать. , ,
QWidget наследует от QObject и QPaintDevice, QDialog и QMainWindow наследуют от QWidget, и между QDialog и QMainWindow нет прямой связи. Озорные маленькие друзья из горшочка снова расстроены, они явно принадлежат одному отцу, то есть отношения брат-сестра O (∩_∩) O ха-ха-ха
QWidget
Класс QWidget является базовым классом для всех объектов пользовательского интерфейса.
Виджет является атомом пользовательского интерфейса: он получает мышь, клавиатуру и другие события из оконной системы и рисует свое собственное представление на экране. Каждый виджет является прямоугольным, и они расположены в порядке оси Z. Виджет может быть частично покрыт его родительским виджетом или виджетом перед ним.
QWidget имеет много функций-членов, но некоторые из них имеют несколько прямых функций: например, QWidget имеет атрибуты шрифта, но он никогда не используется сам по себе. Предоставляет практические функции для многих подклассов, которые его наследуют, таких как QLabel, QPushButton, QCheckBox и так далее.
Виджет без родительской формы всегда является отдельным окном (виджет верхнего уровня). Не виджеты виджеты являются дочерними виджетами, которые отображаются в родительском окне. Большинство компонентов в Qt в основном используются в качестве подкомпонентов. Например, кнопка может отображаться как окно верхнего уровня, но большинство людей предпочитают, чтобы кнопка была встроена в другие виджеты, такие как QDialog.

На рисунке выше показан QGroupBox, который содержит большое количество дочерних элементов управления, размеченных QGridLayout.
QMainWindow
Класс QMainWindow предоставляет главное окно приложения с панелью меню, панелью инструментов и строкой состояния (например: IDE-Visual Studio, Qt Creator и т. Д., Которые обычно используются для разработки Qt).
Главное окно предоставляет структуру пользовательского интерфейса для создания приложений. Qt имеет QMainWindow и связанные с ним классы для управления главным окном.
QMainWindow имеет свой собственный макет. Мы можем использовать QMenuBar (строка меню), QToolBar (панель инструментов), QStatusBar (строка состояния) и QDockWidget (плавающее окно). Макет имеет центральную область, которая может быть занята любым небольшим окном.

QDialog
Класс QDialog является базовым классом для диалоговых окон.
Диалоговое окно представляет собой форму верхнего уровня, которая в основном используется для краткосрочных задач и краткого общения с пользователями. QDialog может быть модальным или немодальным. QDialog поддерживает расширяемость и может предоставлять возвращаемые значения. Они могут иметь кнопки по умолчанию. QDialog также может иметь QSizeGrip в правом нижнем углу, используя setSizeGripEnabled ().
Примечание: QDialog (и другие виджеты, которые используют типы Qt :: Dialog) используют родительские виджеты немного иначе, чем другие классы в Qt. Диалоговое окно всегда является виджетом верхнего уровня, но если у него есть родительский объект, его позиция по умолчанию находится в середине родительского объекта. Он также поделится записями панели инструментов с родительским объектом.
Модальный диалог
Диалоговое окно, которое блокирует ввод из других видимых окон в том же приложении. Модальное диалоговое окно имеет собственный цикл обработки событий. Пользователь должен завершить взаимодействие в этом диалоговом окне и закрыть его, прежде чем получить доступ к любым другим окнам в приложении. Модальное диалоговое окно блокирует доступ только к окну, связанному с беседой, позволяя пользователям продолжать использовать приложения в других окнах.
Наиболее распространенным способом отображения модального диалога является вызов его функции exec (). Когда пользователь закрывает диалог, exec () предоставит полезное возвращаемое значение, и управление потоком затем продолжится с того места, где был вызван exec (). Обычно, чтобы закрыть диалоговое окно и вернуть соответствующее значение, мы подключаем кнопку по умолчанию, например: кнопка «ОК» подключена к гнезду accept (), а кнопка «Отмена» подключена к гнезду reject (). В качестве альтернативы, мы можем подключить слот done () и передать его в Accepted или Rejected.
Немодальный диалог
Диалоговые окна, которые не имеют ничего общего с другими операциями окна в той же программе. Диалоговые окна поиска и замены в текстовом редакторе обычно не работают, что позволяет пользователям одновременно взаимодействовать как с главным окном приложения, так и с диалоговыми окнами. Вызовите show () для отображения немодального диалогового окна и немедленно верните управление вызывающей стороне.
Если функция show () вызывается после того, как диалоговое окно скрыто, диалоговое окно будет отображаться в исходном положении, поскольку положение окна, определенное диспетчером окон, явно не указано программистом. ), А затем переместите диалоговое окно в эту позицию перед его отображением.
Диалоговое окно Half Mode
Вызовите setModal (true) или setWindowModality (), а затем покажите (). В отличие от exec (), show () немедленно возвращает вызывающему элементу управления.
Для диалога прогресса очень полезно вызвать setModal (true), пользователь должен иметь возможность взаимодействовать с ним, например: отменить длительные операции. Если вы используете show () и setModal (true) для совместного выполнения длинной операции, вы должны периодически вызывать QApplication :: processEvents () во время выполнения, чтобы позволить пользователю взаимодействовать с диалоговым окном (см. QProgressDialog).
Принципы использования
- Если его нужно встроить в другие формы, он создается на основе QWidget.
- Если это основная форма, она создается на основе QMainWindow.
- Если это диалог верхнего уровня, он создается на основе QDialog.
Сегодня я в основном объясняю сходства и различия между тремя, не все они описаны и используются, и они будут подробно объяснены в последующем фактическом боевом процессе, например: использование некоторых общих диалоговых окон — QFileDialog, QColorDialog, QMessageBox Как добавить строку меню, панель инструментов, плавающую форму и т. Д. В основную форму QMainWindow, QWidget и его подклассы-QLabel, QPushButton, QCheckBox и т. Д.
Чем отличается qwidget от qmainwindow
The difference between QMainWindow and QWidget
After the QWidget runs, there is only one "page", and QMainWindow runs to generate a "window".
The layout of QMainWindow is shown below:
From the outside to the inside is the menu bar, status bar, toolbar, docking window, center window.
Looking at the help documentation, you can find that the setMenuBar, addToolBar, setCentralWidget, and setStatusBar behaviors are only available in the QMainWindow class.
Therefore, it is not possible to create menu bars and other behaviors in user classes that inherit from the QWidget class.
This is the main difference between QMainWindow and QWidget.
Intelligent Recommendation
![]()
Qt: QWidget, QDialog, and QMainwindow
Qt: QWidget, QDialog, and QMainwindow QWidget QDialog QDialogs may be **modal** or **modeless**. QDialogs can provide a return value, and they can have default buttons. QDialog (and any other widget t.
![]()
QWidget/QDialog/QMainWindow of Qt
QDialog The dialog box provides users with many options and multiple choices, allowing users to set the options to their favorite variable values and make choices from them. The reason why they are .
QMainWindow and QWIDGET Settings Layout
is simple when setting the layout of Qwidget or QDialog. Create a layout: mainlayout, then keep each control into mainlayout, and finally call setLayout (Mainlayout). qmainwindow uses this method but .
Qt / QMainWindow、QDialog、QWidget
In QT, we collect windows and controls as part (Widget). The window is an integral interface of the program, which can contain the title bar, menu, toolbar, shutdown button, minimize buttons, maximize.
Solve adding qmainwindow in Qwidget, QMainWindow interface is not displayed
content Demand Program problem Method 1 (recommended) Method 2 Expand in conclusion Demand You need to add a QMAINWINDOW type interface to the QWIDGET. Program Because the QMainWindow class inherits f.
Главное окно приложения
Эти классы предоставляют все необходимое для типичного современного главного окна приложения,например,само главное окно,меню и панели инструментов,строка состояния и т.д.
Виджет,который может быть пристыкован внутри QMainWindow или плавать как окно верхнего уровня на рабочем столе
Главное окно приложения
Область,в которой отображаются окна MDI
Класс подокна для QMdiArea
Виджет меню для использования в панелях меню,контекстных меню и других всплывающих меню.
горизонтальная панель меню
Ручка изменения размера для изменения размера окон верхнего уровня
Горизонтальная полоса,подходящая для представления информации о состоянии
Подвижная панель,содержащая набор элементов управления
Расширяет QAction интерфейсом для вставки пользовательских виджетов в контейнеры,основанные на действиях,такие как панели инструментов.
Классы главного окна
Qt предоставляет следующие классы для управления главными окнами и связанными с ними компонентами пользовательского интерфейса:
- QMainWindow — это центральный класс, вокруг которого можно создавать приложения. Вместе с сопутствующими классами QDockWidget и QToolBar он представляет пользовательский интерфейс верхнего уровня приложения.
- QDockWidget предоставляет виджет, который можно использовать для создания съемных инструментальных палитр или вспомогательных окон. Док-виджеты отслеживают свои собственные свойства, и их можно перемещать, закрывать и перемещать как внешние окна.
- QToolBar предоставляет общий виджет панели инструментов, который может содержать ряд различных виджетов, связанных с действиями, таких как кнопки, раскрывающиеся меню, поля со списком и счетчики. Акцент на унифицированной модели действий в Qt означает, что панели инструментов хорошо взаимодействуют с меню и сочетаниями клавиш.
Example Code
Использовать QMainWindow просто. Обычно мы создаем подкласс QMainWindow и настраиваем меню, панели инструментов и закрепляемые виджеты внутри конструктора QMainWindow .
Чтобы добавить строку меню в главное окно, мы просто создаем меню и добавляем их в строку меню главного окна. Обратите внимание, что функция QMainWindow::menuBar () автоматически создаст строку меню при первом вызове. Вы также можете вызвать QMainWindow::setMenuBar (), чтобы использовать пользовательскую строку меню в главном окне.
После создания действий мы можем добавить их в компоненты главного окна.Для начала мы добавляем их во всплывающие меню:
Классы QToolBar и QMenu используют систему действий Qt для предоставления согласованного API. В приведенном выше коде некоторые существующие действия были добавлены в меню файла с помощью функции QMenu::addAction (). QToolBar также предоставляет эту функцию, упрощая повторное использование действий в разных частях главного окна. Это позволяет избежать ненужного дублирования работы.
Мы создаем панель инструментов в качестве дочернего элемента главного окна и добавляем в нее нужные действия:
В этом примере панель инструментов ограничена областями верхней и нижней панели инструментов главного окна и изначально размещается в области верхней панели инструментов. Мы видим, что действия, указанные в newAct и openAct , будут отображаться как на панели инструментов, так и в меню файла.
QDockWidget используется аналогично QToolBar . Мы создаем док-виджет как дочерний элемент главного окна и добавляем виджеты как дочерние элементы док-виджета:
В данном примере виджет док-станции может быть размещен только в левой и правой областях док-станции,и изначально он размещается в левой области док-станции.
API QMainWindow позволяет программисту настраивать, какие области виджетов стыковки занимают четыре угла области виджетов стыковки. При необходимости значение по умолчанию можно изменить с помощью функции QMainWindow::setCorner ():
На следующей диаграмме показана конфигурация,полученная с помощью вышеуказанного кода.Обратите внимание,что левый и правый док-виджеты будут занимать верхний и нижний углы главного окна в этом варианте компоновки.
После того,как все компоненты главного окна настроены,центральный виджет создается и устанавливается с помощью кода,аналогичного приведенному ниже:
What's the difference between QMainWindow, QWidget and QDialog?
What’s the difference between QMainWindow, QWidget and QDialog?
2 Answers 2
A QWidget is the base class for all drawable classes in Qt. Any QWidget -based class can be shown as a window by showing it when it has no parent.
A QDialog is based on QWidget , but designed to be shown as a window. It will always appear in a window, and has functions to make it work well with common buttons on dialogs (accept, reject, etc.).
QMainWindow is designed around common needs for a main window to have. It has predefined places for a menu bar, a status bar, a toolbar, and other widgets. It does not have any built-in allowances for buttons like QDialog does.