(6)框架搭建:Qt实战项目之主窗体快捷工具条

上节课我们完成了 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);
}
相关推荐
用户805533698033 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner3 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz8 天前
QML Hello World 入门示例
qt
xcyxiner11 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner11 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner12 天前
DicomViewer (添加模型类)3
qt
xcyxiner12 天前
DicomViewer (目录调整) 2
qt
xcyxiner13 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00614 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术14 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript