Qt6入门教程 14:QToolButton

目录

一.简介

二.常用接口

1.void setMenu(QMenu * menu)

2.void setPopupMode(ToolButtonPopupMode mode)

3.void setToolButtonStyle(Qt::ToolButtonStyle style)

4.void setArrowType(Qt::ArrowType type)

5.void setDefaultAction(QAction * action)

三.实战演练

1.设置菜单

2.设置样式

3.箭头按钮

4.异形按钮


一.简介

QToolButton一般用于QToolBar中 ,既可以同时显示文本和图标,也可以只显示文本或图标。当使用QToolBar::addAction()添加一个新的(或已存在的)QAction至工具栏时,QToolButton自动被创建。
QToolButton的一个经典用法是作为选择工具,比如说选择画图软件中的“画笔”。此时QToolButtoon可以设置为一个切换(toggle)按钮,当选中“画笔”时,画笔按钮按下;当选中其他工具时,画笔按钮弹起。详见setCheckable()函数。
QToolButton支持自动浮起,在自动浮起模式中,只有在鼠标指向它的时候才绘制三维框架。当按钮被用在QToolBar里时,这个特征会被自动启用,可以使用setAutoRaise()来更改。
按钮的外观和尺寸可通过setToolButtonStyle()和setIconSize()来调节。当在QMainWindow的QToolBar里使用时,按钮会自动地调节来适合QMainWindow的设置(见QMainWindow::setToolButtonStyle() 和QMainWindow::setIconSize())。
QToolButton可以提供一个弹出菜单,使用setMenu()来进行设置。通过setPopupMode()来设置菜单的弹出模式,缺省模式是DelayedPopupMode,这个特征通常用于网页浏览器的“后退”按钮,在按下按钮一段时间后,会弹出一个可以跳转的页面列表,默认延迟600毫秒,可以用QStyle::SH_ToolButton_PopupDelay进行调整。

二.常用接口

1.void setMenu(QMenu * menu)

设置按钮的弹出菜单。和QPushButton用法类似,详见:Qt6入门教程 13:QPushButton

2.void setPopupMode(ToolButtonPopupMode mode)

设置弹出菜单的方式,默认值为DelayedPopup(延迟弹出),可取的枚举值如下表所示:

常量描述
QToolButton::DelayedPopup0按下按钮一定时间后(超时依赖于QStyle,详见:QStyle::SH_ToolButton_PopupDelay),显示菜单。一个典型案例:浏览器中工具栏的“后退”按钮。
QToolButton::MenuButtonPopup1这种模式下,按钮显示一个特殊的箭头以标识菜单是否存在,按下按钮的箭头部分时弹出菜单。
QToolButton::InstantPopup2按下按钮时菜单立即弹出,无延迟。这种模式下,按钮的action不会触发。

3.void setToolButtonStyle(Qt::ToolButtonStyle style)

设置按钮风格,只显示一个图标、文本或文本位于图标旁边、下方,默认值为Qt::ToolButtonIconOnly,可取的枚举值如下表所示:

常量描述
Qt::ToolButtonIconOnly0只显示图标
Qt::ToolButtonTextOnly1只显示文本
Qt::ToolButtonTextBesideIcon2文本显示在图标旁边
Qt::ToolButtonTextUnderIcon3文本显示在图标下边
Qt::ToolButtonFollowStyle4遵循QStyle::StyleHint

4.void setArrowType(Qt::ArrowType type)

设置是否显示一个箭头作为QToolButton的图标,默认值为Qt::NoArrow,可取的枚举值如下表所示:

常量描述
Qt::NoArrow0无箭头
Qt::UpArrow1向上的箭头
Qt::DownArrow2向下的箭头
Qt::LeftArrow3向左的箭头
Qt::RightArrow4向右的箭头

5.void setDefaultAction(QAction * action)

设置默认的QAction,如果有一个默认的action,该action则会定义QToolButton的文本、图标、TooTip等按钮的属性。

三.实战演练

1.设置菜单

