当前位置: 首页 > news >正文

Qt_按钮类控件

目录

1、QAbstractButton

2、设置带图标的按钮 

3、设置带有快捷键的按钮 

4、QRadioButtion(单选按钮)

4.1 QButtonGroup 

5、QCheckBox

 结语


前言:

        按钮类控件是Qt中最重要的控件类型之一,该类型的控件可以通过鼠标的点击,或者键盘的按键触发信号。常用的按钮有:1、单击按钮,2、单选按钮,3、多选按钮,根据不同的场景选择合适的按钮。这些按钮的功能大同小异,原因就是他们都继承自QAbstractButton类。

1、QAbstractButton

        QAbstractButton是一个抽象类,他是所有按钮的父类,这也使得继承该类的按钮的大部分属性是相同的,继承示意图如下:

        可以在Qt Designer中更为直观的看到QAbstractButton的属性和继承关系,如下图:

        这些属性的详细介绍如下:

text

设置按钮的文本

icon

设置按钮的图标

iconSize

设置按钮图标的尺寸

shortCut

设置按钮对应的快捷键

autoRepeat

当⿏标按住按钮不放时,是否会一直触发事件。true:会,false:不会

autoRepeatDelay

为true时:按住按钮需要多久才会一直触发事件(类似前摇)

autoRepeatInterval

为true时:重复触发的周期

         这里随便回顾一下,从上述Qt Designer的继承关系中可以看到,QAbstractButton还继承了QWidget,这是合情合理的,因为只要是控件就必须继承QWidget,而按钮类属于控件的一个分支,所以应当继承QWidget。

2、设置带图标的按钮 

           如今是界面设计中,大部分按钮都是带有图标的,这么设计可以增加界面的丰富度,还能够清楚明了的知道该按钮的作用。首先将设置的图标存放到qrc文件中,然后在代码中依据图标的路径拿到该图标即可设置。(qrc讲解见:QWidget属性介绍)

        代码如下:

#include "widget.h"
#include "ui_widget.h"#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton* p = new QPushButton("按钮",this);QIcon q(":/rose.png");//该图标存放在qrc中p->setIcon(q);//设置图标p->setIconSize(QSize(50,50));//将该图标设置为50*50像素
}Widget::~Widget()
{delete ui;
}

        运行结果:

3、设置带有快捷键的按钮 

        除了可以给按钮设置图标外,还可以给按钮设置快捷键,通过键盘的方式点击按钮,并执行对应的槽函数。Qt提供了方法setShortcut给按钮设置快捷键,该方法介绍如下:


void setShortcut(const QKeySequence &key)
//参数是一个QKeySequence对象//QKeySequence的构造方式可以直接用键盘按键构造,比如用字符串“w”表示键盘上是w键
//也可以用系统内置的表示方式,比如 Qt::Key_W 也表示键盘上是w键

        使用控件调用上述方法,则使用快捷键就等于点击该控件,测试代码如下:

        1、widget.h文件(槽函数的实现):

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QPushButton>
//#include <QRect>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void up(){QRect q = p->geometry();p->move(q.x(),q.y()-10);}private:Ui::Widget *ui;QPushButton* p;
};
#endif // WIDGET_H

        2、widget.cpp文件: 

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);p = new QPushButton("向上移动",this);p->setShortcut(QKeySequence("w"));//p->setShortcut(QKeySequence(Qt::Key_W));//该写法也可以设置w的快捷键p->move(400,400);//设置按钮的初始位置connect(p,&QPushButton::clicked,this,&Widget::up);
}Widget::~Widget()
{delete ui;
}

        这里的测试结果不方便用图片的形式表现出来,大概的效果就是按住键盘w键,会让按钮向上移动。题外话:上述例子中,快捷键默认可以重复触发控件,但是鼠标点击不能重复触发控件,重复触发表示一直点击按钮时,按钮会一直产生事件,所以上述代码一直按住按住w键,则按钮会一直向上移动,但是鼠标一直点击按钮,按钮只会移动一次。

        可以在构造函数内添加下面代码即可实现鼠标的重复触发:

p->setAutoRepeat(true);

4、QRadioButtion(单选按钮)

         上述的QPushButton是单击按钮,当在一些需要选择选项的场景下,QPushButton就不能完成期望的效果,这时候需要使用QRadioButtion来实现多选一的效果,并且QRadioButtion继承自QAbstractButton,因此他还是属于按钮类型的。

        QAbstractButton中与QRadioButtion关系较大的属性如下:

checkable
表示该按钮能否被选中,注意不可被选中不代表该按钮不能被点击
checked
表示该按钮是否已经被选中
autoExclusive
选中⼀个按钮之后是否会取消其他按钮的选中( Q RadioButtion默认为true

        实现一个多选一的场景,首先在ui文件中进行界面拖拽式的创建控件,然后再在代码中对这些控件进行槽函数处理,生成的ui界面如下:

        1、widget.h的代码:

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_radioButton_one_clicked();//篮球的槽函数void on_radioButton_two_clicked();//足球的槽函数void on_radioButton_three_clicked();//其他的槽函数private:Ui::Widget *ui;
};
#endif // WIDGET_H

        2、widget.cpp的代码:

#include "widget.h"
#include "ui_widget.h"#include <QRadioButton>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);}Widget::~Widget()
{delete ui;
}void Widget::on_radioButton_one_clicked()
{ui->label->setText("请选择你的兴趣:篮球");
}void Widget::on_radioButton_two_clicked()
{ui->label->setText("请选择你的兴趣:足球");
}void Widget::on_radioButton_three_clicked()
{ui->label->setText("请选择你的兴趣:其他");
}

        测试结果:

        从结果可以发现,由于QRadioButtion本身就是具有“排他行为”,因此选中了一个选项后,之前的选择就会消失,符合多选一的逻辑。

4.1 QButtonGroup 

        上述的单选场景只适用于整个界面中只存在一道选择题,如果该界面中有多道选择题,那么就会出现多道题中只能选择一个选项,显然是不符合预期的。于是,Qt推出控件QButtonGroup,该控件的作用是分组,即组与组之间的QRadioButtion的选中不会影响彼此。

        模拟一个点餐的代码,代码如下:

#include "widget.h"
#include "ui_widget.h"#include <QButtonGroup>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QButtonGroup* group1 = new QButtonGroup(this);QButtonGroup* group2 = new QButtonGroup(this);group1->addButton(ui->Hamburg1);group1->addButton(ui->Hamburg2);group2->addButton(ui->drink1);group2->addButton(ui->drink2);
}Widget::~Widget()
{delete ui;
}

        运行结果:

        通过结果可以发现,香辣鸡腿堡选项和可乐选项不具有“排他反应”。 

5、QCheckBox

        QCheckBox是复选按钮(多选按钮),即多个QCheckBox的按钮之间不存在互斥机制,通常作用于需要选中多个选项的场景。那上述点餐代码中为什么不用QCheckBox按钮呢?因为点餐代码中需要让同一组的按钮存在互斥机制,而QCheckBox按钮即使在同一组内也不会发送互斥。

        测试QCheckBox,先设计一个ui界面如下:

        选择选项后点击确定,这时候就会在标题中显示选中的选项,代码如下:

#include "widget.h"
#include "ui_widget.h"#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_1_clicked()
{QString s("请选择你今天的目标:");if(ui->eat->isChecked()){s+=ui->eat->text();}if(ui->sleep->isChecked()){s+=ui->sleep->text();}if(ui->hit->isChecked()){s+=ui->hit->text();}ui->label->setText(s);qDebug()<<s;
}

        运行结果如下:

 结语

        以上就是关于按钮类控件的讲解,作为Qt中常用控件之一,按钮类控件还是比较重要的,理解了上述这些按钮类控件就足矣满足大部分场景,毕竟在实际生活中也是以上的按钮类型出现的更多一些。

        最后如果本文有遗漏或者有误的地方欢迎大家在评论区补充,谢谢大家!!    

