【Qt】QToolBar、QToolButton的常用用法

一、QToolBar 常用用法

QToolBar 是 Qt 中用于创建工具栏的控件,可快速放置常用功能按钮、分隔符或自定义控件,并支持拖动停靠、浮动等特性。

1. 基础创建与添加到主窗口

// 在 QMainWindow 中创建工具栏
QToolBar *toolBar = new QToolBar(tr("主工具栏"), this);
addToolBar(toolBar); // 将工具栏添加到主窗口(默认停靠在顶部)

2. 添加动作(QAction)与控件

工具栏的核心元素是 QAction(可同时用于菜单和工具栏),也可直接添加自定义控件(如 QComboBoxQLineEdit)。

// 示例:添加“新建”“打开”动作 + 搜索框
QAction *actionNew = new QAction(tr("&New"), this);
QAction *actionOpen = new QAction(tr("&Open"), this);
toolBar->addAction(actionNew);   // 添加动作
toolBar->addAction(actionOpen);
toolBar->addSeparator();         // 添加分隔符QLineEdit *searchBox = new QLineEdit();
searchBox->setPlaceholderText("搜索...");
toolBar->addWidget(searchBox);   // 添加自定义控件

3. 停靠与浮动控制

工具栏支持拖动到窗口的上、下、左、右区域,或脱离成为浮动窗口。

toolBar->setMovable(true);       // 允许拖动(默认 true)
toolBar->setFloatable(true);     // 允许浮动(默认 true)
toolBar->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea); // 仅允许停靠在顶部/底部

设置初始停靠位置

m_pMainToolBar = new QToolBar(tr("MainToolBar"), this); // 先new出QToolBar实例
this->addToolBar(Qt::LeftToolBarArea, m_pMainToolBar);  // 传入默认停靠位置 Qt::LeftToolBarArea

注意:工具栏停靠位置只能在主窗口 add时进行设置,后边无法通过编码更改初始停靠位置。

4. 外观定制

控制图标大小、按钮文本与图标的布局、方向等。

toolBar->setIconSize(QSize(24, 24));  // 图标大小
toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); // 文本在图标下方
toolBar->setOrientation(Qt::Vertical); // 垂直排列(默认水平)

5. 信号与交互

响应工具栏动作的触发事件。

// 连接动作的 triggered 信号到槽函数
connect(actionOpen, &QAction::triggered, this, &MainWindow::openFile);// 连接工具栏的 actionTriggered 信号(触发任意动作时发射)
connect(toolBar, &QToolBar::actionTriggered, this, &MainWindow::handleAction);

二、QToolButton 常用用法

QToolButton 是专为工具栏设计的按钮控件,比 QPushButton 更紧凑,支持图标、文本、下拉菜单、可切换状态等特性。

1. 基础创建与添加到工具栏

QToolButton *toolBtn = new QToolButton(this);
toolBtn->setIcon(QIcon(":/icons/save.png")); // 设置图标
toolBtn->setText("保存");                    // 设置文本
toolBar->addWidget(toolBtn);                 // 添加到工具栏

注意:toolButtonStyle 仅作用于工具栏自动生成的按钮(通过 addAction),手动添加的 QToolButtonaddWidget)需自行管理样式。详细解释如下:

1.1 两种添加方法的关键区别:样式继承机制

  • addAction 的按钮:
    • 工具栏内部为每个 QAction 生成一个 QToolButton,并将 toolButtonStyle(如 Qt::ToolButtonTextUnderIcon)强制应用到这些自动生成的按钮上。
    • 示例:
QAction* action = new QAction(QIcon("icon.png"), "按钮", this);// 自动生成的 QToolButton 会继承 toolBar 的 toolButtonStyle
toolBar->addAction(action);  
  • addWidget**的按钮 :
    • 手动创建的 QToolButton(如 new QToolButton())是独立控件,工具栏的 toolButtonStyle 不会自动作用于它。
    • 原因:这些按钮可能已自定义样式(如设置了专属的图标、文本布局),Qt 避免强制覆盖用户的自定义逻辑。
    • 示例:
QToolButton* btn = new QToolButton();
btn->setToolButtonStyle(Qt::ToolButtonIconOnly); // 自定义样式
toolBar->addWidget(btn); // 工具栏的 toolButtonStyle 不会影响此按钮 
  • 如何让 addWidget 的按钮继承样式?

    若需手动添加的按钮(addWidget)也遵循工具栏的样式,需手动同步属性

// 工具栏样式设置
toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);// 手动创建按钮并同步样式 QToolButton* customBtn = new QToolButton();
customBtn->setToolButtonStyle(toolBar->toolButtonStyle()); // 显式继承
toolBar->addWidget(customBtn); 
  • 总结:
    • 通过 addWidget()方法手动添加的QToolButton需自行管理样式。
      • 适合快速创建统一风格的按钮(如标准的 “新建”“保存”),减少重复代码。
    • 不同的是,通过addAction()方法添加 QAction 动作,工具栏会自动创建 QToolButton,并绑定动作,按钮样式由工具栏的toolButtonStyle统一控制。
      • 适合复杂场景(如带下拉菜单的按钮、自定义组合控件),允许完全控制按钮样式。

2. 图标与文本布局

通过 Qt::ToolButtonStyle 控制图标和文本的显示方式。

toolBtn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); // 文本在图标下方
// 可选值:IconOnly(仅图标)、TextOnly(仅文本)、TextBesideIcon(文本在图标旁)等

3. 下拉菜单与弹出模式

QToolButton 可关联下拉菜单,支持三种弹出模式:

QMenu *menu = new QMenu(this);
menu->addAction("保存", this, &MainWindow::save);
menu->addAction("另存为", this, &MainWindow::saveAs);toolBtn->setMenu(menu);
toolBtn->setPopupMode(QToolButton::MenuButtonPopup); // 右侧显示箭头,点击箭头弹出菜单
// 其他模式:InstantPopup(点击立即弹菜单)、DelayedPopup(长按弹菜单,默认)

4. 可切换状态(类似复选框)

设置为“可检查”模式后,按钮可保持“按下/释放”状态。

toolBtn->setCheckable(true); // 启用可检查状态
connect(toolBtn, &QToolButton::toggled, this, &MainWindow::toggleTool); // 连接切换信号

5. 自动提升与箭头样式

  • 自动提升:鼠标悬停时按钮呈现 3D 凸起效果。
  • 箭头样式:可显示箭头(替代图标)。
toolBtn->setAutoRaise(true);  // 启用自动提升(无边框,悬停时凸起)
toolBtn->setArrowType(Qt::DownArrow); // 显示下箭头(替代图标)

6. 设置提示

toolBtn->setToolTip(tr("这是系统设置按钮"));

鼠标停留在工具按钮上方,会有如下效果:
在这里插入图片描述

三、结合使用示例

QToolButtonQToolBar 配合,实现带下拉菜单的保存按钮:

QMainWindow window;
QToolBar *toolBar = new QToolBar(&window);
window.addToolBar(toolBar);QToolButton *saveBtn = new QToolButton(&window);
saveBtn->setIcon(QIcon(":/save.png"));
saveBtn->setText("保存");
saveBtn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);QMenu *saveMenu = new QMenu(&window);
saveMenu->addAction("保存", &window, []() { qDebug() << "保存文件"; });
saveMenu->addAction("另存为", &window, []() { qDebug() << "另存为..."; });saveBtn->setMenu(saveMenu);
saveBtn->setPopupMode(QToolButton::MenuButtonPopup);toolBar->addWidget(saveBtn);
window.show();

四、总结

  • QToolBar:负责工具栏的整体容器管理,支持停靠、浮动、布局定制,通过 addAction()/addWidget() 填充内容。
  • QToolButton:专注于工具栏内的按钮交互,支持图标、文本、下拉菜单、可切换状态等特性,是构建复杂工具栏的核心组件。

两者结合可实现灵活、专业的工具栏界面,提升用户操作效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95634.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DVWA靶场通关笔记-验证码绕过Insecure CAPTCHA (Impossible级别)