#include <QApplication>
#include <QMainWindow>
#include <QToolButton>
#include <QPainter>
#include <QHBoxLayout>
#include <QMenu>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMainWindow w;
    w.setWindowTitle("https://blog.csdn.net/caoshangpa");
    QWidget *centralWidget = new QWidget();
    QHBoxLayout *hLayout = new QHBoxLayout();

    QMenu *menu = new QMenu();
    menu->addAction(QIcon(":/icons/dragon"), "Open");
    menu->addAction(QIcon(":/icons/dragon"), "Create");
    menu->addSeparator();
    menu->addAction(QIcon(":/icons/dragon"), "Quit");

    QToolButton *button1 = new QToolButton();
    button1->setPopupMode(QToolButton::DelayedPopup);
    button1->setMenu(menu);
    button1->setText("button1");
    button1->setStyleSheet("QToolButton{"
                           "background: rgb(128, 128, 128);"
                           "border: 1px solid rgb(50, 50, 50);"
                           "color: white;"
                           "width: 100px;"
                           "height: 30px;"
                           "text-align: left center;"
                           "padding-left: -10px;}"
                           "QToolButton:hover{"
                           "background: rgb(150, 150, 150);}"
                           "QToolButton:pressed{"
                           "background: rgb(100, 100, 100);}"
                           "QToolButton::menu-indicator{"
                           "subcontrol-position: right center;"
                           "subcontrol-origin: padding;"
                           "right: 10px;}");

    QToolButton *button2 = new QToolButton();
    button2->setPopupMode(QToolButton::MenuButtonPopup);
    button2->setMenu(menu);
    button2->setText("button2");
    button2->setStyleSheet("QToolButton{"
                           "background: rgb(128, 128, 128);"
                           "border: 1px solid rgb(50, 50, 50);"
                           "color: white;"
                           "width: 100px;"
                           "height: 30px;}"
                           "QToolButton:hover{"
                           "background: rgb(150, 150, 150);}"
                           "QToolButton:pressed{"
                           "background: rgb(100, 100, 100);}"
                        );

    QToolButton *button3 = new QToolButton();
    button3->setPopupMode(QToolButton::InstantPopup);
    button3->setMenu(menu);
    button3->setText("button3");
    button3->setStyleSheet("QToolButton{"
                           "background: rgb(128, 128, 128);"
                           "border: 1px solid rgb(50, 50, 50);"
                           "color: white;"
                           "width: 100px;"
                           "height: 30px;}"
                           "QToolButton:hover{"
                           "background: rgb(150, 150, 150);}"
                           "QToolButton:pressed{"
                           "background: rgb(100, 100, 100);}");

    hLayout->addWidget(button1);
    hLayout->addWidget(button2);
    hLayout->addWidget(button3);
    centralWidget->setLayout(hLayout);
    w.setCentralWidget(centralWidget);

    w.resize(400, 300);
    w.show();
    return a.exec();
}

QSS

/*button1*/
QToolButton{
    background: rgb(128, 128, 128);
    border: 1px solid rgb(50, 50, 50);
    color: white;
    width: 100px;
    height: 30px;
    text-align: left center;
    padding-left: -10px;
}
QToolButton:hover{
    background: rgb(150, 150, 150);
}
QToolButton:pressed{
    background: rgb(100, 100, 100);
}
QToolButton::menu-indicator{
    subcontrol-position: right center;
    subcontrol-origin: padding;
    right: 10px;
}
/*button2和button3*/
QToolButton{
    background: rgb(128, 128, 128);
    border: 1px solid rgb(50, 50, 50);
    color: white;
    width: 100px;
    height: 30px;
}
QToolButton:hover{
    background: rgb(150, 150, 150);
}
QToolButton:pressed{
    background: rgb(100, 100, 100);
}


三个按钮从左到右依次对应QToolButton::DelayedPopup、QToolButton::MenuButtonPopup和QToolButton::InstantPopup,这三种模式的共性是当菜单弹出时,按钮都处于下沉状态。

在QToolButton::DelayedPopup模式下,可用通过Qt样式表“toolbutton-popup-delay: 0;”来设置菜单延迟弹出的时间(实际效果是修改了QStyle::SH_ToolButton_PopupDelay的数值)。0表示立即弹出,此时效果和QToolButton::InstantPopup模式一毛一样。

/*button1*/
QToolButton{
    toolbutton-popup-delay: 0;
    background: rgb(128, 128, 128);
    border: 1px solid rgb(50, 50, 50);
    color: white;
    width: 100px;
    height: 30px;
    text-align: left center;
    padding-left: -10px;
}
QToolButton:hover{
    background: rgb(150, 150, 150);
}
QToolButton:pressed{
    background: rgb(100, 100, 100);
}
QToolButton::menu-indicator{
    subcontrol-position: right center;
    subcontrol-origin: padding;
    right: 10px;
}

