Qt6入门教程 12:QAbstractButton

目录

一.状态                  

二.信号

三.使用

1.自定义按钮

2.多选

3.互斥


QAbstractButton类实现了一个抽象按钮,并且让它的子类来指定如何处理用户的动作,并指定如何绘制按钮。QAbstractButton类是所有按钮控件的基类。
QAbstractButton提供了对按钮点击和勾选的支持。QRadioButton和QCheckBox类默认支持勾选,QPushButton和QToolButton默认支持点击,如果需要的话,它们还可以提供切换(toggle)行为。
任何按钮,都可以显示一个包含文本和图标。setText()用来设置文本,setIcon()可以置图标。如果按钮被禁用,其外观更改为“disabled”样式。
如果一个按钮的文本中有“&”,QAbstractButton会创建一个自动快捷键。下面的代码创建一个文本为“Ro&ck && Roll”的按钮。

QPushButton *button = new QPushButton(tr("Ro&ck && Roll"), this);

这个按钮有一个自动快捷键Alt+c,用按下键盘的Alt+c时,字母c下方会出现下划线。在按钮文本字符串中,一个“&”用于标识快捷键字母;如果要显示一个“&”,请使用’&&'。

button->setIcon(QIcon(":/images/print.png"));
button->setShortcut(tr("Alt+F7"));

Qt提供的所有按钮(QPushButton、QToolButton、QCheckBox和QRadioButton)都能够既显示文本也可以显示图标。
默认按钮(在对话框中经常使用,按下Enter键能触发默认按钮的点击事件)由QPushButton::setDefault()和QPushButton::setAutoDefault()提供。在对话框窗口中,每次只有一个QPushButton能被设置为默认按钮,默认按钮的边框会突出显示。

一.状态                  

QAbstractButton提供了按钮所要用到的绝大多数状态:
●isDown()按钮是否被按下。
●isChecked()按钮是否被选中。只有切换(checkable)按钮才能被选中或取消选中。
●isEnabled()按钮是否可以被用户按下(是否禁用)。按钮被禁用后依然可接收鼠标和快捷菜单事件。
●setAutoRepeat()如果用户按下按钮,按钮是否可以自动重复功能。如果启用了autoRepeat,则按下按钮时会定期发出pressed、release和clicked信号。默认情况下,autoRepeat处于关闭状态。初始延迟和重复间隔由autoRepeatDelay和autoRepeatInterval以毫秒为单位定义。
●setCheckable() 按钮是否是一个切换(toggle)按钮。
isDown()和isChecked()的不同点:
当用户点击一个切换按钮并且把它选中,按钮首先被按下并且然后被释放变为选中状态。当用户再次点击(取消选中),按钮首先被置为按下状态,然后变为非选中状态(isDown和isChecked()都为false)。

二.信号

QAbstractButton提供了四个信号:
●pressed()当鼠标光标在按钮内,鼠标左键被按下时,发送此信号。
●released()当鼠标左键被释放时,发送此信号。
●clicked()当按钮被按下然后又被释放,或按下快捷键,或当click()被调用时,发送此信号。
●toggled()当切换按钮的状态变化时,发送此信号。
pressed()、released()、clicked()、toggled()的区别是什么呢?
pressed()是鼠标按下时触发,最先执行;
按下之后,按钮状态发生变化,触发toggled,设置setCheckable(true)后再单击按钮才会触发该信号;
clicked()鼠标松开时触发,最后执行,如果鼠标拖拽到按钮区域之外释放则不会触发。一般情况下connect槽函数时使用该信号;
released()鼠标松开时触发。即使鼠标拖拽到按钮区域之外释放也会触发。
正常情况下点击按钮,信号发送顺序为:pressed() —> toggled() —> released() —> clicked()。
下面用代码加以验证:

#include <QApplication>
#include <QPushButton>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QPushButton *button = new QPushButton("Ro&ck && Roll");
    button->setCheckable(true);
    QObject::connect(button, &QPushButton::pressed, [=]{
        qDebug()<<"pressed";
    });
    QObject::connect(button, &QPushButton::released, [=]{
        qDebug()<<"released";
    });
    QObject::connect(button, &QPushButton::toggled, [=]{
        qDebug()<<"toggled";
    });
    QObject::connect(button, &QPushButton::clicked, [=]{
        qDebug()<<"clicked";
    });
    button->show();
    return a.exec();
}