目录 一、reCAPTCHA 1、配置security为Impossible级别。 2、配置RECAPTCHA参数 3、再次打开靶场 二、源码分析 1、index.php 2、impossible.php 3、功能函数 三、reCAPTCHA 防范分析 1、严格的参数验证与处理 2、预处理防止SQL注入 3、CAPTCHA 验证通过 4、验证当前…

MySQL安装(如果之前有安装过MySQL,先执行下面的卸载流程)

1.安装MySQL 1.1更新系统的软件包列表 sudo apt-get update1.2安装MySQL服务器 sudo apt-get install mysql-server1.3检查MySQL服务是否启动&#xff0c;若没有启动手动启动若没有启动执行&#xff1a; sudo service mysql start1.4登录MySQL&#xff08;默认安装之后不需要密…

Streamlit 数据看板模板:非前端选手快速搭建 Python 数据可视化交互看板的实用工具

你想想看&#xff0c;平时你用 Python 跑出来一堆数据 —— 比如用户留存率、产品销量变化&#xff0c;想给领导或者同事看&#xff0c;总不能直接发个 CSV 文件或者一堆静态图吧&#xff1f;对方看的时候还得自己翻数据&#xff0c;想对比下上个月和这个月的变化都费劲&#x…

FMC、FMC+ 详解

文章目录FMC 简介FMC 引脚输出定义High-pin count (HPC) connector, HPC pinoutLow-pin count (LPC) connector, LPC pinoutPin and signal descriptionFMC 简介VITA57 标准更新历史VITA57.4 标准推出的原因FMC 引脚输出定义Altera 开发板的 FMC 引脚定义英特尔 Arria 10 GX FP…

小迪web自用笔记24

黑名单机制。如果被过滤可以试试PHP5看看过滤没&#xff08;或者其他变种变形&#xff09;&#xff0c;但是得看环境有些环境会被当成下载&#xff0c;有些会直接打开。白名单机制只允许这几个特定后缀可以上传&#xff0c;比黑名单更安全。直接从信息图中获取文件类型。文件类…

私有部署问卷系统、考试系统、投票系统、测评系统的最佳选择-调问开源问卷表单(DWSurvey)

在选择私有部署问卷系统的时候&#xff0c;调问问卷系统(DWSurvey)是一定要尝试一下&#xff0c;而且可以应用到私有部署考试系统、私有部署投票系统、私有部署测评系统等多个应用场景。 私有部署问卷、考试、测评、投票系统的优势不言而喻&#xff0c;就拿私有部署考试系统来说…

企业实用——MySQL的备份详解

