QT学习之 QWidget、QDialog、QMainWindow的区别
在Qt框架中,QWidget、QDialog和QMainWindow是三个核心窗口类,它们的主要区别在于用途和功能结构:
- QWidget(基础窗口控件)
定位:所有窗口控件的基类(QDialog和QMainWindow都继承自它)。
功能:
可作为独立的顶级窗口(无父控件),或嵌入其他窗口作为子控件。
默认无菜单栏、工具栏、状态栏等组件。
支持自定义布局、事件处理、绘制等基础功能。
典型场景:
自定义控件(如按钮、标签)。
简单的弹出窗口。
作为其他窗口的容器(例如QMainWindow的中心部件)。
示例:
cpp
#include <Qapplication>
#include <QWidget>
#include <QmainWindow>
#include <Qdialog>
#include <Qlabel>
#include <QPushButton>
int main(int argc,char* argv[])
{
//创建应用程序
QApplication app(argc,argv);
//创建父窗口
QWidget parent;
//QDialog parent;
//QMainWindow parent;
parent.move(500,400);
parent.resize(300,150);
//创建标签组件
QLabel label("我是标签组件",&parent);
label.move(80,30);
label.resize(140,30);
//创建确认按钮
QPushButton bntOK("确认",&parent);
bntOK.move(35,90);
bntOK.resize(100,30);
//创建取消按钮
QPushButton *bntCancle = new QPushButton("取消",&parent);
bntCancle->move(165,90);
bntCancle->resize(100,30);
parent.show();
app.exec();
}
- QDialog(对话框窗口)
定位:专为对话框设计的子类(继承自QWidget)。
功能:
支持模态(阻塞父窗口)和非模态(独立运行)两种模式。
提供标准按钮布局(如 Ok/Cancel),通过 QDialogButtonBox 管理。
内置返回值机制(如 accept() 和 reject() 信号)。
典型场景:
设置窗口(如“首选项”)。
消息提示框(QMessageBox 是其子类)。
文件选择对话框(QFileDialog)。
示例:
#include <Qapplication>
#include <QWidget>
#include <QmainWindow>
#include <Qdialog>
#include <Qlabel>
#include <QPushButton>
int main(int argc,char* argv[])
{
//创建应用程序
QApplication app(argc,argv);
//创建父窗口
//QWidget parent;
QDialog parent;
//QMainWindow parent;
parent.move(500,400);
parent.resize(300,150);
//创建标签组件
QLabel label("我是标签组件",&parent);
label.move(80,30);
label.resize(140,30);
//创建确认按钮
QPushButton bntOK("确认",&parent);
bntOK.move(35,90);
bntOK.resize(100,30);
//创建取消按钮
QPushButton *bntCancle = new QPushButton("取消",&parent);
bntCancle->move(165,90);
bntCancle->resize(100,30);
parent.show();
app.exec();
}
- QMainWindow(主应用程序窗口)
定位:为主窗口设计的子类(继承自QWidget),提供完整的应用框架。
功能:
内置菜单栏(menuBar())、工具栏(addToolBar())、状态栏(statusBar())。
中心区域(setCentralWidget())用于放置核心控件。
支持停靠窗口(addDockWidget())。
典型场景:
应用程序的主界面(如IDE、文本编辑器)。
需要复杂布局和多组件协同的窗口。
示例:
#include <Qapplication>
#include <QWidget>
#include <QmainWindow>
#include <Qdialog>
#include <Qlabel>
#include <QPushButton>
int main(int argc,char* argv[])
{
//创建应用程序
QApplication app(argc,argv);
//创建父窗口
//QWidget parent;
//QDialog parent;
QMainWindow parent;
parent.move(500,400);
parent.resize(300,150);
//创建标签组件
QLabel label("我是标签组件",&parent);
label.move(80,30);
label.resize(140,30);
//创建确认按钮
QPushButton bntOK("确认",&parent);
bntOK.move(35,90);
bntOK.resize(100,30);
//创建取消按钮
QPushButton *bntCancle = new QPushButton("取消",&parent);
bntCancle->move(165,90);
bntCancle->resize(100,30);
parent.show();
app.exec();
}

如何选择?
需要主界面(含菜单/工具栏) → QMainWindow。
需要弹窗(设置/消息) → QDialog。
需要自定义控件或简单窗口 → QWidget。

3万+

被折叠的 条评论
为什么被折叠?



