上节课我们完成了 Qt 菜单栏的基础搭建,让程序具备了核心的功能入口框架。本节课将在此基础上,带大家学习工具条(QToolBar)的搭建 ------ 工具条作为菜单栏功能的快捷入口,能极大提升用户操作效率,是 Qt 桌面应用的核心组件之一。
核心类介绍
在 Qt 中搭建工具条,核心依赖以下 3 个类,理解它们的作用和关联关系是实现功能的关键:
1. QToolBar 核心类
工具条的容器载体,负责管理工具按钮、分隔符等组件,支持拖拽、浮动、隐藏等默认行为。
2. QAction 功能动作类
QAction 是 Qt 的 "动作抽象",同一个 QAction 可同时关联到菜单栏、工具条、右键菜单,实现 "一处定义,多处使用"(比如 "打开文件" 动作,既可以在菜单栏的 "文件" 菜单中,也可以在工具条上显示)。
3. QIcon 图标类
为工具条按钮提供图标资源,提升界面美观度和辨识度。通过 QIcon("图标路径") 加载本地图标文件(支持 png、jpg、svg 等格式)。
工具条实战
实战内容
本节课的实战内容是在上一节课的基础上,创建一个工具条,要求:
1、工具条上放置两个按钮,分别是"新建项目"、"打开项目";
2、工具条默认显示在窗口顶部,但支持拖拽停靠到其他区域;
3、工具条上的按钮以图标的形式显示,并且在图标下放显示出操作的名称;
实战步骤
头文件引入
只需要引入QToolBar的头文件即可,<QAction>头文件上节课我们已经引入,且<QAction>头文件会间接包含QIcon的 "前向声明"(class QIcon;),足以支持 "使用返回值类型" 这种场景,因此无需单独引入<QIcon>。
cpp
#include <QToolBar>
同样,我们也为工具条的实现创建一个单独的函数createToolBar(),集中编写工具条的逻辑,这样会让代码结构更整洁。
createToolBar()的实现
根据官方文档中QToolBar的构造函数,创建工具条,并设置工具条的样式,如下:
cpp
QToolBar *mainToolBar = new QToolBar(QStringLiteral("工具条"));
mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
我们看一下官方文档中setToolButtonStyle函数显示样式参数的枚举值都有哪些:
- Qt::ToolButtonIconOnly:只显示图标。
- Qt::ToolButtonTextOnly:只显示文字。
- Qt::ToolButtonTextBesideIcon:文字显示在图标旁边。
- Qt::ToolButtonTextUnderIcon:文字显示在图标下方。
- Qt::ToolButtonFollowStyle:遵循系统或样式表的默认设置。
可以换几个其他的显示样式,运行看看效果。
接下来,我们需要将工具条加入到主窗体中,这里需要用到QMainWindow类的**addToolBar** (Qt::ToolBarArea area , QToolBar *toolbar) 函数,其中第一个参数是工具条的显示区域,第二个参数是工具条对象。我们来看一下Qt::ToolBarArea的枚举值:
- Qt::LeftToolBarArea 左侧区域,工具栏垂直显示在窗口左侧
- Qt::RightToolBarArea 右侧区域,工具栏垂直显示在窗口右侧
- Qt::TopToolBarArea 顶部区域,工具栏水平显示在窗口顶部
- Qt::BottomToolBarArea 底部区域,工具栏水平显示在窗口底部
- Qt::AllToolBarAreas 所有区域,允许工具栏停靠在任何位置
- Qt::NoToolBarArea 无区域,工具栏无法停靠,通常用于浮动工具栏
本项目我们要将工具条添加到顶部区域,所以代码如下:
cpp
addToolBar(Qt::TopToolBarArea, mainToolBar);
接下来,我们把"新建项目"、"打开项目"两个操作项加入到工具条中,因为这两个QAction操作已经在前面定义过了,我们需要将这两个变量先改为全局成员变量,然后直接通过addAction函数添加至工具条即可。
cpp
mainToolBar->addAction(createProjAct);
mainToolBar->addAction(openProjAct);
记得将createToolBar()函数加入到构造函数中调用一下,这样就可以运行测试效果了。

此时我们看到工具条默认显示在了窗口的顶部,我们拖拽移动工具条,可以将工具条拖放至窗口的上下左右任意一边。当然我们也可以限制工具条的显示位置,比如只允许显示在顶部和底部,可以这样进行设置:
cpp
mainToolBar->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea);
工具条的核心价值在于 "快捷操作",后续课程我们将为这些按钮添加实际的操作逻辑。如果大家在实战中遇到问题(如图标不显示、快捷键无效),或想扩展工具条功能,可以自行查阅官方文档进行练习,或者留言交流。
附录
SubCfgTool.h代码:
cpp
#pragma once
#include <QtWidgets/QMainWindow>
//#include "ui_SubCfgTool.h"
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QToolBar>
class SubCfgTool : public QMainWindow
{
Q_OBJECT
public:
SubCfgTool(QWidget *parent = nullptr);
~SubCfgTool();
void createMenuBar();
void createToolBar();
private:
QAction* createProjAct;
QAction* openProjAct;
QAction* quitAct;
};
SubCfgTool.cpp代码:
cpp
#include "SubCfgTool.h"
SubCfgTool::SubCfgTool(QWidget *parent)
: QMainWindow(parent)
{
// ui.setupUi(this);
createMenuBar();
createToolBar();
}
SubCfgTool::~SubCfgTool()
{}
void SubCfgTool::createMenuBar()
{
// 菜单栏
QMenuBar* menuBar = this->menuBar();
// 菜单
QMenu* fileMenu = menuBar->addMenu("文件");
QMenu* helpMenu = menuBar->addMenu("帮助");
// 定义文件菜单中的菜单项
createProjAct = new QAction("新建项目");
openProjAct = new QAction("打开项目");
quitAct = new QAction("退出");
// 将菜单项加入到文件菜单
fileMenu->addAction(createProjAct);
fileMenu->addAction(openProjAct);
fileMenu->addSeparator();
fileMenu->addAction(quitAct);
// 定义帮助菜单中的菜单项
QAction* aboutAct = new QAction("关于");
// 将菜单加入到帮助菜单项
helpMenu->addAction(aboutAct);
// 添加快捷键
createProjAct->setShortcut(QKeySequence::New);
openProjAct->setShortcuts(QKeySequence::Open);
createProjAct->setAutoRepeat(false);
// 临时测试代码
connect(createProjAct, &QAction::triggered, []() {qDebug() << "Create New Project"; });
// 设置图标
createProjAct->setIcon(QIcon(":/SubCfgTool/image/menu_new.png"));
openProjAct->setIcon(QIcon(":/SubCfgTool/image/menu_open.png"));
}
void SubCfgTool::createToolBar()
{
QToolBar* mainToolBar = new QToolBar(QStringLiteral("工具条"));
mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
addToolBar(Qt::TopToolBarArea, mainToolBar);
mainToolBar->addAction(createProjAct);
mainToolBar->addAction(openProjAct);
mainToolBar->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea);
}