点击按钮,输出:
pressed
toggled
released
clicked

三.使用

1.自定义按钮

继承QAbstractButton,你至少得重新实现paintEvent()来绘制按钮的外形、文本和图标。通常也建议重新实现sizeHint(),某些情况下还得重新实现hitButton()(判断鼠标是否在按钮区域内)。
下面的代码中集成QAbstractButton实现了MyButton,重新实现了paintEvent。在paintEvent中绘制文本颜色为白色,按钮底色为蓝色(鼠标按下或按钮选中时为红色)。代码中涉及的绘图和布局知识后面会单独介绍。

#include <QApplication>
#include <QMainWindow>
#include <QPushButton>
#include <QPainter>
#include <QHBoxLayout>
#include <QDebug>

class MyButton : public QAbstractButton
{
public:
    MyButton(QWidget *parent = nullptr)
        : QAbstractButton(parent)
    {

    }
protected:
    void paintEvent(QPaintEvent *e) override
    {
        QPainter painter(this);

        painter.fillRect(rect(), Qt::blue);
        if (isDown())
        {
            painter.fillRect(rect(), Qt::red);
        }
        if (isChecked())
        {
            painter.fillRect(rect(), Qt::red);
        }

        painter.setPen(Qt::white);
        painter.drawText(rect(),  Qt::AlignCenter, text());
    };
};

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();
    MyButton *button1 = new MyButton();
    button1->setMinimumSize(60, 30);
    button1->setText("button1");
    MyButton *button2 = new MyButton();
    button2->setMinimumSize(60, 30);
    button2->setText("button2");
    MyButton *button3 = new MyButton();
    button3->setMinimumSize(60, 30);
    button3->setText("button3");
    hLayout->addWidget(button1);
    hLayout->addWidget(button2);
    hLayout->addWidget(button3);
    centralWidget->setLayout(hLayout);
    w.setCentralWidget(centralWidget);

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

2.多选

主要使用QAbstractButton的setCheckable(true)来设置。在“自定义按钮”的基础上修改。

button1->setMinimumSize(60, 30);
button1->setText("button1");
button1->setCheckable(true);
MyButton *button2 = new MyButton();
button2->setMinimumSize(60, 30);
button2->setText("button2");
button2->setCheckable(true);
MyButton *button3 = new MyButton();
button3->setMinimumSize(60, 30);
button3->setText("button3");
button3->setCheckable(true);

3.互斥

也有很多情况下我们只能选中一个按钮,比如很多商用软件的功能导航按钮。
主要设置以下两点:
●使用setCheckable(true)设置可选中
●使用setAutoExclusive(true)设置互斥
在“自定义按钮”的基础上修改。

button1->setMinimumSize(60, 30);
button1->setText("button1");
button1->setCheckable(true);
button1->setAutoExclusive(true);
MyButton *button2 = new MyButton();
button2->setMinimumSize(60, 30);
button2->setText("button2");
button2->setCheckable(true);
button2->setAutoExclusive(true);
MyButton *button3 = new MyButton();
button3->setMinimumSize(60, 30);
button3->setText("button3");
button3->setCheckable(true);
button3->setAutoExclusive(true);

当然使用QButtonGroup(按钮组)也能设置互斥,方法是定义一个按钮组,设置按钮组的互斥属性,然后把需要互斥的按钮都添加到按钮组中。

QButtonGroup *buttonGroup = new QButtonGroup(centralWidget);
buttonGroup->setExclusive(true);
buttonGroup->addButton(button1);
buttonGroup->addButton(button2);
buttonGroup->addButton(button3);

原文链接:Qt6入门教程 12:QAbstractButton-CSDN博客

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

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

相关文章

【Docker】数据持久化 挂载