2.设置样式

#include <QApplication>
#include <QMainWindow>
#include <QToolButton>
#include <QPainter>
#include <QHBoxLayout>
#include <QMenu>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMainWindow w;
    w.setWindowTitle("https://blog.csdn.net/caoshangpa");
    QWidget *centralWidget = new QWidget();
    QHBoxLayout *hLayout = new QHBoxLayout();

    QToolButton *button1 = new QToolButton();
    button1->setToolButtonStyle(Qt::ToolButtonIconOnly);
    button1->setIcon(QIcon(":/icons/dragon.png"));
    button1->setIconSize(QSize(48, 48));
    button1->setFixedSize(80, 80);
    button1->setAutoRaise(true);

    QToolButton *button2 = new QToolButton();
    button2->setToolButtonStyle(Qt::ToolButtonTextOnly);
    button2->setText("button2");
    button2->setFixedSize(80, 80);
    button2->setAutoRaise(true);

    QToolButton *button3 = new QToolButton();
    button3->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
    button3->setText("button3");
    button3->setIcon(QIcon(":/icons/dragon.png"));
    button3->setIconSize(QSize(48, 48));
    button3->setFixedSize(80, 30);

    QToolButton *button4 = new QToolButton();
    button4->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
    button4->setText("button4");
    button4->setIcon(QIcon(":/icons/dragon.png"));
    button4->setIconSize(QSize(48, 48));
    button4->setFixedSize(80, 80);

    hLayout->addWidget(button1);
    hLayout->addWidget(button2);
    hLayout->addWidget(button3);
    hLayout->addWidget(button4);
    centralWidget->setLayout(hLayout);
    w.setCentralWidget(centralWidget);

    w.resize(400, 300);
    w.show();
    return a.exec();
}

四个按钮从左到右依次对应Qt::ToolButtonIconOnly、Qt::ToolButtonTextBesideIcon、Qt::ToolButtonTextBesideIcon、Qt::ToolButtonTextUnderIcon。

需要注意的是,前面两个按钮设置了autoRaise属性

3.箭头按钮

#include <QApplication>
#include <QMainWindow>
#include <QToolButton>
#include <QPainter>
#include <QHBoxLayout>
#include <QMenu>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMainWindow w;
    w.setWindowTitle("https://blog.csdn.net/caoshangpa");
    QWidget *centralWidget = new QWidget();
    QHBoxLayout *hLayout = new QHBoxLayout();

    QToolButton *button1 = new QToolButton();
    button1->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
    button1->setText("button1");
    button1->setArrowType(Qt::UpArrow);
    button1->setIconSize(QSize(48, 48));
    button1->setFixedSize(80, 80);
    button1->setStyleSheet("QToolButton{border: none; background: rgb(128, 128, 128); color: white;}");

    QToolButton *button2 = new QToolButton();
    button2->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
    button2->setText("button2");
    button2->setArrowType(Qt::DownArrow);
    button2->setIconSize(QSize(48, 48));
    button2->setFixedSize(80, 80);
    button2->setStyleSheet("QToolButton{border: none; background: rgb(128, 128, 128); color: white;}");

    QToolButton *button3 = new QToolButton();
    button3->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
    button3->setText("button3");
    button3->setArrowType(Qt::LeftArrow);
    button3->setIconSize(QSize(48, 48));
    button3->setFixedSize(80, 80);
    button3->setStyleSheet("QToolButton{border: none; background: rgb(128, 128, 128); color: white;}");

    QToolButton *button4 = new QToolButton();
    button4->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
    button4->setText("button4");
    button4->setArrowType(Qt::DownArrow);
    button4->setIconSize(QSize(48, 48));
    button4->setFixedSize(80, 80);
    button4->setStyleSheet("QToolButton{border: none; background: rgb(128, 128, 128); color: white;}");

    hLayout->addWidget(button1);
    hLayout->addWidget(button2);
    hLayout->addWidget(button3);
    hLayout->addWidget(button4);
    centralWidget->setLayout(hLayout);
    w.setCentralWidget(centralWidget);

    w.resize(400, 300);
    w.show();
    return a.exec();
}

4.异形按钮