序言: 本次基于mysql8.0.40来给大家做数据库的备份的实用技巧和思路!对于mysql基础的部分后续我会节选部分给大家讲解,本篇文章适合有一定数据库基础的小伙伴看。 目录 一、MySQL备份概述 1、关于数据保存你要知道 2、到底要备份什么 备份什么 MySQL体系结构(MySQL =…

使用 FunASR 工具包实现音频文件的语音识别

使用 FunASR 工具包实现音频文件的语音识别&#xff0c;并将识别结果保存为文本文件&#xff0c;支持单文件处理和批量处理。电脑环境需要配置&#xff0c;我使用的PyTorch版本: 2.4.1cu121&#xff0c;CUDA可用: True。FunASR 是一个功能强大、性能卓越、面向工业应用的语音识…

【STM32】定时器编码器接口

【STM32】定时器编码器接口一、编码器接口1.1 正交编码器1.2 编码器接口基本结构1.3 工作模式二、编码器接口测速一、编码器接口 编码器接口可接收增量&#xff08;正交&#xff09;编码器的信号&#xff0c;根据编码器旋转产生的正交信号脉冲&#xff0c;自动控制CNT的自增或…

浪潮科技Java开发面试题及参考答案(120道题-中)

请介绍一下 SpringMVC 的运行流程&#xff1f;从用户发送请求到响应返回的完整步骤是什么&#xff1f;SpringMVC 是基于MVC架构的Web框架&#xff0c;其运行流程围绕“前端控制器&#xff08;DispatcherServlet&#xff09;”展开&#xff0c;通过多个组件协同工作&#xff0c;…

k8s初始化常见问题

执行初始化&#xff1a;kubeadm init --apiserver-advertise-address192.168.88.110 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr10.244.0.0/16 --control-plane-endpointweb01报错信息&#xff1a;age-repository registry.aliyuncs.com/…

Python学习笔记--使用Django修改和删除数据

一、修改方式一&#xff1a;模型类的对象.属性 更改的属性值&#xff0c;模型类的对象.save()返回值&#xff1a;编辑的模型类的对象。def update_book(request):book models.Book.objects.filter(pk1).first()book.price "169"book.save()return HttpResponse(bo…

如何评价2025年数学建模国赛?

2025年全国大学生数学建模竞赛将于9月4日正式举行&#xff01; 有些第一次参加数学竞赛的同学可能觉得自己还没准备好&#xff0c;临近比赛感到紧张很正常&#xff0c;但需调整心态——数学建模比赛本就是学习过程&#xff0c;遇到不会的知识及时搜索、现学现用即可&#xff0…

uniapp [全端兼容] - 实现全景图Vr 720°全景效果查看预览功能,3D全景图流畅不卡顿渲染+手势拖拽+悬浮工具按钮,uniAPP实现vr看720度全景效果示例代码(H5小程序APP全兼容)

前言 如果您需要 Vue 版本,请访问 这篇文章。 在 uni-app 全平台兼容(H5网页网站、支付宝/微信小程序、安卓App、苹果App、nvue)开发中,详细实现全景图Vr 720全景查看+用户可流畅拖动预览+自定义工具栏/按钮元素等,uniApp如何实现在线观看720度全景图,适用于全景图VR看房…

51单片机-实现串口模块教程

本章概述思维导图&#xff1a;51单片机实现串口模块教程通信基本概念通信&#xff0c;至少是需要两个对象&#xff0c;一个收一个发数据。根据数据通信的传输时序协调方式&#xff0c;可分为&#xff1a;同步通信和异步通信&#xff1b;根据数据通信的传输线路可分为&#xff1…

Linux echo 命令使用说明

echo 命令使用说明&#xff08;Linux&#xff09; 适用环境 Bash/Zsh 等常见 Shell&#xff08;echo 通常为内建命令&#xff09;也可能存在外部 /bin/echo&#xff08;行为与内建略有差异&#xff09; 基本语法 echo [选项] [字符串...]常用选项 -n: 结尾不输出换行-e: 解析反…

Java搭建高效后端,Vue打造友好前端,联合构建电子采购管理系统,实现采购流程电子化、自动化,涵盖采购全周期管理,功能完备,附详细可运行源码

前言&#xff1a;在当今数字化浪潮席卷的时代&#xff0c;企业的采购管理面临着前所未有的挑战与机遇。传统采购模式因流程繁琐、效率低下、信息不透明等问题&#xff0c;已难以满足企业快速发展的需求。电子采购管理系统作为一种创新的采购解决方案&#xff0c;借助先进的信息…

应用开发使用缓存

在 Java 开发的典型架构&#xff08;结合前端、后端、MyBatis、MySQL 及缓存机制&#xff09;中&#xff0c;缓存层次可以从前端到后端再到数据库进行划分&#xff0c;通常涉及以下多层缓存&#xff1a;1. 前端缓存浏览器缓存&#xff1a;浏览器自带的缓存机制&#xff08;如 H…

leetcode算法刷题的第二十六天

今天主要是要用贪心算法来解决重置区间的问题。 1.leetcode 452.用最少数量的箭引爆气球 题目链接 class Solution { public:static bool cmp(const vector<int>& a,const vector<int>& b){return a[0]<b[0];}int findMinArrowShots(vector<vecto…

BlueZ 学习之GATT Server开发

Linux下&#xff0c;使用C语言开发一个简单的GATT Server&#xff0c;我的Ubuntu上跑的BlueZ版本是5.79&#xff0c;使用的GLib库版本是2.85.2&#xff0c;这里我直接使用GLib里的D‑Bus来实现与BlueZ通信。BlueZ 官方推荐通过 D-Bus 进行通信和控制&#xff0c;如果是要使用原…