Qt主窗口框架详解:从QMainWindow到标准对话框的完整指南
概述
Qt窗是通过QMainWindow类来实现的。QMainWindow是⼀个为⽤⼾提供主窗⼝程序的类,继承⾃QWidget类,并且提供了⼀个预定义的布局。QMainWindow包含⼀个菜单栏(menubar)、多个⼯具栏(toolbars)、多个浮动窗⼝(铆接部件)(dock widgets)、⼀个状态栏(status bar)和⼀个中⼼部件(centralwidget),它是许多应⽤程序的基础,如⽂本编辑器,图⽚编辑器等。如下图为QMainwindow中各组件所处的位置:

QMenuBar
Qt中的菜单栏是通过QMenuBar这个类来实现的。⼀个主窗⼝最多只有⼀个菜单栏。位于主窗⼝顶部、主窗⼝标题栏下⾯。菜单栏中包含菜单.菜单中包含菜单项.
创建菜单栏
⽅式⼀:菜单栏的创建可以借助于QMainWindow类提供的menuBar()函数来实现。menubar()函数原型如下
QMenuBar* menuBar() const
//创建菜单栏
QMenuBAr* menubar = menuBar();
//将菜单栏放入到窗口中
this->setMenuBar(menubar);
方式二:在堆上动态创建
QMenuBar* menubar = new QMenuBar(this);
this->setMenuBar(menubar);
注意事项
注意事项
值得注意的是如果创建项目的时候勾选了自动创建ui文件,系统会自动生成QMenuBar对象
此时如果使用QMenuBar* menuBar = new QMenuBar();进行创建MenuBar会将先前系统创建的MenuBar脱离了QT的对象树
意味着后续就无法对该对象进行释放了
上述程序如果窗口关闭对象树释放此时进程也就结束了,进程结束,自然所有内存都回收给系统,上述内存泄漏也不会造成影响
但是此时如果这样的代码是出现在一个多窗口的程序中,如果涉及到窗口的频繁跳级切换(窗口的频繁创建销毁)上述内存泄漏就会更严重一些。在实际中通常采用以下方式创建菜单栏
QMenuBar* menuBar = this->menubar();
this->setMenuBar(menubar);
1:如果QMenuBar已经存在直接获取并返回
2:如果QMenuBar不存在就先创建一个新的并返回
在菜单栏中添加菜单
创建菜单,并通过 QMenu 提供的addMenu() 函数来添加菜单。同时在创建菜单的同时还可以为其菜单添加上快捷键,采用“&+快捷键”的方式添加快捷键,在窗口启动时可采用Alt+快捷键的方式快速选中菜单。
//创建菜单栏
QMenuBar* menubar = new QMenuBar(this);
this->setMenuBar(menubar);
//创建菜单
QMenu* menu = new QMenu("文件 (&F)");//添加快捷键
QMenu* menu2 = new QMenu("编辑");
QMenu* menu3= new QMenu("构建");
//添加到菜单栏
menubar->addMenu(menu);
menubar->addMenu(menu2);
menubar->addMenu(menu3);

创建菜单项
在Qt中,并没有专⻔的菜单项类,可以通过QAction 类,抽象出公共的动作。如在菜单中添加菜单项.
示例:在菜单中添加菜单项
//创建菜单栏
QMenuBar* menubar = new QMenuBar(this);
this->setMenuBar(menubar);
//创建菜单
QMenu* menu = new QMenu("文件 (&F)");//添加快捷键
QMenu* menu2 = new QMenu("编辑");
QMenu* menu3= new QMenu("构建");
//添加到菜单栏
menubar->addMenu(menu);
menubar->addMenu(menu2);
menubar->addMenu(menu3);
//创建菜单项
QAction* act1 = new QAction("打开");
QAction* act2 = new QAction("关闭 (&C)");
QAction* act3 = new QAction("保存");
menu->addAction(act1);
menu->addSeparator();//添加分割线
menu->addAction(act2);
menu->addAction(act3);
//添加信号槽
connect(act2,&QAction::triggered,this,&MainWindow::close);
//添加菜单项图标 QMenu也可以设置图标,当QMenu是在QMenuBar上面此时文本就不显示,
//当QMenu是子菜单可以显示文字和图标
QIcon icon2(":/Save.png");
act3->setIcon(icon2);
QIcon icon(":/OPEN.png");
act1->setIcon(icon);
QIcon icon3(":/close.png");
act2->setIcon(icon3);