Docker的镜像是只读的&#xff0c;但是容器是可写的&#xff0c;我们可以将数据写入到容器&#xff0c;不过一旦容器删除数据将会丢 失&#xff0c;那么有什么办法能将数据进行持久化存储呢&#xff1f; ——在宿主机上开辟一块地方&#xff0c;存储内容和docker容器的存储内…

TCP 三次握手 四次挥手以及滑动窗口

TCP 三次握手 简介&#xff1a; TCP 是一种面向连接的单播协议&#xff0c;在发送数据前&#xff0c;通信双方必须在彼此间建立一条连接。所谓的 “ 连接” &#xff0c;其实是客户端和服务器的内存里保存的一份关于对方的信息&#xff0c;如 IP 地址、端口号等。 TCP 可以…

HCIP复习课(bgp选路实验)

1.如图连接网络&#xff0c;合理规格IP地址&#xff0c;AS200内IGP协议为OSPF 2.R1属于AS 100:R2-R3-R4小AS 234 R5-R6-R7/AS567&#xff0c;同时声明大AS 200&#xff0c;R8属于AS300 3.R2-R5 R4-R7之间为联邦EBGP邻居关系 4.R1-R8之间通信 1、ip配置&#xff1a; R1: R2:…

js中 == 和 === 区别(分别在什么情况使用)

文章目录 一、等于操作符二、全等操作符三、区别小结 一、等于操作符 等于操作符用两个等于号&#xff08; &#xff09;表示&#xff0c;如果操作数相等&#xff0c;则会返回 true 前面文章&#xff0c;我们提到在JavaScript中存在隐式转换。等于操作符&#xff08;&#x…

嵌入式——实时时钟(RTC)

目录 一、初识RTC 1.简介 2.特性 3.后备寄存器和RTC寄存器特性 二、RTC组成 1.相关寄存器 &#xff08;1&#xff09;控制寄存器高位&#xff08;RTC_CRH&#xff09; &#xff08;2&#xff09;控制寄存器低位&#xff08;RTC_CRL&#xff09; &#xff08;3&#xf…

常用DOS命令讲解

DOS命令是DOS操作的基础&#xff0c;下面就来介绍一些常用的DOS命令。 DOS内部命令 1、DIR 含义&#xff1a;显示指定路径上所有文件或目录的信息 格式&#xff1a;DIR [盘符&#xff1a;][路径][文件名] [参数] 参数&#xff1a; /W&#xff1a;宽屏显示&#xff0c;一排显示…

Kotlin MultiPlatform:构建跨平台应用的未来

Kotlin MultiPlatform&#xff1a;构建跨平台应用的未来 1 引言 1.1 Kotlin MultiPlatform简介 Kotlin MultiPlatform&#xff08;简称KMP&#xff09;是一种由JetBrains开发的跨平台开发解决方案&#xff0c;它建立在Kotlin语言之上。KMP允许开发者使用一套Kotlin代码来构建…

ELK日志解决方案

ELK日志解决方案 ELK套件日志系统应该是Elasticsearch使用最广泛的场景之一了&#xff0c;Elasticsearch支持海量数据的存储和查询&#xff0c;特别适合日志搜索场景。广泛使用的ELK套件(Elasticsearch、Logstash、Kibana)是日志系统最经典的案例&#xff0c;使用Logstash和Be…

力扣hot100 最小栈 变种栈

Problem: 155. 最小栈 文章目录 思路&#x1f496; Stack 自定义 Node&#x1f37b; Code 思路 &#x1f469;‍&#x1f3eb; 甜姨 &#x1f496; Stack 自定义 Node 时间复杂度: O ( 1 ) O(1) O(1) 空间复杂度: O ( n ) O(n) O(n) &#x1f37b; Code class MinS…

基于Matlab/Simulink直驱式风电储能制氢仿真模型

接着还是以直驱式风电为DG中的研究对象&#xff0c;上篇博客考虑的风电并网惯性的问题&#xff0c;这边博客主要讨论功率消纳的问题。 考虑到风速是随机变化的&#xff0c;导致风电输出功率的波动性和间歇性问题突出&#xff1b;随着其应用规模的不断扩大以及风电在电网中渗透率…

