【Qt】窗口
本文系统介绍了Qt窗口体系的核心概念和主要组件。首先概述了Qt窗口类的基本层级关系,包括QWidget、QMainWindow和QDialog等基础类。重点讲解了QMainWindow的五大核心组件:菜单栏(QMenuBar)、工具栏(QToolBar)、状态栏(QStatusBar)、浮动窗口(QDockWidget)和中心部件(Central Widget),通过代码示例展示了各组件的创建和使
目录
一、Qt窗口概述
1.1 核心窗口类
1.2 QMainWindow 结构
1.3 窗口与控件的关系
二、QMainWindow 核心组件
2.1 菜单栏(QMenuBar)
2.2 工具栏(QToolBar)
2.3 状态栏(QStatusBar)
2.4 浮动窗口(QDockWidget)
2.5 中心部件(Central Widget)
三、对话框(QDialog)
3.1 对话框分类
3.2 模态对话框
3.3 非模态对话框
3.4 Qt 内置对话框
四、窗口相关属性与方法
4.1 窗口基础属性
4.2 窗口大小与位置
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 对象,可复用(同时用于菜单栏和工具栏)。
简单示例:创建菜单栏与菜单项
#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)、按钮等控件,支持拖拽、停靠和浮动。
核心特性:
- 一个主窗口可有多个工具栏;
- 支持停靠在窗口上下左右四个方向,或脱离窗口浮动;
- 可设置是否允许移动、浮动。
简单示例:创建工具栏
#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)
状态栏位于主窗口底部,用于显示程序状态信息(如实时提示、永久信息、进度条),一个主窗口最多只能有一个状态栏。
核心特性:
- 支持临时消息(自动消失)、永久消息(一直显示);
- 可添加标签、进度条等控件。
简单示例:创建状态栏
#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)
浮动窗口(铆接部件)是依附于主窗口的可拖拽容器,位于中心部件周围,支持停靠和浮动,可用于显示辅助内容(如项目列表、属性面板)。
核心特性:
- 支持停靠在中心部件的上下左右四个方向;
- 可设置允许的停靠位置;
- 内部可添加任意控件或布局。
简单示例:创建浮动窗口
#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)或布局管理器(包含多个控件)。
简单示例:设置中心部件
#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)。
简单示例:自定义模态对话框
// 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 属性,关闭时自动释放内存)。
简单示例:创建非模态对话框
// 在主窗口中添加
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)
用于显示提示、警告、错误、询问等消息,支持自定义按钮。
#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)
用于打开或保存文件,支持文件过滤、多文件选择。
#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):选择颜色;
QColor color = QColorDialog::getColor(Qt::red, this, "选择颜色"); - 字体对话框(QFontDialog):选择字体;
bool ok; QFont font = QFontDialog::getFont(&ok, QFont("微软雅黑", 12), this, "选择字体"); - 输入对话框(QInputDialog):获取用户输入(整数、字符串、下拉列表)。
QString text = QInputDialog::getText(this, "输入姓名", "请输入你的姓名:"); int age = QInputDialog::getInt(this, "输入年龄", "请输入你的年龄:", 18, 0, 100, 1);
四、窗口相关属性与方法
4.1 窗口基础属性
QWidget 提供了窗口的核心属性,可通过代码或 Qt Designer 配置:
// 设置窗口标题
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 窗口大小与位置
// 设置固定大小(不可缩放)
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 窗口状态控制
// 最大化窗口
this->showMaximized();
// 最小化窗口
this->showMinimized();
// 还原窗口
this->showNormal();
// 全屏显示
this->showFullScreen();
// 判断窗口状态
bool isMax = this->isMaximized();
bool isMin = this->isMinimized();
更多推荐
所有评论(0)