菜单项的信号也能绑定信号槽当触发信号时可执行对应的操作,菜单项也可设置快捷键与菜单设置快捷键的方式一样采用“&快捷键”的方式
QToolBar
⼯具栏是应⽤程序中集成各种功能实现快捷键使⽤的⼀个区域。可以有多个,也可以没有,它并不是应⽤程序中必须存在的组件。它是⼀个可移动的组件,它的元素可以是各种窗⼝组件,它的元素通常以图标按钮的⽅式存在。如下图为⼯具栏的⽰意图

创建工具栏
调⽤QMainWindow类的addToolBar()函数来创建⼯具栏,每增加⼀个⼯具栏都需要调⽤⼀次该函数。如添加两个⼯具栏:
QToolBar* toolbar = new QToolBar(this);
this->addToolBar(toolbar);
QToolBar* toolbar2 = new QToolBar(this);
this->addToolBar(Qt::RightToolBarArea,toolbar2);
设置工具栏停靠位置
⼯具栏停靠位置的设置有两种⽅式。⼀种是在创建⼯具栏的同时指定停靠的位置,另⼀种是通过QToolBar类提供的setAllowedAreas()函数来设置。
⽅式⼀:创建⼯具栏的同时指定其停靠的位置。
在创建⼯具栏的同时,也可以设置⼯具栏的位置,其默认位置是在窗⼝的最上⾯;如上述代码,认
在最上⾯显⽰。⼯具栏允许停靠的区域由QToolBar类提供的allowAreas()函数决定,其中可以设置
的位置包括:
Qt::LeftToolBarArea 停靠在左侧
Qt::RightToolBarArea 停靠在右侧
Qt::TopToolBarArea 停靠在顶部
Qt::BottomToolBarArea 停靠在底部
Qt::AllToolBarAreas 以上四个部分都可停靠
示例:
QToolBar* toolbar = new QToolBar(this);
QToolBar* toolbar2 = new QToolBar(this);
//创建工具栏的同时指定工具栏在左侧显示
this->addToolBar(Qt::LeftToolBarArea,toolbar);
//创建工具栏的同时指定工具栏在右侧显示
this->addToolBar(Qt::RightToolBarArea,toolbar2);
⽅式⼆:使⽤QToolBar类提供的setAllowedAreas()函数设置停靠位置。如下⽰例
QToolBar* toolbar = new QToolBar(this);
QToolBar* toolbar2 = new QToolBar(this);
//允许工具栏在显示在左侧
toolbar->setAllowedAreas(Qt::LeftToolBarArea);
//允许工具栏在显示在左侧和右侧
toolbar2->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
说明:
在创建⼯具栏的同时指定其停靠的位置,指的是程序运⾏时⼯具栏默认所在的位置;⽽使⽤setAllowedAreas()函数设置停靠位置,指的是⼯具栏允许其所能停靠的位置。
设置工具栏的浮动属性
⼯具栏的浮动属性可以通过QToolBar类提供的setFloatable()函数来设置setFloatable()函数原
型为:voidsetFloatable(boolfloatable)
参数:
true:浮动
false:不浮动
示例:
QToolBar* toolbar = new QToolBar(this);
QToolBar* toolbar2 = new QToolBar(this);
//允许工具栏在显示在左侧
toolbar->setAllowedAreas(Qt::LeftToolBarArea);
//允许工具栏在显示在左侧和右侧
toolbar2->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
//允许浮动
toolbar->setFloatable(true);
//不允许浮动
toolbar->setFloatable(false);
设置工具栏的移动属性
设置⼯具栏的移动属性可以通过QToolBar类提供的setMovable()函数来设置。setMovable()函数
原型为:voidsetMovable(boolmovable)
参数:
true:移动
false:不移动
说明
若设置⼯具栏为不移动状态,则设置其停靠位置的操作就不会⽣效,所以设置⼯具栏的移动属性类似于总开关的效果
QStatusBar
状态栏是应⽤程序中输出简要信息的区域。⼀般位于主窗⼝的最底部,⼀个窗⼝中最多只能有⼀个状态栏。在Qt中,状态栏是通过QStatusBar类来实现的。在状态栏中可以显⽰的消息类型有:
• 实时消息:如当前程序状态
• 永久消息:如程序版本号,机构名称
• 进度消息:如进度条提⽰,百分百提⽰
状态栏的创建
状态栏的创建是通过QMainWindow类提供的setStatusBar()函数来创建;示例如下:
QStatusBar* statubar = new QStatusBar(this);
this->setStatusBar(statubar);
状态栏的显示
在状态中实时显示
//在状态栏中显示实时消息,单位为毫秒
statubar->showMessage("hello yang",2000);
在状态栏中永久显示
//在状态栏中显示永久消息
QLabel* label = new QLabel("提示消息",this);
statubar->addWidget(label);
//将创建的标签放到状态栏的右侧
QLabel* label2 = new QLabel("右侧提示消息",this);
statubar->addPermanentWidget(label2);

QDockWidget
在Qt中,浮动窗⼝也称之为铆接部件。浮动窗⼝是通过QDockWidget类来实现浮动的功能。浮动窗⼝⼀般是位于核⼼部件的周围,可以有多个;
浮动窗口的创建
浮动窗⼝的创建是通过QDockWidget类提供的构造⽅法QDockWidget()函数动态创建的;⽰例如下:
QDockWidget* dockwidget = new QDockWidget(this);
dockwidget->setWindowTitle("这是一个浮动窗口");
this->addDockWidget(Qt::LeftDockWidgetArea,dockwidget);
浮动窗口停放的位置
浮动窗⼝是位于中⼼部件的周围。可以通过QDockWidget类中提供setAllowedAreas()函数设置其
允许停靠的位置。其中可以设置允许停靠的位置有:
• Qt::LeftDockWidgetArea 停靠在左侧
• Qt::RightDockWidgetArea 停靠在右侧
• Qt::TopDockWidgetArea 停靠在顶部
• Qt::BottomDockWidgetArea 停靠在底部
• Qt::AllDockWidgetAreas 以上四个位置都可停靠
示例如下:设置浮动窗口只允许左右停靠
dockwidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
QDialog
对话框是GUI程序中不可或缺的组成部分。⼀些不适合在主窗⼝实现的功能组件可以设置在对话框中。对话框通常是⼀个顶层窗⼝,出现在程序最上层,⽤于实现短期任务或者简洁的⽤⼾交互。Qt常⽤的内置对话框有:QFiledialog(⽂件对话框)、QColorDialog(颜⾊对话框)、QFontDialog(字体对话框)、QInputDialog(输⼊对话框)和QMessageBox(消息框)
对话框的分类
对话框分为模态对话框和⾮模态对话框
模态对话框指的是:显⽰后⽆法与⽗窗⼝进⾏交互,是⼀种阻塞式的对话框。使⽤QDialog::exec()函数调⽤。
模态对话框适⽤于必须依赖⽤⼾选择的场合,⽐如消息显⽰,⽂件选择,打印设置等
非模态对话框:显⽰后可与⽗窗⼝进⾏交互,是⼀种非阻塞式的对话框。使⽤QDialog::show()函数调⽤。
⾮模态对话框⼀般在堆上创建,这是因为如果创建在栈上时,弹出的⾮模态对话框就会⼀闪⽽过。同时还需要设置Qt:WA_DeleteOnClose属性,⽬的是:当创建多个⾮模态对话框时(如打开了多个⾮模态窗⼝),为了避免内存泄漏要设置此属性。
QMessBox
消息对话框是应⽤程序中最常⽤的界⾯元素。消息对话框主要⽤于为⽤⼾提⽰重要信息,强制⽤⼾进⾏选择操作。
QMessageBox类中定义了静态成员函数,可以直接调⽤创建不同⻛格的消息对话框,其中包括:


示例1:问题提示对话框
QMessageBox* messagbox = new QMessageBox(this);
messagbox->resize(300,300);
messagbox->setWindowTitle("出现问题!!!");
messagbox->setText("发现问题");
messagbox->setIcon(QMessageBox::Question);
messagbox->setStandardButtons(QMessageBox::Ok | QMessageBox::Save | QMessageBox::Cancel);
messagbox->setAttribute(Qt::WA_DeleteOnClose);
messagbox->exec();

其中可设置的按钮类型如下

示例2:信息提⽰消息对话框
QMessageBox* messagbox = new QMessageBox(this);
messagbox->resize(300,300);
messagbox->setWindowTitle("新消息!!!");
messagbox->setText("出现消息");
messagbox->setIcon(QMessageBox::Information);
messagbox->setStandardButtons(QMessageBox::Ok | QMessageBox::Save | QMessageBox::Cancel);
messagbox->setAttribute(Qt::WA_DeleteOnClose);
messagbox->exec();

示例3:警告信息消息对话框
QMessageBox* messagbox = new QMessageBox(this);
messagbox->resize(300,300);
messagbox->setWindowTitle("警告!!!");
messagbox->setText("警告");
messagbox->setIcon(QMessageBox::Warning);
messagbox->setStandardButtons(QMessageBox::Ok | QMessageBox::Save | QMessageBox::Cancel);
messagbox->setAttribute(Qt::WA_DeleteOnClose);
messagbox->exec();

示例4:错误信息消息对话框

QMessageBox* messagbox = new QMessageBox(this);
messagbox->resize(300,300);
messagbox->setWindowTitle("错误!!!");
messagbox->setText("错误");
messagbox->setIcon(QMessageBox::Critical);
messagbox->setStandardButtons(QMessageBox::Ok | QMessageBox::Save | QMessageBox::Cancel);
messagbox->setAttribute(Qt::WA_DeleteOnClose);
messagbox->exec()
注意
除了上述方法创建消息对话框外,QMessBox也提供了静态函数来更加便捷地进行消息对话框的设置
QMessageBox::critical(this,"错误","文本",QMessageBox::Save | QMessageBox::Cancel);
QColorDialog
颜⾊对话框的功能是允许⽤⼾选择颜⾊。继承⾃QDialog类。颜⾊对话框如下图⽰:

常⽤⽅法介绍:
1、QColorDialog(QWidget*parent=nullptr)//创建对象的同时设置⽗对象
2、QColorDialog(const QColor &initial,QWidget *parent=nullptr)//创建对象的同时通过QColor
对象设置默认颜⾊和⽗对象
3、void setCurrentColor(const QColor &color)//设置当前颜⾊对话框
4、QColor currentColor()const//获取当前颜⾊对话框
5,QColor getColor(const QColor &initial=Qt::white,QWidget *parent=nullptr,const QString
&title=QString(),QColorDialog::ColorDialogOptions options=ColorDialogOptions())//打开颜⾊
选择对话框,并返回⼀个QColor对象
参数说明:
initial:设置默认颜⾊
parent:设置⽗对象
title:设置对话框标题
options:设置选项
示例:选择设置背景颜色
QColor color = QColorDialog::getColor(QColor(0,255,0),this,"选择颜色");
qDebug()<<color;
char str[1024]={0};
sprintf(str,"background-color: rgb(%d,%d,%d);",color.red(),color.green(),color.blue());
this->setStyleSheet(str);
QFileDialog
⽂件对话框⽤于应⽤程序中需要打开⼀个外部⽂件或需要将当前内容存储到指定的外部⽂件。
常⽤⽅法介绍:
1、打开⽂件(⼀次只能打开⼀个⽂件)
QString QFileDialog::getOpenFileName(
QWidget *parent = nullptr,
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(),
QString *selectedFilter = nullptr,
Options options = Options()
)
参数说明
- parent: 父窗口部件,通常传入当前窗口的指针,用于模态对话框的显示。
- caption: 对话框标题,显示在窗口标题栏。
- dir: 初始目录路径,若不指定则使用默认目录。
- filter: 文件过滤器,用于限制显示的文件类型(如
"Text Files (*.txt);;All Files (*)")。 - selectedFilter: 可选参数,用于存储用户选择的过滤器。
- options: 对话框选项,控制对话框行为(如
2、打开多个⽂件(⼀次可以打开多个⽂件)
QStringList QFileDialog::getOpenFileNames(
QWidget *parent = nullptr,
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(),
QString *selectedFilter = nullptr,
QFileDialog::Options options = Options()
)
参数说明
- parent:父窗口指针,通常传入当前窗口的
this指针 - caption:对话框标题(如 "选择文件")
- dir:默认打开的目录路径(如
QDir::homePath()) - filter:文件类型过滤器(如
"Images (*.png *.jpg)") - selectedFilter:指向用户选择的过滤器字符串的指针
- options:对话框选项(如
QFileDialog::DontUseNativeDialog)
3、保存⽂件
QString QFileDialog::getSaveFileName(
QWidget *parent = nullptr,
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(),
QString *selectedFilter = nullptr,
QFileDialog::Options options = Options()
)
QFontDialog
QFontDialog 概述
QFontDialog 是 Qt 框架提供的标准字体选择对话框,允许用户选择字体及其属性(如字号、样式等)。继承自 QDialog,常用于需要用户自定义字体设置的场景。
基本用法
通过静态方法 getFont() 快速调用字体对话框:
bool ok;
QFont font = QFontDialog::getFont(&ok, QFont("Arial", 12), this);
if (ok) {
// 用户点击确认,使用选择的字体
qDebug() << "Selected font:" << font.family() << font.pointSize();
}
- 参数说明:
&ok:接收用户是否确认选择的布尔值。- 默认字体:对话框初始显示的字体(如
QFont("Arial", 12))。 - 父窗口:指定对话框的父部件(通常是
this)。
高级用法
自定义对话框选项
通过创建 QFontDialog 实例并设置属性:
QFontDialog dialog;
dialog.setCurrentFont(QFont("Times New Roman", 14));
dialog.setOption(QFontDialog::MonospacedFonts); // 仅显示等宽字体
if (dialog.exec() == QDialog::Accepted) {
QFont selectedFont = dialog.selectedFont();
}
- 常用选项:
QFontDialog::NoButtons:隐藏确认按钮(适用于嵌入式场景)。QFontDialog::ScalableFonts:仅显示可缩放字体。。
QInoutDialog
QInputDialog 概述
QInputDialog 是 Qt 框架中提供的一个便捷对话框类,用于快速获取用户的简单输入。支持文本、整数、浮点数、下拉列表等多种输入方式,适合需要快速交互的场景。
常用方法
-
获取文本输入
QInputDialog::getText()用于获取用户输入的字符串。
示例代码:bool ok; QString text = QInputDialog::getText(parent, "标题", "提示文本", QLineEdit::Normal, "", &ok); if (ok) { // 用户确认输入后的处理 } -
获取整数输入
QInputDialog::getInt()用于获取用户输入的整数值。
示例代码:int ret = QInputDialog::getInt(this,"选择输入整数","请输入整数"); qDebug()<<ret;
-
获取浮点数输入
QInputDialog::getDouble()用于获取用户输入的浮点数。
示例代码:double ret = QInputDialog::getDouble(this,"选择输入浮点数","请输入浮点数"); qDebug()<<ret
-
获取下拉选项
QInputDialog::getItem()用于从下拉列表中选择一个选项。
示例代码:QStringList items; items.push_back("aaa"); items.push_back("bbb"); items.push_back("nnn"); items.push_back("mmm"); items.push_back("sss"); QString item = QInputDialog::getItem(this,"选择条目","请输入选择条目",items);
参数说明
- parent: 对话框的父窗口,通常传入当前窗口指针。
- title: 对话框标题。
- label: 输入框前的提示文本。
- default: 默认值(字符串、整数或浮点数)。
- min/max: 数值输入范围。
- ok: 布尔指针,用于判断用户是否确认输入。
使用场景
- 快速获取用户输入的简单数据(如名称、数量)。
- 避免为简单交互创建自定义对话框。
- 需要限制输入范围或格式时(如数值范围)。
注意事项
- 若需复杂输入(如多字段验证),建议改用
QDialog自定义对话框。 - 返回值需通过
ok参数判断用户是否点击了“确认”。
更多推荐


所有评论(0)