【无标题】Gateway API 实践之(五)FSM Gateway 的会话保持功能

网关的会话保持功能是一种网络技术&#xff0c;旨在确保用户的连续请求在一段时间内被定向到同一台后端服务器。这种功能在需要保持用户状态或进行连续交互的场景中特别重要&#xff0c;例如在维护在线购物车、保持用户登录状态或处理多步骤事务时。 会话保持通过提供一致的用…

数据结构总结

数据结构总结 数据结构系列的文章从基本数据类型到数据结构&#xff0c;涵盖整型、布尔值、字符串、列表、元组、字典、集合、堆、栈、链表、树和图&#xff0c;以及队列和环等相关内容。 这里再补充一点&#xff1a;树和图都有更高阶的“玩法”&#xff0c;那就是加权——为每…

(Java企业 / 公司项目)微服务Sentinel限流如何使用?

1. Sentinel限流降级&#xff1a; 一个接口一个方法流量大限制流量&#xff0c;有些接口流量通过了有的没有通过所以就出现了降级操作 2. Sentinel熔断降级&#xff1a;A调用B B自身原因响应不稳定等&#xff0c;A觉得不稳定所以就断开就像保险丝一样 3. Sentinel nacos组合&…

Python魔法函数和迭代器

文章目录 引入魔法函数 和for循环原理iter和next函数 刷完这60个标准库模块&#xff0c;成为Python骨灰级玩家 引入 每个Pythoner对for...in这种循环都很熟悉&#xff0c;其使用方法如下 for i in [1,2,3,4,5]:print(i)输出如下 1 2 3 4 5 1\\2\\3\\4\\5 12345 上述代码非常…

未发表!基于主从博弈的多主体微网/综合能源系统利益分摊与能量管理程序代码!

适用平台&#xff1a;MatlabYalmipCplex 程序首先建立了综合能源运营商、新能源用户、电动汽车充电商的多主体园区&#xff0c;分析了三种市场交易主体的属性和市场交易机制。其次建立基于主从博弈的三方市场主体能量管理与收益分摊方案&#xff0c;利用改进粒子群算法进行求解…

【GitHub项目推荐--十六进制编辑器】【转载】

一款名为 ImHex 的十六进制编辑器获得了 15.3k 的 Star。十六进制编辑器可以让你以十六进制的形式查看或编辑文件的二进制数据&#xff0c;并用较为友好的界面来编辑二进制数据&#xff0c;和常见的十六进制编辑器 GNOME Hex Editor 等不一样&#xff0c;ImHex 功能非常强大&am…

HTML5和CSS3的新特性

HTML5的新特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等 1&#xff0c;HTML5新增的语义化标签 <header> 头部标签 <nav> 导航标签 <article> …

AtCoder Beginner Contest 338D - Island Tour【枚举】

原题链接&#xff1a;https://atcoder.jp/contests/abc338/tasks/abc338_d Time Limit: 2 sec / Memory Limit: 1024 MB Score: 425 points 问题陈述 AtCoder 群岛由 N 座岛屿组成&#xff0c;这些岛屿由 N 座桥梁连接。这些岛屿的编号从1到N&#xff0c;i(1≤i≤N−1)桥双…

Qt WebEngine模块使用(开发环境安装和程序开发)

一、Qt WebEngine Qt WebEngine_hitzsf的博客-CSDN博客 Qt WebEngine模块提供了一个Web浏览器引擎&#xff0c;可以轻松地将万维网上的内容嵌入到没有本机Web引擎的平台上的Qt应用程序中。Qt WebEngine提供了用于渲染HTML&#xff0c;XHTML和SVG文档的C 类和QML类型&#xff…

(南京观海微电子)——OLED生产与技术

一、OLED的分类 以下是几种OLED&#xff1a;被动矩阵OLED、 主动矩阵OLED、透明OLED、顶部发光OLED、可折叠OLED、白光OLED等。 每一种OLED都有其独特的用途。接下来&#xff0c;我们会逐一讨论这几种OLED。首先是被动矩阵和主动矩阵OLED。 被动矩阵OLED(PMOLED) 被动矩阵OLED结…