#include <QPainter>
#include <QHBoxLayout>
#include <QMenu>
#include <QIcon>
#include <QBitmap>
#include <QPixmap>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMainWindow w;
    w.setWindowTitle("https://blog.csdn.net/caoshangpa");
    QWidget *centralWidget = new QWidget();
    QHBoxLayout *hLayout = new QHBoxLayout();
    QToolButton *button1 = new QToolButton();
    button1->setText("button1");
    button1->setStyleSheet("border:0px");
    button1->setIcon(QIcon(":/icons/dragon.png"));
    button1->setIconSize(QSize(100, 100));
   
    hLayout->addStretch();
    hLayout->addWidget(button1);
    hLayout->addStretch();
    centralWidget->setLayout(hLayout);
    w.setCentralWidget(centralWidget);

    w.resize(400, 200);
    w.show();
    return a.exec();
}

与Qt6入门教程 13:QPushButton中的异形按钮相比,QToolButton实现的异形按钮代码更加简洁。

原文链接:Qt6入门教程 14:QToolButton-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Observability:在 Elastic Stack 8.12 中使用 Elastic Agent 性能预设

作者&#xff1a;来自 Elastic Nima Rezainia, Bill Easton 8.12 中 Elastic Agent 性能有了重大改进 最新版本 8.12 标志着 Elastic Agent 和 Beats 调整方面的重大转变。 在此更新中&#xff0c;Elastic 引入了 Performance Presets&#xff0c;旨在简化用户的调整过程并增强…

【网络安全|漏洞挖掘】ChatGPT 再曝安全漏洞,被指泄露私密对话

风靡全球的聊天机器人 ChatGPT 近日再次陷入安全风波&#xff0c;被曝泄露用户同机器人的私密对话&#xff0c;其中包含用户名、密码等敏感信息。 ArsTechnica 网站援引其读者提供的截图报道称&#xff0c;ChatGPT 泄露了多段非用户本人的对话内容&#xff0c;包含了大量敏感信…

基于大数据的B站数据分析系统的设计与实现

摘要&#xff1a;随着B站&#xff08;哔哩哔哩网&#xff09;在国内视频分享平台的崛起&#xff0c;用户规模和数据量不断增加。为了更好地理解和利用这些海量的B站数据&#xff0c;设计并实现了一套基于Python的B站数据分析系统。该系统采用了layui作为前端框架、Flask作为后端…

远程访问@HttpExchange

提示&#xff1a;这是SpringBoot3以上的新特性。 远程访问HttpExchange 一、webClient二、Http 服务器接口的方法定义三、声明式 HTTP 远程服务 远程访问是开发的常用技术&#xff0c;一个应用能够访问其他应用的功能。Spring Boot 提供了多种远程访问技术。基于 HTTP 协议的远…

博云科技与中科可控全面合作,探索前沿金融科技新机遇

2024年1月26日&#xff0c;博云科技与中科可控在昆山高新区成功举办合作签约仪式。昆山市委常委、昆山高新区党工委书记孙道寻、中科可控董事长聂华、博云科技董事长花磊等领导出席了本次签约仪式。 中科可控将利用其在先进计算和智造领域的优势&#xff0c;为博云科技提供有关…

通过WSL2来实现Windows10/11的深度学习模型GPU加速,TensorFlow项,Jupyter及其插件安装,CQF心得,金融量化

通过WSL2来实现TF的GPU加速 为什么要用WSL&#xff08;Windows Subsystem Linux&#xff09;安装WSL2&#xff0c;miniconda&#xff0c;cuda&#xff0c;cudnn&#xff0c;TA-Lib安装 WSL2安装 Miniconda3安装 CUDA安装 cuDNN安装 TensorFlow 库安装 TA-Lib 库安装其它CQF及金…

立式台灯什么牌子好用又实惠?好用又实惠的台灯分享

近年来&#xff0c;随着电子产品越来越普及&#xff0c;社会的发展和生活方式的转变&#xff0c;视力不良和近视问题越发严重&#xff0c;全国学生体质与健康调研数据显示&#xff0c;从1985年起中国中小学生视力不良率持续上升&#xff0c;到2019年时&#xff0c;视力不良率已…

STM32——感应开关盖垃圾桶

STM32——感应开关盖垃圾桶 1.定时器介绍 软件定时 缺点&#xff1a;不精确、占用CPU资源 void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();i 4;j 129;k 119;do{do{while (--k);} while (--j);} while (--i); }定时器工作原理 使用精准的时基&#xff…