相关文章:

Qt_按钮类控件

目录 1、QAbstractButton 2、设置带图标的按钮 3、设置带有快捷键的按钮 4、QRadioButtion&#xff08;单选按钮&#xff09; 4.1 QButtonGroup 5、QCheckBox 结语 前言&#xff1a; 按钮类控件是Qt中最重要的控件类型之一&#xff0c;该类型的控件可以通过鼠标的点击…...

union 的定义和基本结构以及用途

在 C 语言中&#xff0c;union&#xff08;联合体&#xff09; 是一种数据结构&#xff0c;它允许多个成员共享相同的内存空间。换句话说&#xff0c;联合体中的所有成员都存储在同一块内存区域&#xff0c;不同的成员会占用相同的内存地址&#xff0c;但在同一时刻只能保存一个…...

混合整数规划及其MATLAB实现

目录 引言 混合整数规划的基本模型 混合整数规划的求解方法 MATLAB中的混合整数规划实现 示例&#xff1a;多变量系统的混合整数规划 表格总结&#xff1a;混合整数规划的求解方法与适用场景 结论 引言 混合整数规划&#xff08;Mixed Integer Programming, MIP&#xf…...

【数据结构】6——图1,概念

数据结构6——图1&#xff0c;概念 文章目录 数据结构6——图1&#xff0c;概念基本概念图的分类图的表示方法 基本概念 由 顶点&#xff08;Vertex&#xff09; 和 边&#xff08;Edge&#xff09; 组成的集合。顶点表示图中的点&#xff0c;而边表示顶点之间的连接。记为 G …...

技术周总结 09.09~09.15周日(C# WinForm WPF)

文章目录 一、09.09 周一1.1) 问题01: Windows桌面开发中&#xff0c;WPF和WinForm的区别和联系&#xff1f;联系&#xff1a;区别&#xff1a; 二、09.12 周四2.1&#xff09;问题01&#xff1a;visual studio的相关快捷键有哪些&#xff1f;通用快捷键编辑导航调试窗口管理 2…...

4K投影仪选购全攻略:全玻璃镜头的当贝F6,画面细节纤毫毕现

在当今的投影市场上&#xff0c;4K投影仪已经成了主流产品&#xff0c;越来越多家庭开始关注如何选择一款性价比高、口碑好的4K投影仪。4K投影仪其实指的是具备3840*2160像素分辨率投影仪&#xff0c;它能够提供更清晰、更细腻、更真实的画面效果。 那么4K投影仪该怎么选&…...

除了字符串前导的*号之外,将串中其它*号全部删除

要求 假定输入的字符串中只包含字母和*号。请编写函数fun&#xff0c;它的功能是:除了字符串前导的*号之外&#xff0c;将串中其它*号全部删除。在编写函数时&#xff0c;不得使用C语言提供的字符串函数。函数fun中给出的语句仅供参考。 例如&#xff0c;字符串中的内容为:-**…...

SpringBoot开发——使用@Slf4j注解实现日志输出

文章目录 1、Lombok简介2、SLF4J简介3、实现步骤3.1 创建SpringBoot项目3.2 添加依赖3.3 使用 Slf4j 注解3.4 输出日志信息 4、结论 在现代Java开发中&#xff0c;日志记录是至关重要的。它不仅帮助开发者调试代码&#xff0c;还便于监控系统运行状态和性能。 Lombok 和 SLF4J …...

VSCode拉取远程项目

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

【已解决】SpringBoot3项目整合Druid依赖:Druid监控页面404报错

文章标题 问题描述原因分析解决方案参考资料 问题描述 最近&#xff0c;笔者在SpringBoot3项目中整合Druid连接池时&#xff0c;偶然翻到一条介绍Druid监控的短视频&#xff0c;兴致盎然之下尝试设置了一下Druid监控。 But&#xff0c;按照视频中提供的yml参数对照设置&#x…...

