
🎬 个人主页 :艾莉丝努力练剑
❄专栏传送门 :《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》
《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》
⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平
🎬 艾莉丝的简介:

文章目录
- 导入
- [1 ~> QT窗口预览](#1 ~> QT窗口预览)
-
- [1.1 QMainWindow 与 QWidget 的区别](#1.1 QMainWindow 与 QWidget 的区别)
- [1.2 QMainWindow 核心布局结构](#1.2 QMainWindow 核心布局结构)
- [1.3 核心组件关系](#1.3 核心组件关系)
- [2 ~> 菜单栏(QMenuBar)](#2 ~> 菜单栏(QMenuBar))
-
- [2.1 基本特性](#2.1 基本特性)
- [2.2 菜单栏创建流程](#2.2 菜单栏创建流程)
-
- [2.2.1 基本创建步骤](#2.2.1 基本创建步骤)
- [2.2.2 完整代码示例](#2.2.2 完整代码示例)
- [2.3 高级功能](#2.3 高级功能)
-
- [2.3.1 子菜单嵌套](#2.3.1 子菜单嵌套)
- [2.3.2 添加图标](#2.3.2 添加图标)
- [2.3.3 分割线](#2.3.3 分割线)
- [2.4 内存泄漏注意事项](#2.4 内存泄漏注意事项)
- [3 ~> 工具栏(QToolBar)](#3 ~> 工具栏(QToolBar))
-
- [3.1 基本特性](#3.1 基本特性)
- [3.2 工具栏创建流程](#3.2 工具栏创建流程)
-
- [3.2.1 基本创建步骤](#3.2.1 基本创建步骤)
- [3.2.2 完整代码示例](#3.2.2 完整代码示例)
- [3.3 与菜单栏共享 QAction](#3.3 与菜单栏共享 QAction)
- [3.4 多个工具栏与停靠控制](#3.4 多个工具栏与停靠控制)
-
- [3.4.1 创建多个工具栏](#3.4.1 创建多个工具栏)
- [3.4.2 停靠位置与属性控制](#3.4.2 停靠位置与属性控制)
- [4 ~> 状态栏(QStatusBar)](#4 ~> 状态栏(QStatusBar))
-
- [4.1 基本特性](#4.1 基本特性)
- [4.2 状态栏基本使用](#4.2 状态栏基本使用)
-
- [4.2.1 创建与显示临时消息](#4.2.1 创建与显示临时消息)
- [4.3 向状态栏添加控件](#4.3 向状态栏添加控件)
-
- [4.3.1 添加标签和进度条](#4.3.1 添加标签和进度条)
- [5 ~> 浮动窗口(QDockWidget)](#5 ~> 浮动窗口(QDockWidget))
-
- [5.1 基本特性](#5.1 基本特性)
- [5.2 浮动窗口创建流程](#5.2 浮动窗口创建流程)
-
- [5.2.1 基本创建步骤](#5.2.1 基本创建步骤)
- [5.2.2 完整代码示例](#5.2.2 完整代码示例)
- [5.3 停靠位置枚举值](#5.3 停靠位置枚举值)
- [6 ~> 对话框(QDialog)](#6 ~> 对话框(QDialog))
-
- [6.1 基本概念](#6.1 基本概念)
- [6.2 对话框的内存管理](#6.2 对话框的内存管理)
- [6.3 模态与非模态对话框](#6.3 模态与非模态对话框)
- [6.4 自定义对话框](#6.4 自定义对话框)
-
- [6.4.1 纯代码方式](#6.4.1 纯代码方式)
- [6.4.2 图形化 ui 方式](#6.4.2 图形化 ui 方式)
- [6.5 标准内置对话框](#6.5 标准内置对话框)
-
- [6.5.1 消息对话框 QMessageBox](#6.5.1 消息对话框 QMessageBox)
- [6.5.2 颜色对话框 QColorDialog](#6.5.2 颜色对话框 QColorDialog)
- [6.5.3 文件对话框 QFileDialog](#6.5.3 文件对话框 QFileDialog)
- [6.5.4 字体对话框 QFontDialog](#6.5.4 字体对话框 QFontDialog)
- [6.5.5 输入对话框 QInputDialog](#6.5.5 输入对话框 QInputDialog)
- [7 ~> QT窗口小结](#7 ~> QT窗口小结)
-
- [7.1 核心组件总结](#7.1 核心组件总结)
- [7.2 关键知识点回顾](#7.2 关键知识点回顾)
- [7.3 开发流程总结](#7.3 开发流程总结)
- [7.2 关键知识点回顾](#7.2 关键知识点回顾)
- [7.3 开发流程总结](#7.3 开发流程总结)
- 结尾

导入
思维导图

导入语
在 Qt 桌面应用开发中,QMainWindow 是构建完整应用程序的核心类。相比于基础的 QWidget,它提供了一套预定义的标准化窗口布局,包含了菜单栏、工具栏、浮动窗口、状态栏和中心部件五大核心区域。这些组件的有机组合,能够快速搭建出符合用户习惯的专业级应用界面,比如我们常用的文本编辑器、图片处理软件、IDE 开发环境等,都是基于 QMainWindow 架构构建的。
本笔记将系统梳理 Qt 窗口开发的全部核心知识点,从主窗口的基本结构入手,逐一详解菜单栏、工具栏、状态栏、浮动窗口的创建与使用方法,最后深入介绍对话框的自定义与标准内置对话框的应用。通过学习这些内容,你将掌握构建完整 Qt 桌面应用界面的全部技能,能够将零散的控件组合成一个功能完善、交互友好的应用程序。
1 ~> QT窗口预览
1.1 QMainWindow 与 QWidget 的区别
- QWidget:所有用户界面对象的基类,更多作为窗口的组成部分使用,没有预定义的布局结构。
- QMainWindow:继承自 QWidget,专门为主窗口程序设计,提供了一套完整的标准化布局,包含了开发桌面应用所需的所有标准组件。
1.2 QMainWindow 核心布局结构
QMainWindow 的布局分为六个固定区域,开发者不能直接向其添加布局,必须将内容填充到指定区域:
- 标题栏(Window Title):系统自带,显示窗口标题和控制按钮。
- 菜单栏(Menu Bar):位于窗口顶部,全局唯一,包含各功能菜单。
- 工具栏(Tool Bar Area):位于菜单栏下方,可多个并存,支持停靠和浮动。
- 浮动窗口区域(Dock Widget Area):围绕中心部件,可放置多个可停靠的子窗口。
- 中心部件(Central Widget):窗口的核心区域,唯一且必填,用于展示主要内容。
- 状态栏(Status Bar):位于窗口底部,全局唯一,用于显示程序状态信息。
1.3 核心组件关系
- QAction:抽象动作类,是菜单和工具栏的核心操作单元。一个 QAction 可以同时绑定到菜单和工具栏,实现功能复用,支持设置文本、图标、快捷键和状态提示。
- QMenu:单个下拉菜单,是菜单栏的子项,点击后展开下拉列表,承载具体的 QAction。
- QMenuBar:菜单栏容器,管理所有的 QMenu。
- QToolBar:工具栏容器,管理所有的快捷操作按钮。
- QDockWidget:浮动窗口容器,可放置辅助功能面板。
- QStatusBar:状态栏容器,管理状态信息和小控件。
- QDialog:对话框基类,用于实现短期任务和简洁的用户交互。
2 ~> 菜单栏(QMenuBar)
2.1 基本特性
- 一个主窗口最多只能有一个菜单栏,位于主窗口顶部、标题栏下方。
- 菜单栏中包含多个菜单(QMenu),每个菜单中包含多个菜单项(QAction)。
- 首次调用
QMainWindow::menuBar()函数时,会自动创建一个菜单栏对象并返回。
2.2 菜单栏创建流程
2.2.1 基本创建步骤
- 获取或创建菜单栏对象
- 创建顶级菜单(QMenu)
- 向菜单中添加菜单项(QAction)
- 为菜单项绑定信号槽,实现交互功能
2.2.2 完整代码示例
cpp
// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void handleNew(); // 新建操作槽函数
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 1. 获取菜单栏对象(不存在则自动创建)
QMenuBar* menuBar = this->menuBar();
this->setMenuBar(menuBar);
// 2. 创建顶级菜单
QMenu* menuFile = new QMenu("文件(&F)"); // &F 设置快捷键 Alt+F
QMenu* menuEdit = new QMenu("编辑(&E)");
QMenu* menuView = new QMenu("视图(&V)");
// 将菜单添加到菜单栏
menuBar->addMenu(menuFile);
menuBar->addMenu(menuEdit);
menuBar->addMenu(menuView);
// 3. 创建菜单项(QAction)
QAction* actionNew = new QAction("新建(&N)"); // &N 设置快捷键 Alt+N
QAction* actionOpen = new QAction("打开(&O)");
QAction* actionSave = new QAction("保存(&S)");
QAction* actionExit = new QAction("退出(&X)");
// 将菜单项添加到菜单
menuFile->addAction(actionNew);
menuFile->addAction(actionOpen);
menuFile->addAction(actionSave);
menuFile->addSeparator(); // 添加分割线
menuFile->addAction(actionExit);
// 4. 绑定信号槽
connect(actionNew, &QAction::triggered, this, &MainWindow::handleNew);
connect(actionExit, &QAction::triggered, this, &MainWindow::close);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::handleNew()
{
qDebug() << "触发新建操作!";
}
2.3 高级功能
2.3.1 子菜单嵌套
QMenu 本身也可以添加子菜单,形成多级菜单结构:
cpp
// 创建父菜单
QMenu* menuParent = new QMenu("父菜单");
menuBar->addMenu(menuParent);
// 创建子菜单
QMenu* menuChild = new QMenu("子菜单");
menuParent->addMenu(menuChild);
// 向子菜单添加菜单项
QAction* action1 = new QAction("菜单项1");
QAction* action2 = new QAction("菜单项2");
menuChild->addAction(action1);
menuChild->addAction(action2);
// 继续嵌套子菜单
QMenu* menuChild2 = new QMenu("子菜单2");
menuChild->addMenu(menuChild2);
2.3.2 添加图标
菜单项和菜单都可以添加图标,需要使用 Qt 的资源系统(qrc)管理图片文件:
cpp
// 为菜单项添加图标
QAction* actionOpen = new QAction("打开(&O)");
actionOpen->setIcon(QIcon(":/open.png"));
// 为菜单添加图标
QMenu* menuFile = new QMenu("文件(&F)");
menuFile->setIcon(QIcon(":/file.png"));
注意:如果给菜单栏上的顶级菜单设置图标,文本会被图标覆盖;子菜单的图标和文本会同时显示。
2.3.3 分割线
使用 addSeparator() 函数在菜单中添加分割线,用于对功能相近的菜单项进行分组,提高菜单的可读性:
cpp
menuFile->addAction(actionSave);
menuFile->addSeparator(); // 在保存和退出之间添加分割线
menuFile->addAction(actionExit);
2.4 内存泄漏注意事项
- 如果项目勾选了自动生成 ui 文件,Qt 会自动创建一个 QMenuBar 对象。
- 如果手动
new QMenuBar()并调用setMenuBar(),会导致原来的 QMenuBar 对象脱离 Qt 的对象树,无法被自动释放,造成内存泄漏。 - 正确做法 :使用
this->menuBar()获取已存在的菜单栏对象,不存在则自动创建。
3 ~> 工具栏(QToolBar)
3.1 基本特性
- 工具栏是应用程序中集成各种功能实现快捷键使用的区域,不是必须存在的组件。
- 一个窗口可以有多个工具栏,支持手动移动位置和浮动。
- 工具栏元素通常以图标按钮的方式存在,本质上也是 QAction。
3.2 工具栏创建流程
3.2.1 基本创建步骤
- 创建 QToolBar 对象
- 使用
addToolBar()将工具栏添加到主窗口 - 向工具栏添加 QAction 快捷项
- 为 QAction 设置图标和工具提示
- 绑定信号槽实现交互功能
3.2.2 完整代码示例
cpp
// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QToolBar>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 1. 创建工具栏
QToolBar* toolBar = new QToolBar();
this->addToolBar(toolBar); // 添加到主窗口,默认停靠在顶部
// 2. 创建 QAction
QAction* actionSave = new QAction("保存");
QAction* actionOpen = new QAction("打开");
// 3. 设置图标和工具提示
actionSave->setIcon(QIcon(":/save.png"));
actionOpen->setIcon(QIcon(":/open.png"));
actionSave->setToolTip("点击这里保存文件");
// 4. 将 QAction 添加到工具栏
toolBar->addAction(actionSave);
toolBar->addAction(actionOpen);
// 5. 绑定信号槽
connect(actionSave, &QAction::triggered, this, &MainWindow::handleSave);
connect(actionOpen, &QAction::triggered, this, &MainWindow::handleOpen);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::handleSave()
{
qDebug() << "handleSave";
}
void MainWindow::handleOpen()
{
qDebug() << "handleOpen";
}
3.3 与菜单栏共享 QAction
同一个 QAction 可以同时添加到菜单和工具栏中,实现功能复用,且触发效果完全一致:
cpp
// 创建菜单栏和菜单
QMenuBar* menuBar = this->menuBar();
QMenu* menuFile = new QMenu("文件");
menuBar->addMenu(menuFile);
// 创建 QAction
QAction* actionSave = new QAction("保存");
actionSave->setIcon(QIcon(":/save.png"));
// 同时添加到菜单和工具栏
menuFile->addAction(actionSave);
toolBar->addAction(actionSave);
// 只需要绑定一次信号槽
connect(actionSave, &QAction::triggered, this, &MainWindow::handleSave);
注意:当一个 QAction 同时是 QMenu 和 QToolBar 的子元素时,释放时只会释放一次,不会造成重复释放问题。
3.4 多个工具栏与停靠控制
3.4.1 创建多个工具栏
cpp
// 创建两个工具栏
QToolBar* toolBar1 = new QToolBar();
QToolBar* toolBar2 = new QToolBar();
// 添加到主窗口
this->addToolBar(toolBar1);
this->addToolBar(Qt::LeftToolBarArea, toolBar2); // 指定初始停靠在左侧
// 向工具栏添加 QAction
toolBar1->addAction(new QAction("动作1"));
toolBar1->addAction(new QAction("动作2"));
toolBar2->addAction(new QAction("动作3"));
toolBar2->addAction(new QAction("动作4"));
3.4.2 停靠位置与属性控制
cpp
// 设置允许停靠的位置:只允许左侧和右侧
toolBar2->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
// 设置不允许浮动
toolBar2->setFloatable(false);
// 设置不允许移动(完全固定)
toolBar2->setMovable(false);
停靠位置枚举值:
Qt::LeftToolBarArea:停靠在左侧Qt::RightToolBarArea:停靠在右侧Qt::TopToolBarArea:停靠在顶部(默认)Qt::BottomToolBarArea:停靠在底部Qt::AllToolBarAreas:以上四个位置都可停靠
4 ~> 状态栏(QStatusBar)
4.1 基本特性
- 状态栏是应用程序中输出简要信息的区域,一般位于主窗口的最底部。
- 一个窗口中最多只能有一个状态栏。
- 可以显示三种类型的消息:
- 实时消息:如当前程序状态、操作提示
- 永久消息:如程序版本号、机构名称
- 进度消息:如进度条提示、百分比提示
4.2 状态栏基本使用
4.2.1 创建与显示临时消息
cpp
// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 获取状态栏对象(不存在则自动创建)
QStatusBar* statusBar = this->statusBar();
this->setStatusBar(statusBar);
// 显示临时消息,3000ms后自动消失
statusBar->showMessage("这是一个状态消息", 3000);
// 永久显示消息(不填第二个参数或填0)
// statusBar->showMessage("永久显示的消息", 0);
}
MainWindow::~MainWindow()
{
delete ui;
}
4.3 向状态栏添加控件
状态栏支持添加任意 QWidget 控件,有两种添加方式:
addWidget():从左往右添加控件,会被临时消息覆盖addPermanentWidget():从右往左添加控件,不会被临时消息覆盖
4.3.1 添加标签和进度条
cpp
#include <QLabel>
#include <QProgressBar>
#include <QPushButton>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QStatusBar* statusBar = this->statusBar();
this->setStatusBar(statusBar);
// 添加标签(左侧)
QLabel* label = new QLabel("这是一个QLabel");
statusBar->addWidget(label, 1); // 第二个参数是拉伸系数
// 添加进度条
QProgressBar* progressBar = new QProgressBar();
progressBar->setRange(0, 100);
progressBar->setValue(50);
statusBar->addWidget(progressBar);
// 添加按钮(右侧,永久显示)
QPushButton* button = new QPushButton("按钮");
statusBar->addPermanentWidget(button);
}
注意:添加多个控件时,可以通过设置拉伸系数来控制控件的宽度比例。
5 ~> 浮动窗口(QDockWidget)
5.1 基本特性
- 浮动窗口又称铆接部件或子窗口,是可以停靠在主窗口边缘或独立浮动的窗口。
- 一个主窗口可以有多个浮动窗口,适合放置辅助功能面板,如日志面板、属性设置面板等。
- 浮动窗口可以围绕中心部件停靠在四个方向,也可以拖出成为独立窗口。
5.2 浮动窗口创建流程
5.2.1 基本创建步骤
- 创建 QDockWidget 对象
- 使用
addDockWidget()将浮动窗口添加到主窗口指定区域 - 设置浮动窗口标题
- 创建内容容器 QWidget,向其中添加控件
- 将内容容器设置到浮动窗口中
5.2.2 完整代码示例
cpp
// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDockWidget>
#include <QVBoxLayout>
#include <QLabel>
#include <QPushButton>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 1. 创建浮动窗口
QDockWidget* dockWidget = new QDockWidget();
// 2. 添加到主窗口左侧
this->addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
// 3. 设置标题
dockWidget->setWindowTitle("这是浮动窗口");
// 4. 创建内容容器和布局
QWidget* container = new QWidget();
QVBoxLayout* layout = new QVBoxLayout();
container->setLayout(layout);
// 向容器中添加控件
QLabel* label = new QLabel("这是一个QLabel");
QPushButton* button = new QPushButton("这是按钮");
layout->addWidget(label);
layout->addWidget(button);
// 5. 将容器设置到浮动窗口
dockWidget->setWidget(container);
// 设置允许停靠的位置:只允许左侧和顶部
dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::TopDockWidgetArea);
}
MainWindow::~MainWindow()
{
delete ui;
}
注意:QDockWidget 只能包含一个 QWidget 作为内容容器,要添加多个控件必须先创建一个 QWidget,设置布局后再添加其他控件。
5.3 停靠位置枚举值
Qt::LeftDockWidgetArea:停靠在左侧Qt::RightDockWidgetArea:停靠在右侧Qt::TopDockWidgetArea:停靠在顶部Qt::BottomDockWidgetArea:停靠在底部Qt::AllDockWidgetAreas:以上四个位置都可停靠Qt::NoDockWidgetArea:不允许停靠,只能浮动
6 ~> 对话框(QDialog)
6.1 基本概念
- 对话框是 GUI 程序中不可或缺的组成部分,用于实现短期任务或者简洁的用户交互。
- 对话框通常是一个顶层窗口,出现在程序最上层。
- Qt 中使用 QDialog 类表示对话框,它继承自 QWidget。
- Qt 提供了多种内置的标准对话框,也支持自定义对话框。
6.2 对话框的内存管理
每次点击按钮创建新的对话框时,如果不及时释放,会造成内存泄漏。正确的做法是设置对话框在关闭时自动释放:
cpp
void MainWindow::on_pushButton_clicked()
{
QDialog* dialog = new QDialog(this);
dialog->setWindowTitle("对话框的标题");
dialog->resize(400, 300);
dialog->show(); // 非模态显示
// 设置关闭时自动释放
dialog->setAttribute(Qt::WA_DeleteOnClose);
}
错误做法 :在
show()之后直接delete dialog,会导致对话框一闪而过。
6.3 模态与非模态对话框
- 模态对话框 :弹出时用户无法操作父窗口,必须完成对话框内的操作并关闭后才能继续。使用
exec()方法显示。 - 非模态对话框 :弹出时用户可以同时操作父窗口。使用
show()方法显示。
cpp
// 模态对话框
QDialog* dialog = new QDialog(this);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->exec(); // 代码会在这里阻塞,直到对话框关闭
// 非模态对话框
QDialog* dialog = new QDialog(this);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->show(); // 代码继续执行
6.4 自定义对话框
有两种方式可以自定义对话框:纯代码方式和图形化 ui 方式。
6.4.1 纯代码方式
- 创建一个继承自 QDialog 的类
- 在类的构造函数中创建控件和布局
- 绑定信号槽实现交互功能
cpp
// dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget* parent = nullptr);
private slots:
void handleClose();
};
#endif // DIALOG_H
// dialog.cpp
#include "dialog.h"
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
Dialog::Dialog(QWidget* parent)
: QDialog(parent)
{
// 创建布局
QVBoxLayout* layout = new QVBoxLayout();
this->setLayout(layout);
// 创建控件
QLabel* label = new QLabel("这是一个对话框", this);
QPushButton* button = new QPushButton("关闭", this);
// 添加到布局
layout->addWidget(label);
layout->addWidget(button);
// 绑定信号槽
connect(button, &QPushButton::clicked, this, &Dialog::handleClose);
}
void Dialog::handleClose()
{
this->close();
}
// mainwindow.cpp 中调用
#include "dialog.h"
void MainWindow::on_pushButton_clicked()
{
Dialog* dialog = new Dialog(this);
dialog->resize(200, 100);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->show();
}
6.4.2 图形化 ui 方式
- 在 Qt Creator 中新建 "Qt 设计师界面类"
- 选择 "Dialog without Buttons" 模板
- 在 ui 设计器中拖拽控件并布局
- 右键点击控件,转到槽函数实现交互功能
6.5 标准内置对话框
Qt 提供了多种常用的标准对话框,无需自定义即可直接使用。
6.5.1 消息对话框 QMessageBox
用于显示提示信息并让用户进行简单选择,支持多种图标和按钮组合。
cpp
#include <QMessageBox>
#include <QDebug>
void MainWindow::on_pushButton_clicked()
{
// 方式一:创建对象并设置属性
QMessageBox* messageBox = new QMessageBox(this);
messageBox->setWindowTitle("对话框窗口标题");
messageBox->setText("这是对话框的文本");
messageBox->setIcon(QMessageBox::Warning); // 设置图标
messageBox->setStandardButtons(QMessageBox::Ok | QMessageBox::Save | QMessageBox::Cancel); // 设置按钮
// 显示模态对话框,获取用户点击的按钮
int result = messageBox->exec();
if (result == QMessageBox::Ok) {
qDebug() << "OK";
} else if (result == QMessageBox::Save) {
qDebug() << "Save";
} else if (result == QMessageBox::Cancel) {
qDebug() << "Cancel";
}
messageBox->setAttribute(Qt::WA_DeleteOnClose);
// 方式二:使用静态函数(更简便)
int result2 = QMessageBox::warning(this, "对话框标题", "对话框文本", QMessageBox::Ok | QMessageBox::Cancel);
if (result2 == QMessageBox::Ok) {
qDebug() << "Ok";
} else if (result2 == QMessageBox::Cancel) {
qDebug() << "Cancel";
}
}
图标类型:
QMessageBox::NoIcon:无图标QMessageBox::Information:信息图标QMessageBox::Warning:警告图标QMessageBox::Critical:严重错误图标QMessageBox::Question:询问图标
6.5.2 颜色对话框 QColorDialog
用于让用户选择颜色,返回 QColor 对象。
cpp
#include <QColorDialog>
#include <QDebug>
void MainWindow::on_pushButton_clicked()
{
// 弹出颜色选择对话框,默认绿色
QColor color = QColorDialog::getColor(QColor(0, 255, 0), this, "选择颜色");
qDebug() << color;
// 基于选择的颜色修改窗口背景色
char style[1024] = {0};
sprintf(style, "background-color: rgb(%d, %d, %d);", color.red(), color.green(), color.blue());
this->setStyleSheet(style);
}
6.5.3 文件对话框 QFileDialog
用于让用户选择文件或保存文件,返回文件路径。
cpp
#include <QFileDialog>
#include <QDebug>
void MainWindow::on_pushButton_clicked()
{
// 打开单个文件
QString filePath = QFileDialog::getOpenFileName(this, "打开文件", "", "所有文件(*.*);;文本文件(*.txt)");
qDebug() << "打开文件:" << filePath;
// 保存文件
QString savePath = QFileDialog::getSaveFileName(this, "保存文件", "", "所有文件(*.*);;文本文件(*.txt)");
qDebug() << "保存文件:" << savePath;
}
6.5.4 字体对话框 QFontDialog
用于让用户选择字体,返回 QFont 对象。
cpp
#include <QFontDialog>
#include <QDebug>
void MainWindow::on_pushButton_clicked()
{
bool ok = false;
// 弹出字体选择对话框
QFont font = QFontDialog::getFont(&ok, QFont("华文行楷", 36), this, "选择字体");
if (ok) {
qDebug() << "字体:" << font.family();
qDebug() << "字号:" << font.pointSize();
qDebug() << "加粗:" << font.bold();
qDebug() << "倾斜:" << font.italic();
// 将选择的字体应用到按钮
ui->pushButton->setFont(font);
}
}
6.5.5 输入对话框 QInputDialog
用于让用户输入数据,支持整数、浮点数和字符串(下拉选择)。
cpp
#include <QInputDialog>
#include <QDebug>
void MainWindow::on_pushButton_clicked()
{
// 输入整数
int intValue = QInputDialog::getInt(this, "整数输入", "请输入一个整数:", 0, -100, 100, 1);
qDebug() << "输入的整数:" << intValue;
// 输入浮点数
double doubleValue = QInputDialog::getDouble(this, "浮点数输入", "请输入一个浮点数:", 0.0, -100.0, 100.0, 2);
qDebug() << "输入的浮点数:" << doubleValue;
// 下拉选择字符串
QStringList items;
items << "选项1" << "选项2" << "选项3" << "选项4";
QString item = QInputDialog::getItem(this, "条目选择", "请选择一个条目:", items, 0, false);
qDebug() << "选择的条目:" << item;
}
7 ~> QT窗口小结
Qt 窗口开发的核心是 QMainWindow 类,它提供了一套完整的标准化布局,包含了构建专业桌面应用所需的所有标准组件。通过合理组合这些组件,可以快速搭建出功能完善、交互友好的应用程序。
7.1 核心组件总结
| 组件 | 对应类 | 数量限制 | 主要作用 |
|---|---|---|---|
| 菜单栏 | QMenuBar | 全局唯一 | 提供结构化的功能访问入口 |
| 工具栏 | QToolBar | 可多个 | 提供常用功能的快捷访问 |
| 浮动窗口 | QDockWidget | 可多个 | 放置辅助功能面板 |
| 状态栏 | QStatusBar | 全局唯一 | 显示程序状态信息 |
| 中心部件 | QWidget | 唯一且必填 | 展示应用程序的核心内容 |
| 对话框 | QDialog | 无限制 | 实现短期任务和用户交互 |
7.2 关键知识点回顾
- QAction 的统一作用:QAction 是菜单和工具栏的核心操作单元,一个 QAction 可以同时绑定到菜单和工具栏,实现功能复用,避免代码冗余。
- 内存管理 :
- 使用
this->menuBar()和this->statusBar()获取已存在的对象,避免手动 new 造成内存泄漏。 - 对话框必须设置
Qt::WA_DeleteOnClose属性,确保关闭时自动释放。
- 使用
- 模态与非模态 :
- 模态对话框使用
exec()显示,会阻塞代码执行,适合需要用户立即处理的关键操作。 - 非模态对话框使用
show()显示,不会阻塞代码执行,适合辅助功能。
- 模态对话框使用
- 组件嵌套规则 :
- QDockWidget 只能包含一个 QWidget 作为内容容器,要添加多个控件必须先创建布局。
- 状态栏的
addPermanentWidget()添加的控件不会被临时消息覆盖。
7.3 开发流程总结
- 创建 QMainWindow 主窗口
- 设置中心部件,实现核心功能
- 创建菜单栏,添加菜单和菜单项
- 创建工具栏,添加常用功能的快捷按钮
- 创建状态栏,添加状态信息和小控件
- 根据需要创建浮动窗口,放置辅助功能面板
- 实现对话框,处理用户交互和短期任务
- 为所有交互组件绑定信号槽,实现功能逻辑
tusBar | 全局唯一 | 显示程序状态信息 |
| 中心部件 | QWidget | 唯一且必填 | 展示应用程序的核心内容 |
| 对话框 | QDialog | 无限制 | 实现短期任务和用户交互 |
7.2 关键知识点回顾
- QAction 的统一作用:QAction 是菜单和工具栏的核心操作单元,一个 QAction 可以同时绑定到菜单和工具栏,实现功能复用,避免代码冗余。
- 内存管理 :
- 使用
this->menuBar()和this->statusBar()获取已存在的对象,避免手动 new 造成内存泄漏。 - 对话框必须设置
Qt::WA_DeleteOnClose属性,确保关闭时自动释放。
- 使用
- 模态与非模态 :
- 模态对话框使用
exec()显示,会阻塞代码执行,适合需要用户立即处理的关键操作。 - 非模态对话框使用
show()显示,不会阻塞代码执行,适合辅助功能。
- 模态对话框使用
- 组件嵌套规则 :
- QDockWidget 只能包含一个 QWidget 作为内容容器,要添加多个控件必须先创建布局。
- 状态栏的
addPermanentWidget()添加的控件不会被临时消息覆盖。
7.3 开发流程总结
- 创建 QMainWindow 主窗口
- 设置中心部件,实现核心功能
- 创建菜单栏,添加菜单和菜单项
- 创建工具栏,添加常用功能的快捷按钮
- 创建状态栏,添加状态信息和小控件
- 根据需要创建浮动窗口,放置辅助功能面板
- 实现对话框,处理用户交互和短期任务
- 为所有交互组件绑定信号槽,实现功能逻辑
通过掌握以上知识点,你已经具备了开发完整 Qt 桌面应用界面的能力。在实际开发中,可以根据应用程序的需求,灵活组合这些组件,打造出符合用户习惯的专业级应用。
结尾
uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ### 艾莉丝努力练剑 C/C++ & Linux 底层探索者 | 一个正在努力练剑的技术博主 *** ** * ** *** 👀 【关注】 跟随我一起深耕技术领域,见证每一次成长。 ❤️ 【点赞】 让优质内容被更多人看见,让知识传递更有力量。 ⭐ 【收藏】 把核心知识点存好,在需要时随时查、随时用。 💬 【评论】 分享你的经验或疑问,评论区一起交流避坑! 不要忘记给博主"一键四连"哦! "今日练剑达成!"
"技术之路难免有困惑,但同行的人会让前进更有方向。" |
结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主"一键四连"哦!
往期回顾:
🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡 ૮₍ ˶ ˊ ᴥ ˋ˶₎ა