Orion-14B-Chat-Plugin [model server error]解决方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

MIT 6.5830 概述

简介 同MIT6.824系列类似&#xff0c;6.4830是关于Database System的一门课程&#xff0c;官方主页链接。 从课程信息可知&#xff0c;理论课分为 21 个课时&#xff0c;3个问题集&#xff0c;4个实验&#xff0c;1个项目。课程的 ppt 可以下载&#xff0c;对应的课堂回放可以…

【Delphi】IDE 工具栏错乱恢复

由于经常会在4K和2K显示器上切换Delphi开发环境(IDE)&#xff0c;导致IDE工具栏错乱&#xff0c;咋样设置都无法恢复&#xff0c;后来看到红鱼儿的博客&#xff0c;说是通过操作注册表的方法&#xff0c;能解决&#xff0c;试了一下&#xff0c;果真好用&#xff0c;非常感谢分…

WPF 提示无法启动PackIcon,因为已经启用仅平台控件选项

vs打开wpf项目的页面文件&#xff0c;提示如下&#xff1a; 点击此处重新加载设计器&#xff0c;页面无反应&#xff1b; 点击仅显示控制平台控件及重新加载时&#xff0c;页面可以显示&#xff0c;但是PackIocn不能显示&#xff0c;如下图&#xff1a; 切换后&#xff0c;如…

LVS常用的NAT模式和DR模式实战示例

引言&#xff1a;紧接上文&#xff0c;了解LVS&#xff0c;这一篇就够了-CSDN博客&#xff0c;今天我们对LVS常用的两种模式来进行示例配置演示 LVS-NAT模式 1、环境准备 准备 3 台纯净的虚拟机 关闭防火墙和selinux 例&#xff1a; lvs-server 添加两个网卡 NAT模式 …

Spring | Spring的“数据库开发“ (Srping JDBC)

目录&#xff1a; Spring JDBC1.Spring JDBC的核心类 ( JdbcTemplate类 )2.Srping JDBC 的配置3.JdbcTemplate类的“常用方法”execute( )&#xff1a;直接执行“sql语句”&#xff0c;没有返回值update( ) &#xff1a;“增删改”&#xff0c;返回 “影响的行数”query( ) : “…

C# OpenCvSharp DNN Gaze Estimation 视线估计

目录 介绍 效果 模型信息 项目 代码 frmMain.cs GazeEstimation.cs 下载 C# OpenCvSharp DNN Gaze Estimation 介绍 训练源码地址&#xff1a;https://github.com/deepinsight/insightface/tree/master/reconstruction/gaze 效果 模型信息 Inputs ----------------…

【Java程序设计】【C00214】基于SSM的社区物资购买系统(论文+PPT)

基于SSM的社区物资购买系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这个一个基于SSM的社区物资购物管理系统&#xff0c;本系统共分为二种权限&#xff1a;管理员、用户 管理员&#xff1a;首页、个人中心、用户管理、商品分类管…

1178:单词数

题目描述 统计一篇文章里不同单词的总数。 输入 有多组数据&#xff0c;每组一行&#xff0c;每组就是一篇小文章。每篇小文章都是由大小写字母和空格组成&#xff0c;没有标点符号&#xff0c;遇到#时表示输入结束。每篇文章的单词数小于1000&#xff0c;每个单词最多由30个…

serial库对串口的基本使用

serial库对串口的基本使用 serial库用于串口通信。它提供了一组函数和类&#xff0c;用于在计算机和外部设备之间进行串口通信。通过使用serial库可以读取和写入串口数据&#xff0c;以实现与各种外部设备的通信&#xff0c;如传感器、微控制器、嵌入式系统等。 支持多平台&a…

Linux浅学笔记03

目录 有关root的命令 用户和用户组 用户组管理&#xff1a;&#xff08;以下需要root用户执行&#xff09; 创建用户组: 删除用户组&#xff1a; 用户管理&#xff1a;&#xff08;以下需要root用户执行&#xff09; 创建用户&#xff1a; 删除用户&#xff1a; 查看用…

DataTable.Load(reader)注意事项

对于在C#中操作数据库查询&#xff0c;这样的代码很常见&#xff1a; using var cmd ExecuteCommand(sql); using var reader cmd.ExecuteReader(); DataTable dt new DataTable(); dt.Load(reader); ...一般的查询是没问题的&#xff0c;但是如果涉及主键列的查询&#xf…