目录
[1.1 核心窗口类](#1.1 核心窗口类)
[1.2 QMainWindow 结构](#1.2 QMainWindow 结构)
[1.3 窗口与控件的关系](#1.3 窗口与控件的关系)
[二、QMainWindow 核心组件](#二、QMainWindow 核心组件)
[2.1 菜单栏(QMenuBar)](#2.1 菜单栏(QMenuBar))
[2.2 工具栏(QToolBar)](#2.2 工具栏(QToolBar))
[2.3 状态栏(QStatusBar)](#2.3 状态栏(QStatusBar))
[2.4 浮动窗口(QDockWidget)](#2.4 浮动窗口(QDockWidget))
[2.5 中心部件(Central Widget)](#2.5 中心部件(Central Widget))
三、对话框(QDialog)
[3.1 对话框分类](#3.1 对话框分类)
[3.2 模态对话框](#3.2 模态对话框)
[3.3 非模态对话框](#3.3 非模态对话框)
[3.4 Qt 内置对话框](#3.4 Qt 内置对话框)
四、窗口相关属性与方法
[4.1 窗口基础属性](#4.1 窗口基础属性)
[4.2 窗口大小与位置](#4.2 窗口大小与位置)
[4.3 窗口状态控制](#4.3 窗口状态控制)
五、小结
一、Qt窗口概述
Qt 提供了完善的窗口体系,用于构建图形界面程序的顶层容器。窗口是 Qt 应用程序的核心载体,所有控件(如按钮、输入框)都需要依附于窗口存在。Qt 中提供了多个窗口相关类,其中 QMainWindow 是最常用的主窗口类,适用于复杂应用程序;QWidget 可作为基础窗口或容器;QDialog 专门用于对话框场景。
1.1 核心窗口类
Qt 窗口类均继承自 QWidget,核心类关系如下:
- QWidget:所有窗口和控件的基类,可作为独立窗口或容器控件;
- QMainWindow:继承自 QWidget,提供预定义布局(包含菜单栏、工具栏、状态栏等),适用于主程序窗口;
- QDialog:继承自 QWidget,专门用于对话框,支持模态/非模态显示,无菜单栏和工具栏。
1.2 QMainWindow 结构
QMainWindow 是 Qt 主窗口程序的首选类,其预定义布局包含以下核心组件,位置分布如下:

1.3 窗口与控件的关系
- 窗口是顶层容器,可独立显示(有标题栏、最小化/最大化/关闭按钮);
- 控件是子元素,需依附于窗口或其他容器控件(如 QGroupBox),不能独立存在;
- 窗口可包含多个控件,通过布局管理器(如 QVBoxLayout)管理控件位置和大小;
- 控件的交互(如点击按钮)可通过信号与槽机制触发窗口的行为(如关闭窗口)。
二、QMainWindow 核心组件
QMainWindow 封装了主窗口常用的核心组件,无需手动布局,直接调用对应 API 即可添加和配置。
2.1 菜单栏(QMenuBar)
菜单栏是主窗口顶部的命令集合,一个主窗口最多只能有一个菜单栏,包含多个菜单(QMenu),每个菜单又包含多个菜单项(QAction)。
核心特性:
- 菜单项支持快捷键、分隔线、子菜单;
- 菜单项本质是 QAction 对象,可复用(同时用于菜单栏和工具栏)。
简单示例:创建菜单栏与菜单项
cpp
#include "mainwindow.h"
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
this->setWindowTitle("QMainWindow 示例");
this->resize(800, 600);
// 1. 创建菜单栏(两种方式)
QMenuBar *menuBar = this->menuBar(); // 方式1:使用 QMainWindow 内置方法
// QMenuBar *menuBar = new QMenuBar(this); // 方式2:手动创建
this->setMenuBar(menuBar);
// 2. 创建菜单
QMenu *fileMenu = menuBar->addMenu("文件(&F)"); // &F 表示快捷键 Alt+F
QMenu *editMenu = menuBar->addMenu("编辑(&E)");
// 3. 创建菜单项
QAction *newAction = new QAction("新建(&N)", this);
QAction *openAction = new QAction("打开(&O)", this);
QAction *saveAction = new QAction("保存(&S)", this);
QAction *exitAction = new QAction("退出(&Q)", this);
// 设置快捷键
newAction->setShortcut(QKeySequence("Ctrl+N"));
exitAction->setShortcut(QKeySequence("Ctrl+Q"));
// 4. 添加菜单项到菜单,添加分隔线
fileMenu->addAction(newAction);
fileMenu->addAction(openAction);
fileMenu->addAction(saveAction);
fileMenu->addSeparator(); // 分隔线
fileMenu->addAction(exitAction);
// 5. 关联菜单项点击信号
connect(exitAction, &QAction::triggered, this, &QMainWindow::close);
connect(newAction, &QAction::triggered, this, [](){
qDebug() << "新建文件";
});
}
2.2 工具栏(QToolBar)
工具栏是主窗口的快捷操作区域,可包含菜单项(QAction)、按钮等控件,支持拖拽、停靠和浮动。
核心特性:
- 一个主窗口可有多个工具栏;
- 支持停靠在窗口上下左右四个方向,或脱离窗口浮动;
- 可设置是否允许移动、浮动。
简单示例:创建工具栏
cpp
#include <QToolBar>
#include <QPushButton>
// 在 MainWindow 构造函数中添加
// 1. 创建工具栏并设置停靠位置(默认顶部)
QToolBar *toolBar = new QToolBar("工具条", this);
this->addToolBar(Qt::TopToolBarArea, toolBar); // 停靠在顶部
// 2. 设置工具栏属性
toolBar->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea); // 仅允许上下停靠
toolBar->setFloatable(false); // 不允许浮动
toolBar->setMovable(true); // 允许移动
// 3. 添加菜单项(复用菜单栏的 QAction)
toolBar->addAction(newAction);
toolBar->addAction(openAction);
toolBar->addSeparator();
toolBar->addAction(saveAction);
// 4. 添加自定义按钮
QPushButton *btn = new QPushButton("自定义按钮", toolBar);
toolBar->addWidget(btn);
// 关联按钮点击信号
connect(btn, &QPushButton::clicked, this, [](){
qDebug() << "工具栏自定义按钮被点击";
});
2.3 状态栏(QStatusBar)
状态栏位于主窗口底部,用于显示程序状态信息(如实时提示、永久信息、进度条),一个主窗口最多只能有一个状态栏。
核心特性:
- 支持临时消息(自动消失)、永久消息(一直显示);
- 可添加标签、进度条等控件。
简单示例:创建状态栏
cpp
#include <QStatusBar>
#include <QLabel>
// 在 MainWindow 构造函数中添加
// 1. 创建状态栏
QStatusBar *statusBar = this->statusBar();
this->setStatusBar(statusBar);
// 2. 显示临时消息(2000ms 后自动消失)
statusBar->showMessage("欢迎使用 Qt 窗口", 2000);
// 3. 添加永久消息(右侧显示)
QLabel *permanentLabel = new QLabel("Qt 5.14.2", this);
statusBar->addPermanentWidget(permanentLabel);
// 4. 关联菜单项,显示状态提示
connect(newAction, &QAction::hovered, this, [](){
statusBar->showMessage("新建一个空白文件", 1000);
});
2.4 浮动窗口(QDockWidget)
浮动窗口(铆接部件)是依附于主窗口的可拖拽容器,位于中心部件周围,支持停靠和浮动,可用于显示辅助内容(如项目列表、属性面板)。
核心特性:
- 支持停靠在中心部件的上下左右四个方向;
- 可设置允许的停靠位置;
- 内部可添加任意控件或布局。
简单示例:创建浮动窗口
cpp
#include <QDockWidget>
#include <QListWidget>
// 在 MainWindow 构造函数中添加
// 1. 创建浮动窗口
QDockWidget *dockWidget = new QDockWidget("项目列表", this);
this->addDockWidget(Qt::LeftDockWidgetArea, dockWidget); // 停靠在左侧
// 2. 设置允许的停靠位置
dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
// 3. 给浮动窗口添加内容(列表控件)
QListWidget *listWidget = new QListWidget(dockWidget);
listWidget->addItem("项目1");
listWidget->addItem("项目2");
listWidget->addItem("项目3");
dockWidget->setWidget(listWidget);
2.5 中心部件(Central Widget)
中心部件是 QMainWindow 的核心内容区域,一个主窗口只能有一个中心部件,可是单个控件(如 QTextEdit)或布局管理器(包含多个控件)。
简单示例:设置中心部件
cpp
#include <QTextEdit>
#include <QVBoxLayout>
#include <QPushButton>
// 在 MainWindow 构造函数中添加
// 方式1:直接设置单个控件
QTextEdit *textEdit = new QTextEdit("中心部件内容", this);
this->setCentralWidget(textEdit);
// 方式2:设置包含多个控件的布局
/*
QWidget *centralWidget = new QWidget(this);
this->setCentralWidget(centralWidget);
QVBoxLayout *layout = new QVBoxLayout(centralWidget);
QPushButton *btn1 = new QPushButton("按钮1", centralWidget);
QPushButton *btn2 = new QPushButton("按钮2", centralWidget);
layout->addWidget(btn1);
layout->addWidget(btn2);
*/
三、对话框(QDialog)
对话框是独立于主窗口的顶层窗口,用于短期任务或简洁交互(如文件选择、消息提示、参数设置),Qt 提供了 QDialog 基类和多个内置对话框。
3.1 对话框分类
根据交互方式,对话框分为两类:
| 类型 | 特点 | 适用场景 | 调用方式 |
|---|---|---|---|
| 模态对话框 | 显示后阻塞父窗口,必须关闭才能操作父窗口 | 消息提示、文件选择、确认操作 | exec() 方法 |
| 非模态对话框 | 显示后不阻塞父窗口,可同时操作父子窗口 | 查找面板、属性设置 | show() 方法 |
3.2 模态对话框
模态对话框是最常用的对话框类型,通过 exec() 方法调用,返回值表示用户操作结果(如 QDialog::Accepted / QDialog::Rejected)。
简单示例:自定义模态对话框
cpp
// 1. 新建 Qt 设计师界面类,基类选择 QDialog,创建 ui 文件
// 2. 在主窗口中调用对话框
#include "customdialog.h"
// 给菜单项添加点击信号
connect(openAction, &QAction::triggered, this, [](){
CustomDialog dialog(this); // 创建对话框,指定父窗口
dialog.setWindowTitle("打开文件");
// 模态显示,阻塞直到对话框关闭
int result = dialog.exec();
if (result == QDialog::Accepted) {
qDebug() << "用户点击了确定";
} else {
qDebug() << "用户点击了取消";
}
});
3.3 非模态对话框
非模态对话框通过 show() 方法调用,不会阻塞父窗口,但需注意内存管理(建议创建在堆上,并设置 Qt::WA_DeleteOnClose 属性,关闭时自动释放内存)。
简单示例:创建非模态对话框
cpp
// 在主窗口中添加
QPushButton *nonModalBtn = new QPushButton("非模态对话框", centralWidget);
layout->addWidget(nonModalBtn);
connect(nonModalBtn, &QPushButton::clicked, this, [this](){
// 堆上创建,避免栈上对象被销毁后窗口消失
QDialog *dialog = new QDialog(this);
dialog->setWindowTitle("非模态对话框");
dialog->resize(300, 200);
// 设置关闭时自动删除,避免内存泄漏
dialog->setAttribute(Qt::WA_DeleteOnClose);
// 非模态显示
dialog->show();
});
3.4 Qt 内置对话框
Qt 提供了多个常用内置对话框,无需自定义,直接调用静态方法即可使用,核心包括:
3.4.1 消息对话框(QMessageBox)
用于显示提示、警告、错误、询问等消息,支持自定义按钮。
cpp
#include <QMessageBox>
// 询问用户是否退出
connect(exitAction, &QAction::triggered, this, [this](){
int result = QMessageBox::question(this, "确认退出", "是否要退出程序?",
QMessageBox::Yes | QMessageBox::No,
QMessageBox::No); // 默认选中 No
if (result == QMessageBox::Yes) {
this->close();
}
});
// 显示错误消息
QMessageBox::critical(this, "错误", "文件打开失败!");
// 显示警告消息
QMessageBox::warning(this, "警告", "文件已修改,未保存!");
3.4.2 文件对话框(QFileDialog)
用于打开或保存文件,支持文件过滤、多文件选择。
cpp
#include <QFileDialog>
// 打开文件
QString fileName = QFileDialog::getOpenFileName(this, "打开文件",
"C:/Users", // 默认路径
"文本文件 (*.txt);;所有文件 (*.*)"); // 文件过滤
if (!fileName.isEmpty()) {
qDebug() << "选中的文件:" << fileName;
}
// 保存文件
QString saveFileName = QFileDialog::getSaveFileName(this, "保存文件",
"C:/Users/文档",
"文本文件 (*.txt)");
3.4.3 其他内置对话框
-
颜色对话框(QColorDialog) :选择颜色;
cppQColor color = QColorDialog::getColor(Qt::red, this, "选择颜色"); -
字体对话框(QFontDialog) :选择字体;
cppbool ok; QFont font = QFontDialog::getFont(&ok, QFont("微软雅黑", 12), this, "选择字体"); -
输入对话框(QInputDialog) :获取用户输入(整数、字符串、下拉列表)。
cppQString text = QInputDialog::getText(this, "输入姓名", "请输入你的姓名:"); int age = QInputDialog::getInt(this, "输入年龄", "请输入你的年龄:", 18, 0, 100, 1);
四、窗口相关属性与方法
4.1 窗口基础属性
QWidget 提供了窗口的核心属性,可通过代码或 Qt Designer 配置:
cpp
// 设置窗口标题
this->setWindowTitle("Qt 窗口示例");
// 设置窗口图标(需配合资源文件)
this->setWindowIcon(QIcon(":/images/icon.png"));
// 设置窗口透明度(0.0 全透明,1.0 不透明)
this->setWindowOpacity(0.9);
// 设置窗口是否可关闭
this->setWindowFlags(windowFlags() & ~Qt::WindowCloseButtonHint);
// 设置窗口置顶
this->setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
4.2 窗口大小与位置
cpp
// 设置固定大小(不可缩放)
this->setFixedSize(800, 600);
// 设置最小/最大尺寸
this->setMinimumSize(400, 300);
this->setMaximumSize(1200, 900);
// 设置窗口位置(屏幕坐标)
this->move(100, 100);
// 获取窗口位置和尺寸
QPoint pos = this->pos(); // 位置
QSize size = this->size(); // 尺寸
QRect rect = this->geometry(); // 位置+尺寸
4.3 窗口状态控制
cpp
// 最大化窗口
this->showMaximized();
// 最小化窗口
this->showMinimized();
// 还原窗口
this->showNormal();
// 全屏显示
this->showFullScreen();
// 判断窗口状态
bool isMax = this->isMaximized();
bool isMin = this->isMinimized();