(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);
}
相关推荐
waves浪游2 小时前
进程概念(上)
linux·运维·服务器·开发语言·c++
百***92652 小时前
java进阶1——JVM
java·开发语言·jvm
杜子不疼.2 小时前
【C++】 map/multimap底层原理与逻辑详解
开发语言·c++
司铭鸿2 小时前
数学图论的艺术:解码最小公倍数图中的连通奥秘
运维·开发语言·算法·游戏·图论
Cocktail_py2 小时前
JS如何调用wasm
开发语言·javascript·wasm
饮长安千年月2 小时前
玄机-第八章 内存马分析-java03-fastjson
开发语言·python·安全·web安全·网络安全·应急响应
MediaTea3 小时前
Python 第三方库:OpenPyXL(Excel 文件读写与操作)
开发语言·python·excel
点云SLAM3 小时前
C++ 中dynamic_cast使用详解和实战示例
开发语言·c++·类型转换·dynamic_cast·c++多态·c++继承
CodeByV3 小时前
【C++】C++11:右值引用和移动语义
开发语言·c++