【算法】滑动窗口—找所有字母异位词

“找到字符串中所有字母异位词”的难度为Medium&#xff0c;看一下题目&#xff1a; 给定一个字符串 S 和一个非空字符串 T&#xff0c;找到 S 中所有是 T 的字母异位词的子串&#xff0c;返回这些子串的起始索引。 所谓的字母异位词&#xff0c;其实就是全排列&#xff0c;原题…...

Vue安装及环境配置【图解版】

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 Facts speak louder than words&#xff01; 目录 一.node.js的安装…...

绕过CDN查找真实IP方法

1、前言 在新型涉网案件中&#xff0c;我们在搜集到目标主站之后常常需要获取对方网站的真实IP去进一步的信息搜集&#xff0c;但是现在网站大多都部署了CDN&#xff0c;将资源部署分发到边缘服务器 实现均衡负载&#xff0c;降低网络堵塞&#xff0c;让用户能够更快地访问自己…...

Qt与MQTT交互通信

MQTT全称是&#xff08;Message Queuing Telemetry Transport&#xff09;&#xff0c;即消息队列遥测传输协议 是一种基于发布/订阅&#xff08;Publish/Subscribe&#xff09;模式的轻量级通讯协议&#xff0c;并且该协议构建于TCP/IP协议之上&#xff0c;常用于互联网中&am…...

dd 命令:复制和转换文件

一、dd 命令简介 ​dd​ 命令是一个在 Unix 和类 Unix 系统中用于复制文件和转换文件的命令行工具。它的功能非常强大&#xff0c;可以用于各种目的&#xff0c;例如创建镜像文件、备份和恢复数据、复制数据等。 ​dd​ 是一个用于读取、转换和写入数据的工具&#xff0c;通常…...

文件系统(磁盘 磁盘文件 inode)

文章目录 磁盘看看物理磁盘磁盘的存储结构 对磁盘的储存进行逻辑抽象inode号文件名 -> inode判断文件在哪个分区 磁盘 电脑中存在非常多的文件&#xff0c;被打开的文件只是少量的。 没有被打开的文件&#xff0c;在磁盘中放着&#xff0c;那么文件是如何存取&#xff1f; …...

ThreeJs创建圆环

ThreeJs除了创建基本的长方体&#xff0c;球形&#xff0c;圆柱等几何体&#xff0c;也可以创建一些特殊的几何体&#xff0c;比如圆环&#xff0c;多边体&#xff0c;这节就来讲怎么用Threejs绘制出圆环。首先依然是要创建出基础的组件&#xff0c;包括场景&#xff0c;相机&a…...

React实现类似Vue的路由监听Hook

React实现类似Vue的路由监听Hook 监听路由变化&#xff1b;React Hook封装&#xff0c;返回回调函数&#xff0c;新旧路由为函数参数&#xff1b; 代码 import { useEffect, useRef } from react; import { useHistory, useLocation } from react-router-dom;/*** 监听路由变…...

Visual Studio打开项目的一些小技巧

Visual Studio(VS)是一款功能强大的集成开发环境&#xff0c;许多刚入门C/C的小白也会使用这款软件进行写代码&#xff0c;然而它的操作并不简单&#xff0c;下面将讲解一下VS打开项目文件的一些小技巧。 目录 &#x1f381;创建空项目 ❤️①点击“创建新项目” ❤️②点击“…...

前端页面中使用 ppt 功能,并且可以随意插入关键帧

要在前端页面中实现类似 PowerPoint 的功能&#xff0c;并且能够随意插入和控制关键帧动画&#xff0c;你可以使用 HTML、CSS 和 JavaScript 结合的方式来创建一个互动幻灯片系统。以下是一个详细的实现方案&#xff0c;包括如何插入和控制关键帧动画&#xff1a; 1. 基础 HTM…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...