在 Qt 桌面应用开发中,除了核心的菜单栏,工具栏、状态栏和浮动窗口也是构建专业级界面的关键组件。它们各司其职又相互配合:工具栏提供快捷操作入口,状态栏展示实时状态信息,浮动窗口则实现灵活的功能扩展。基于 QMainWindow 的模块化设计,这三个组件可以轻松集成,让应用界面既美观又实用。本文将从基础原理到实战开发,带你全面掌握这三大组件的使用技巧,打造出媲美专业软件的 Qt 窗口界面。下面就让我们正式开始吧!
QMainWindow 作为 Qt 主窗口的核心类,不仅提供了菜单栏支持,还内置了对工具栏(QToolBar)、状态栏(QStatusBar)和浮动窗口(QDockWidget)的完善支持。这三个组件与菜单栏、中央部件共同构成了 Qt 主窗口的 “五件套”,其布局位置如下:
这三个组件的设计遵循 “灵活复用、低耦合” 的原则,既可以独立使用,也能与其他组件联动(如工具栏与菜单栏共享 QAction 对象),极大提升了开发效率和用户体验。接下来,我们将逐一拆解每个组件的使用方法。
工具栏是应用程序中高频功能的快捷入口,通常以图标按钮的形式呈现,支持拖拽移动、浮动显示等特性。Qt 中的 QToolBar 类提供了丰富的 API,让开发者可以轻松定制工具栏的位置、样式和功能。
创建工具栏的核心是通过 QMainWindow 的 addToolBar () 函数将工具栏添加到主窗口,支持两种常见创建方式:
方式一:直接创建并添加(推荐)
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 1. 创建工具栏对象,指定父对象为主窗口
QToolBar *toolBar = new QToolBar(this);
// 2. 设置工具栏名称(用于区分多个工具栏,可选)
toolBar->setWindowTitle("主工具栏");
// 3. 将工具栏添加到主窗口(默认停靠在顶部)
this->addToolBar(toolBar);
// 验证创建成功(调试用)
qDebug() << "工具栏创建成功:" << toolBar->windowTitle();
}方式二:创建时指定默认停靠位置
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 1. 创建两个工具栏
QToolBar *toolBarLeft = new QToolBar("左侧工具栏", this);
QToolBar *toolBarRight = new QToolBar("右侧工具栏", this);
// 2. 添加时指定默认停靠位置(左侧和右侧)
this->addToolBar(Qt::LeftToolBarArea, toolBarLeft);
this->addToolBar(Qt::RightToolBarArea, toolBarRight);
// 3. 设置窗口大小,便于观察效果
this->resize(800, 600);
}两种方式对比:
工具栏的停靠位置是其核心特性之一,Qt 提供了两种设置方式:指定默认停靠位置和限制允许停靠的位置,满足不同场景需求。
Qt 定义了四个基础停靠位置枚举,可通过组合使用实现灵活配置:
如 2.1.2 中的方式二所示,通过 addToolBar () 的重载函数,在添加工具栏时直接指定初始停靠位置:
// 创建工具栏并指定默认停靠在底部
QToolBar *toolBarBottom = new QToolBar("底部工具栏", this);
this->addToolBar(Qt::BottomToolBarArea, toolBarBottom);通过 setAllowedAreas () 函数,可以限制工具栏只能在指定位置停靠,防止用户误操作改变布局:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 创建工具栏
QToolBar *toolBar = new QToolBar("受限工具栏", this);
this->addToolBar(toolBar);
// 仅允许停靠在左右两侧(禁止上下停靠)
toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
// 设置窗口大小
this->resize(800, 600);
}关键说明:
下面给大家提供一段完整的示例代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QToolBar>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QToolBar* toolBar1 = new QToolBar();
QToolBar* toolBar2 = new QToolBar();
this->addToolBar(toolBar1);
this->addToolBar(Qt::LeftToolBarArea, toolBar2); //靠在左侧
//仅允许停靠在左侧和右侧
toolBar2->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
//设置不允许浮动
toolBar2->setFloatable(false);
//设置不允许移动
toolBar2->setMovable(false);
QAction* action1 = new QAction("动作1");
QAction* action2 = new QAction("动作2");
QAction* action3 = new QAction("动作3");
QAction* action4 = new QAction("动作4");
toolBar1->addAction(action1);
toolBar1->addAction(action2);
toolBar2->addAction(action3);
toolBar2->addAction(action4);
}
MainWindow::~MainWindow()
{
delete ui;
}工具栏的浮动和移动属性直接影响用户体验,Qt 提供了专门的 API 进行控制,平衡灵活性和布局稳定性。
通过 setFloatable () 函数设置工具栏是否允许浮动(即从窗口分离为独立窗口):
示例代码:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 创建两个工具栏
QToolBar *toolBarFloat = new QToolBar("允许浮动", this);
QToolBar *toolBarNoFloat = new QToolBar("禁止浮动", this);
// 添加到主窗口(默认顶部)
this->addToolBar(toolBarFloat);
this->addToolBar(toolBarNoFloat);
// 设置浮动属性
toolBarFloat->setFloatable(true); // 允许浮动(默认)
toolBarNoFloat->setFloatable(false); // 禁止浮动
// 设置窗口大小
this->resize(800, 600);
}通过 setMovable () 函数设置工具栏是否允许用户拖拽移动:
示例代码:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QToolBar *toolBar = new QToolBar("固定工具栏", this);
this->addToolBar(Qt::TopToolBarArea, toolBar);
// 禁止移动(总开关)
toolBar->setMovable(false);
// 注意:禁止移动后,停靠位置设置将失效
toolBar->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea); // 无效
this->resize(800, 600);
}关键注意事项:
工具栏的核心是提供快捷操作,支持两种常见内容类型:QAction 对象(与菜单栏共享)和自定义控件(如 QPushButton、QComboBox 等)。
QAction 是 Qt 中动作的抽象表示,可同时用于菜单栏、工具栏和快捷键,实现功能复用。添加 QAction 到工具栏时,会自动显示为图标按钮(若设置了图标)或文本按钮。
示例代码:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 1. 创建工具栏
QToolBar *toolBar = new QToolBar("文件工具栏", this);
this->addToolBar(toolBar);
// 2. 创建QAction对象(可同时用于菜单栏)
QAction *actNew = new QAction(QIcon(":/icons/new.png"), "新建", this);
QAction *actOpen = new QAction(QIcon(":/icons/open.png"), "打开", this);
QAction *actSave = new QAction(QIcon(":/icons/save.png"), "保存", this);
// 设置快捷键(与菜单栏保持一致)
actNew->setShortcut(QKeySequence::New);
actOpen->setShortcut(QKeySequence::Open);
actSave->setShortcut(QKeySequence::Save);
// 设置提示信息(鼠标悬停时显示)
actNew->setToolTip("新建文件(Ctrl+N)");
actOpen->setToolTip("打开文件(Ctrl+O)");
actSave->setToolTip("保存文件(Ctrl+S)");
// 3. 添加QAction到工具栏
toolBar->addAction(actNew);
toolBar->addAction(actOpen);
// 添加分割线(分组功能,提升可读性)
toolBar->addSeparator();
toolBar->addAction(actSave);
// 4. 关联信号槽(触发动作)
connect(actNew, &QAction::triggered, this, [](){
qDebug() << "工具栏:新建文件";
});
connect(actOpen, &QAction::triggered, this, [](){
qDebug() << "工具栏:打开文件";
});
connect(actSave, &QAction::triggered, this, [](){
qDebug() << "工具栏:保存文件";
});
this->resize(800, 600);
}除了 QAction,工具栏还支持添加任意 QWidget 子类控件,满足复杂交互需求(如下拉选择、输入框等)。
示例代码:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 1. 创建工具栏
QToolBar *toolBar = new QToolBar("自定义工具栏", this);
this->addToolBar(toolBar);
// 2. 添加QPushButton
QPushButton *btnSettings = new QPushButton("设置", this);
toolBar->addWidget(btnSettings);
// 添加分割线
toolBar->addSeparator();
// 3. 添加QComboBox(字体选择)
QComboBox *cmbFont = new QComboBox(this);
cmbFont->addItems({"微软雅黑", "宋体", "黑体", "华文行楷"});
cmbFont->setCurrentText("微软雅黑");
toolBar->addWidget(cmbFont);
// 4. 添加QSpinBox(字号调整)
QSpinBox *spinFontSize = new QSpinBox(this);
spinFontSize->setRange(8, 72);
spinFontSize->setValue(12);
spinFontSize->setToolTip("调整字体大小");
toolBar->addWidget(spinFontSize);
// 5. 关联控件信号
connect(btnSettings, &QPushButton::clicked, this, [](){
qDebug() << "工具栏:打开设置对话框";
});
connect(cmbFont, &QComboBox::currentTextChanged, this, [](const QString &fontName){
qDebug() << "工具栏:选择字体" << fontName;
});
connect(spinFontSize, QOverload<int>::of(&QSpinBox::valueChanged), this, [](int size){
qDebug() << "工具栏:设置字号" << size;
});
this->resize(800, 600);
}效果说明:
Qt Style Sheets(QSS)是 Qt 的样式表技术,类似于 CSS,可快速定制工具栏的外观。通过 QSS 可以修改工具栏的背景色、按钮样式、分割线样式等。
示例代码:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 创建工具栏
QToolBar *toolBar = new QToolBar("样式化工具栏", this);
this->addToolBar(toolBar);
// 添加QAction
QAction *actNew = new QAction(QIcon(":/icons/new.png"), "新建", this);
QAction *actOpen = new QAction(QIcon(":/icons/open.png"), "打开", this);
QAction *actSave = new QAction(QIcon(":/icons/save.png"), "保存", this);
toolBar->addAction(actNew);
toolBar->addAction(actOpen);
toolBar->addSeparator();
toolBar->addAction(actSave);
// 设置QSS样式
toolBar->setStyleSheet(R"(
QToolBar {
background-color: #f5f5f5;
border: none;
border-bottom: 1px solid #dddddd;
padding: 4px;
}
QToolBar::handle {
background-color: #cccccc;
width: 8px;
}
QToolBar QAction {
margin: 0 4px;
padding: 6px 12px;
border-radius: 4px;
}
QToolBar QAction:hover {
background-color: #e0e0e0;
}
QToolBar QAction:pressed {
background-color: #d0d0d0;
}
QToolBar QSeparator {
background-color: #dddddd;
width: 1px;
margin: 4px 8px;
}
)");
this->resize(800, 600);
}样式说明:
状态栏位于主窗口底部,是展示应用程序状态信息的专用区域。一个主窗口最多只能有一个状态栏,支持显示实时消息、永久消息和进度提示等,是提升用户体验的重要组件。
状态栏的创建通过 QMainWindow 的 statusBar () 函数实现,该函数会自动创建状态栏(若尚未创建)并返回其指针,无需手动 new 实例。
示例代码:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 1. 获取或创建状态栏(唯一方式)
QStatusBar *statusBar = this->statusBar();
// 2. 验证创建成功
if (statusBar) {
qDebug() << "状态栏创建成功";
}
this->resize(800, 600);
}关键说明:
实时消息是状态栏最常用的功能,用于显示短期有效信息(如 “文件保存成功”“复制完成”),支持自动消失。通过 showMessage () 函数实现:
void QStatusBar::showMessage(const QString &text, int timeout = 0);MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 获取状态栏
QStatusBar *statusBar = this->statusBar();
// 1. 显示2秒后自动消失的消息
statusBar->showMessage("欢迎使用Qt状态栏演示", 2000);
// 2. 创建菜单栏和菜单项,触发实时消息
QMenuBar *menuBar = this->menuBar();
QMenu *menuFile = new QMenu("文件", menuBar);
QAction *actSave = new QAction("保存", menuFile);
menuFile->addAction(actSave);
menuBar->addMenu(menuFile);
// 点击“保存”时显示实时消息
connect(actSave, &QAction::triggered, this, [=](){
// 模拟保存操作
qDebug() << "文件保存成功";
// 显示3秒后自动消失的消息
statusBar->showMessage("文件保存成功", 3000);
});
this->resize(800, 600);
}若需要手动清除实时消息(如显示新消息前),可调用 clearMessage () 函数:
// 清除当前显示的实时消息
statusBar->clearMessage();永久消息用于显示长期有效信息(如程序版本号、版权信息、当前状态提示),不会自动消失。通过添加 QLabel 控件到状态栏实现,支持左右布局。
通过 addWidget () 函数添加控件到状态栏左侧,会按照添加顺序排列:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QStatusBar *statusBar = this->statusBar();
// 1. 创建左侧永久消息标签
QLabel *labelLeft = new QLabel("当前状态:就绪", this);
// 设置标签样式(可选)
labelLeft->setStyleSheet("color: #666666;");
// 添加到状态栏左侧
statusBar->addWidget(labelLeft);
// 2. 模拟状态变化(5秒后更新消息)
QTimer::singleShot(5000, this, [=](){
labelLeft->setText("当前状态:处理中");
labelLeft->setStyleSheet("color: #ff6600;");
});
this->resize(800, 600);
}通过 addPermanentWidget () 函数添加控件到状态栏右侧,始终靠右显示,不随左侧消息变化而移动:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QStatusBar *statusBar = this->statusBar();
// 左侧消息
QLabel *labelLeft = new QLabel("当前状态:就绪", this);
statusBar->addWidget(labelLeft);
// 右侧永久消息(版本信息)
QLabel *labelRight = new QLabel("版本:v1.0.0 | 作者:Qt学习爱好者", this);
labelRight->setStyleSheet("color: #999999;");
statusBar->addPermanentWidget(labelRight);
this->resize(800, 600);
}结合实时消息和永久消息,实现更丰富的状态展示:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QStatusBar *statusBar = this->statusBar();
// 左侧永久消息:状态提示
QLabel *labelStatus = new QLabel("就绪", this);
statusBar->addWidget(labelStatus, 1); // 第二个参数为拉伸因子,1表示占满剩余空间
// 右侧永久消息:版本信息
QLabel *labelVersion = new QLabel("v1.0.0", this);
statusBar->addPermanentWidget(labelVersion);
// 菜单栏触发实时消息
QMenuBar *menuBar = this->menuBar();
QMenu *menuEdit = new QMenu("编辑", menuBar);
QAction *actCopy = new QAction("复制", menuEdit);
menuEdit->addAction(actCopy);
menuBar->addMenu(menuEdit);
connect(actCopy, &QAction::triggered, this, [=](){
// 显示实时消息(覆盖左侧永久消息的临时区域)
statusBar->showMessage("已复制到剪贴板", 2000);
});
this->resize(800, 600);
}关键说明:
状态栏支持添加进度条,用于显示耗时任务的进度(如文件下载、数据处理),提升用户等待体验。通过添加 QProgressBar 控件实现:
示例代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#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);
//显示一个临时的信息
//statusBar->showMessage("这是一个状态消息", 3000); //三秒后消息自动消失
//给状态栏中添加一个子控件
QLabel* label = new QLabel("这是一个Qlabel");
statusBar->addWidget(label);
// QLabel* label2 = new QLabel("这是另一个Qlabel");
// statusBar->addWidget(label2, 2);
QProgressBar* progressBar = new QProgressBar();
progressBar->setRange(0, 100);
progressBar->setValue(50);
statusBar->addWidget(progressBar);
QPushButton* button = new QPushButton("按钮");
statusBar->addPermanentWidget(button);
}
MainWindow::~MainWindow()
{
delete ui;
}效果说明:
浮动窗口(又称铆接部件)是 Qt 中实现灵活布局的核心组件,围绕中央部件分布,支持停靠、浮动、隐藏等特性。常用于放置辅助功能模块(如文件浏览器、属性设置面板),用户可根据需求调整其位置或隐藏,提升界面利用率。
浮动窗口通过 QDockWidget 类动态创建,需指定窗口标题和父对象,然后通过 addDockWidget () 函数添加到主窗口。
示例代码:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 1. 创建中央部件(必须,否则浮动窗口无停靠基准)
QTextEdit *centralWidget = new QTextEdit("中央编辑区域", this);
this->setCentralWidget(centralWidget);
// 2. 创建浮动窗口(指定标题和父对象)
QDockWidget *dockWidget = new QDockWidget("浮动窗口1", this);
// 3. 为浮动窗口添加内容(必须,否则窗口为空)
QListWidget *listWidget = new QListWidget(dockWidget);
listWidget->addItems({"文件1.txt", "文件2.txt", "文件3.txt"});
dockWidget->setWidget(listWidget);
// 4. 添加到主窗口,指定默认停靠位置(左侧)
this->addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
this->resize(800, 600);
}关键注意事项:
与工具栏类似,浮动窗口的停靠位置通过枚举值控制,支持指定默认停靠位置和限制允许停靠的位置。
通过 addDockWidget () 函数的第一个参数,指定浮动窗口的初始停靠位置:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 中央部件
QTextEdit *centralWidget = new QTextEdit("中央编辑区域", this);
this->setCentralWidget(centralWidget);
// 创建三个浮动窗口,分别停靠在不同位置
QDockWidget *dockLeft = new QDockWidget("左侧面板", this);
QDockWidget *dockRight = new QDockWidget("右侧面板", this);
QDockWidget *dockBottom = new QDockWidget("底部面板", this);
// 为每个浮动窗口添加内容
dockLeft->setWidget(new QListWidget(this));
dockRight->setWidget(new QTreeWidget(this));
dockBottom->setWidget(new QTableWidget(this));
// 添加到主窗口,指定默认位置
this->addDockWidget(Qt::LeftDockWidgetArea, dockLeft);
this->addDockWidget(Qt::RightDockWidgetArea, dockRight);
this->addDockWidget(Qt::BottomDockWidgetArea, dockBottom);
this->resize(800, 600);
}通过 setAllowedAreas () 函数,限制浮动窗口只能在指定位置停靠,避免用户误操作改变布局:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 中央部件
QTextEdit *centralWidget = new QTextEdit("中央编辑区域", this);
this->setCentralWidget(centralWidget);
// 创建浮动窗口
QDockWidget *dockWidget = new QDockWidget("受限浮动窗口", this);
dockWidget->setWidget(new QListWidget(this));
// 添加到主窗口,默认停靠在顶部
this->addDockWidget(Qt::TopDockWidgetArea, dockWidget);
// 限制只能停靠在上下两个位置
dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
this->resize(800, 600);
}关键说明:
以下是浮动窗口创建的演示:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDockWidget>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//给主窗口添加一个子窗口
QDockWidget* dockWidget = new QDockWidget();
//使用addDockWidget方法,把浮动窗口加入到子窗口中
this->addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
//浮动窗口也是可以设置标题的
dockWidget->setWindowTitle("这是浮动窗口");
//给浮动窗口内部添加一些其他控件
//不能直接给这个浮动窗口添加子控件,而是需要创建出一个单独的QWidget,把要添加的控件加入到QWidget中
//然后再把这个QWidet设置到dockWidget中
QWidget* container = new QWidget();
dockWidget->setWidget(container);
//创建布局管理器,把布局管理器设置到QWidget中
QVBoxLayout* layout = new QVBoxLayout;
container->setLayout(layout);
//创建其他控件,添加到layout中
QLabel* label = new QLabel("这是一个QLabel");
QPushButton* button = new QPushButton("这是按钮");
layout->addWidget(label);
layout->addWidget(button);
//设置浮动窗口允许停靠的位置
dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::TopDockWidgetArea);
}
MainWindow::~MainWindow()
{
delete ui;
}当多个浮动窗口停靠在同一区域时,可通过 tabifyDockWidget () 函数将其合并为标签页式布局,节省空间。
示例代码:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 中央部件
QTextEdit *centralWidget = new QTextEdit("中央编辑区域", this);
this->setCentralWidget(centralWidget);
// 创建三个浮动窗口
QDockWidget *dock1 = new QDockWidget("文件面板", this);
QDockWidget *dock2 = new QDockWidget("属性面板", this);
QDockWidget *dock3 = new QDockWidget("日志面板", this);
// 添加内容
dock1->setWidget(new QListWidget(this));
dock2->setWidget(new QTreeWidget(this));
dock3->setWidget(new QTextEdit("日志内容...", this));
// 全部停靠在右侧
this->addDockWidget(Qt::RightDockWidgetArea, dock1);
this->addDockWidget(Qt::RightDockWidgetArea, dock2);
this->addDockWidget(Qt::RightDockWidgetArea, dock3);
// 合并为标签页式布局(dock1作为主标签页)
this->tabifyDockWidget(dock1, dock2);
this->tabifyDockWidget(dock1, dock3);
// 设置默认激活的标签页
dock1->raise();
this->resize(800, 600);
}效果说明:
浮动窗口支持通过 setVisible () 函数或 toggleViewAction () 函数隐藏 / 显示,也可通过菜单栏或工具栏控制其状态。
示例代码:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 中央部件
QTextEdit *centralWidget = new QTextEdit("中央编辑区域", this);
this->setCentralWidget(centralWidget);
// 创建浮动窗口
QDockWidget *dockWidget = new QDockWidget("可隐藏面板", this);
dockWidget->setWidget(new QListWidget(this));
this->addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
// 菜单栏控制显示/隐藏
QMenuBar *menuBar = this->menuBar();
QMenu *menuView = new QMenu("视图", menuBar);
menuBar->addMenu(menuView);
// 获取浮动窗口的切换动作(自动创建,绑定显示/隐藏功能)
QAction *actToggleDock = dockWidget->toggleViewAction();
actToggleDock->setText("显示/隐藏面板");
actToggleDock->setShortcut(Qt::Key_F9);
menuView->addAction(actToggleDock);
// 工具栏控制显示/隐藏
QToolBar *toolBar = new QToolBar(this);
this->addToolBar(toolBar);
toolBar->addAction(actToggleDock);
this->resize(800, 600);
}效果说明:
默认情况下,浮动窗口标题栏有关闭按钮,用户可关闭窗口。若需要禁止关闭,可通过设置窗口标志实现:
// 禁止浮动窗口关闭(保留最小化、最大化按钮)
dockWidget->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable);
// 或只允许停靠和移动,禁止浮动和关闭
dockWidget->setFeatures(QDockWidget::DockWidgetMovable);QDockWidget 常用功能标志:
浮动窗口的核心价值是辅助中央部件实现功能,通过信号槽机制可实现两者的联动(如选择浮动窗口中的文件,中央部件显示文件内容)。
示例代码:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 1. 创建中央部件(文本编辑区域)
QTextEdit *centralEdit = new QTextEdit(this);
centralEdit->setPlaceholderText("选择左侧文件查看内容...");
this->setCentralWidget(centralEdit);
// 2. 创建浮动窗口(文件列表)
QDockWidget *dockFile = new QDockWidget("文件列表", this);
QListWidget *fileList = new QListWidget(dockFile);
fileList->addItems({"文件1.txt", "文件2.txt", "文件3.txt"});
dockFile->setWidget(fileList);
this->addDockWidget(Qt::LeftDockWidgetArea, dockFile);
// 3. 创建第二个浮动窗口(文件属性)
QDockWidget *dockProp = new QDockWidget("文件属性", this);
QTableWidget *propTable = new QTableWidget(3, 2, dockProp);
propTable->setHorizontalHeaderLabels({"属性", "值"});
propTable->setItem(0, 0, new QTableWidgetItem("文件名"));
propTable->setItem(1, 0, new QTableWidgetItem("大小"));
propTable->setItem(2, 0, new QTableWidgetItem("修改时间"));
dockProp->setWidget(propTable);
this->addDockWidget(Qt::RightDockWidgetArea, dockProp);
// 4. 联动:选择文件列表项,更新中央部件和属性面板
connect(fileList, &QListWidget::currentItemChanged, this, [=](QListWidgetItem *current){
if (!current) return;
// 中央部件显示文件内容
QString fileName = current->text();
centralEdit->setText(QString("当前打开文件:%1\n文件内容示例...").arg(fileName));
// 属性面板更新信息
propTable->setItem(0, 1, new QTableWidgetItem(fileName));
propTable->setItem(1, 1, new QTableWidgetItem("1024 KB"));
propTable->setItem(2, 1, new QTableWidgetItem(QDateTime::currentDateTime().toString()));
});
this->resize(800, 600);
}效果说明:
Qt 的组件化设计理念让开发者可以快速构建功能完善的桌面应用,建议在实际开发中多尝试不同的组件组合,根据应用场景合理配置布局和功能,打造出既美观又实用的 Qt 应用程序。 如果你在开发过程中遇到问题,欢迎在评论区留言交流。也可以参考 Qt 官方文档(https://doc.qt.io/qt-5/)获取更详细的 API 说明和示例代码。