【Qt】常用控件:按钮类控件

news2024/10/28 14:33:06

思维导图:

一、Push Button

       我们可以使用 QPushButton 表示一个按钮,这也是当前我们最熟悉的一个控件。QPushButton继承于QAbstractButton。这个类是一个抽象类,是按钮的父类。

1.1 常用的属性

属性说明
text按钮中的文本
icon按钮中的图标
iconSize按钮中图标的尺寸
shortCut按钮对应的快捷键
autoRepeat按钮是否会重复触发,当鼠标左键按住不放时
如果设为 true,则会持续产生鼠标点击事件
如果设为false,则必须释放鼠标,再次按下鼠标时才能产生点击事件
(相当于游戏手柄上的“连发”效果)
autoRepeatDelay重复触发的延时时间,按住按钮多久之后,开始重复触发
autoRepeatInterval重复触发的周期

       还有一些不常用的属性,其中 default 和 audoDefault 影响的是按下 enter 时自动点击哪个按钮的行为;flat 把按钮设置为扁平的样式。 

1.2 带有图标的按钮

第一步,创建 resource.qrc 文件,并导入图片

第二步,在界面上创建一个按钮

第三步,给按钮设置图标,代码如下:

// 创建图标
QIcon icon(":/doge.png");
// 设置图标
ui->pushButton->setQIcon(icon);
// 设置图标的大小
ui->pushButton->setIconSize(QSize(50, 50));

1.3 带有快捷键的按钮

第一步,在界面中拖五个按钮,设置好尺寸大小,并将文本内容清空

第二步,创建 resource.qrc 文件,并导入图片

第三步,设置图标资源和快捷键:使用 setShortcut 给按钮设置快捷键,参数是一个 QKeySequence 对象,表示一个按键序列,支持组合键(ctrl + c);QKeySequence 的构造函数参数,可以直接使用 “ctrl + c” 这样的按键名字符串表示,也可以使用预定好的常量(形如 Qt::CTRL + Qt::Key_C)表示。代码如下:

// 设置图标
 ui->pushButton_target->setIcon(QIcon(":/dog.png"));
 ui->pushButton_target->setIconSize(QSize(100, 100));
 ui->pushButton_up->setIcon(QIcon(":/caret-up.png"));
 ui->pushButton_down->setIcon(QIcon(":/caret-down.png"));
 ui->pushButton_left->setIcon(QIcon(":/caret-left.png"));
 ui->pushButton_right->setIcon(QIcon(":/caret-right.png"));
 // 设置快捷键
 ui->pushButton_up->setShortcut(QKeySequence("w"));
 ui->pushButton_down->setShortcut(QKeySequence("s"));
 ui->pushButton_left->setShortcut(QKeySequence("a"));
 ui->pushButton_right->setShortcut(QKeySequence("d"));
 
 // 设置快捷键也可以写作
// ui->pushButton_up->setShortcut(QKeySequence(Qt::Key_W));
// ui->pushButton_down->setShortcut(QKeySequence(Qt::Key_S));
// ui->pushButton_left->setShortcut(QKeySequence(Qt::Key_A));
// ui->pushButton_right->setShortcut(QKeySequence(Qt::Key_D));

第四步,设置四个方向键的槽函数,代码如下:

void Widget::on_pushButton_up_clicked()
{
 const QRect& rect = ui->pushButton_target->geometry();
 ui->pushButton_target->setGeometry(rect.x(), rect.y() - 5, rect.width(), 
rect.height());
 qDebug() << "up";
}

1.4 按钮的重复触发

在上述案例中,按住快捷键,是可以进行重复触发的,但是鼠标点击则不能,我们需要在构造函数中开启重复触发。

// 开启重复触发
ui->pushButton_up->setAutoRepeat(true);

二、Radio Button

       QRadioButton 是一个单选按钮,可以让我们在多个选项中选择一个,作为 QAbstractButton 和 QWidget 的子类,上面介绍的属性和用法,对于 QRadioButton 也同样适用。

2.1 常用的属性 

我们来看一看 QAbstractButton 中和 QRadioButton 关系较大的属性:

属性说明
checkable是否能选中
checked是否已经被选中,checkable 是 checked 的前提条件
autoExclusive是否排他
选中一个按钮之后是否会取消其他按钮的选中
对于 QRadioButton 来说默认就是排他的

2.2 选择性别的代码 

下面,我们来进行一个小例子的编写:选择性别:

第一步,在界面中创建一个 label,和三个单选按钮;

第二步,给每一个单选按钮设置槽函数,当我们点击这个按钮时,会在 label 中写入文字,代码如下:

void Widget::on_radioButton_male_clicked()
{
     ui->label->setText("你选择的性别为: 男");
}

void Widget::on_radioButton_female_clicked()
{
     ui->label->setText("你选择的性别为: ⼥");
}

void Widget::on_radioButton_other_clicked()
{
     ui->label->setText("你选择的性别为: 其他");
}

第三步,可以看到,当我们选择不同的单选按钮,label 中的提示文字就会随之变化

第四步,当前程序中,我们可以设置一个默认值,代码如下:

// 设置默认选中该按钮
ui->radioButton_male->setChecked(true);
ui->label->setText("你选择的性别为: 男");

第五步,我们也可以禁用 “其他” 被选中,但是我们第一个写的语句是有一点问题,当我们点击“其他”选项的时候,发现点不了,但是会触发点击的槽函数,使上面的 label 显示性别为其他。

// 禁用 other 选项
ui->radioButton_other->setCheckable(false);

       所以,我们可以使用 setEnabled 是更彻底的禁用按钮的方式,此时该按钮无法被选中,也无法响应任何输入。

// 禁用 other 选项
ui->radioButton_other->setEnabled(false);

2.3 click,press,release,toggled 的区别

  • clicked 表示一次 “点击”
  • pressed 表示鼠标 “按下”
  • released 表示鼠标 “释放”
  • toggled 表示按钮状态切换

第一步,在界面上创建四个单选按钮

第二步,给 1 创建 clicked 槽函数, 给 2 创建 pressed 槽函数, 给 3 创建 released 槽函数, 给 4 创建 toggled 槽函数,代码如下:

void Widget::on_radioButton_clicked()
{
     qDebug() << "clicked";
}

void Widget::on_radioButton_2_pressed()
{
     qDebug() << "pressed";
}

void Widget::on_radioButton_3_released()
{
     qDebug() << "released";
}

void Widget::on_radioButton_4_toggled(bool checked)
{
     if (checked) {
         qDebug() << "toggled checked true";
     } else {
         qDebug() << "toggled checked false";
     }
} 

第三步,运行程序,我们可以看到下面的情况:

  • clicked 是一次鼠标按下 + 鼠标释放触发的
  • pressed 是鼠标按下触发的
  • released 是鼠标释放触发的
  • toggled 是 checked 属性改变时触发的

总的来说,toggled 是最适合 QRadioButton 的

2.4 单选框分组

第一步,在界面上创建6个单选框,用来模拟麦当劳点餐界面,此时我们直接运行程序,可以看到这个六个 QRadieoButton 之间都是排他的,我们希望每一组内部来控制排他,但是组与组之间不能排他。

第二步,引入 QButtonGroup 进行分组,代码如下:

Widget::Widget(QWidget *parent)
 : QWidget(parent)
 , ui(new Ui::Widget)
{
 ui->setupUi(this);
 // 创建三个 QButtonGroup
 QButtonGroup* group1 = new QButtonGroup(this);
 QButtonGroup* group2 = new QButtonGroup(this);
 QButtonGroup* group3 = new QButtonGroup(this);
 // 把 QRadioButton 两两⼀组, 放到三个 QButtonGroup 中. 
 group1->addButton(ui->radioButton);
 group1->addButton(ui->radioButton_2);
 group2->addButton(ui->radioButton_3);
 group2->addButton(ui->radioButton_4);
 group3->addButton(ui->radioButton_5);
 group3->addButton(ui->radioButton_6);
}

三、Check Box

       QCheckBox 表示复选按钮,可以允许选中多个,和QCheckBox最相关的属性也是 checkable 和 checked ,都是继承自 QAbstractButton。至于 QCheckBox 独有的属性 tristate 用来实现“三态复选框”。

3.1 获取复选按钮的取值

第一步,在界面上创建三个复选按钮,和一个普通按钮

第二步,给普通按钮添加槽函数,代码如下:

void Widget::on_pushButton_clicked()
{
 QString result;
 if (ui->checkBox_eat->isChecked()) {
 result += ui->checkBox_eat->text();
 }
 if (ui->checkBox_sleep->isChecked()) {
 result += ui->checkBox_sleep->text();
 }
 if (ui->checkBox_play->isChecked()) {
 result += ui->checkBox_play->text();
 }
 qDebug() << "选中的内容: " << result;
}

第三步,运行程序,可以看到点击确定按钮时,就会在控制台中输出选中的内容。

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

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

相关文章

「C/C++」C++ STL容器库 之 std::list 双向链表容器

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

【STM32】单片机ADC原理详解及应用编程

本篇文章主要详细讲述单片机的ADC原理和编程应用&#xff0c;希望我的分享对你有所帮助&#xff01; 目录 一、STM32ADC概述 1、ADC&#xff08;Analog-to-Digital Converter&#xff0c;模数转换器&#xff09; 2、STM32工作原理 二、STM32ADC编程实战 &#xff08;一&am…

小程序中设置可拖动区域

官方说明文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/component/movable-area.htmlhttps://developers.weixin.qq.com/miniprogram/dev/component/movable-view.html demo&#xff1a;浮动控件上下移动交互 .wxmx <movable-area><!-- y"…

python之多任务爬虫——线程、进程、协程的介绍与使用(16)

文章目录 1、什么是多任务?1.1 进程和线程的概念1.2 多线程与多进程的区别1.3 并发和并行2、python中的全局解释器锁3、多线程执行机制4、python中实现多线程(threading模块)4.1 模块介绍4.2 模块的使用5、python实现多进行程(Multiprocessing模块)5.1 导入模块5.2 模块的…

多层感知机的从零实现与softmax的从零实现(真·0000零基础)

今天再读zh.d2l书&#xff08;4.2. 多层感知机的从零开始实现 — 动手学深度学习 2.0.0 documentation&#xff09;&#xff0c; 看了关于多层感知机的从零实现与softmax的从零实现 目录 mlp从零实现&#xff0c; 点击“paddle”的代码 点击“torch”的代码 训练 参数解…

k8s部署使用有状态服务statefulset部署eureka集群,需登录认证

一、构建eureka集群镜像 1、编写dockerfile文件&#xff0c;此处基础镜像为arm版本&#xff0c;eureka目录中文件内容&#xff1a;application-dev.yml、Dockerfile、eureka-server-1.0-SNAPSHOT.jar(添加登录认证模块&#xff0c;文章最后附上下载连接) FROM mdsol/java8-j…

深入探索:深度学习在时间序列预测中的强大应用与实现

引言&#xff1a; 时间序列分析是数据科学和机器学习中一个重要的研究领域&#xff0c;广泛应用于金融市场、天气预报、能源管理、交通预测、健康监控等多个领域。时间序列数据具有顺序相关性&#xff0c;通常展示出时间上较强的依赖性&#xff0c;因此简单的传统回归模型往往…

基于SpringBoot的“社区维修平台”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“社区维修平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 管理员登录页面 住户管理页面 社区公关管理页面 维…

【JVM】——JVM运行机制、类加载机制、内存划分

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;JVM引入 1&#xff1a;编程语言 2&#xff1a;JAVA运行机制 二&#xff1a;JVM中内存…

EVADC模块多路触发导致AD值波动

前言&#xff1a;最近开发中遇到一个问题&#xff0c;某一路ADC通道采集的AD值波动比较厉害&#xff0c;达到9个hex值波动&#xff0c;对此进行了分析排查...... 1 排除硬件因素 用示波器对电路图上该ADC通道的测试点进行电压测量&#xff0c;发现电压比较稳定&#xff0c;换算…

【计算机网络三】一篇文章详解TCP/IP四层协议簇

目录 TCP/IP四层协议簇 1.应用层 DNS NAT NAPT HTTP/HTTPS 2.传输层 TCP协议 UDP协议 3.网络层 IP协议 4.数据链路层 以太网 ARP协议 TCP/IP四层协议簇 TCP/IP四层协议簇是目前世界上最流行的网络协议分层方式&#xff0c;本篇文章我将带大家从上到下详解四层协议…

开放式蓝牙耳机哪个品牌好用?爆款开放式耳机推荐!

在当今蓝牙耳机市场中&#xff0c;开放式蓝牙耳机以其独特的设计和舒适的佩戴体验&#xff0c;逐渐成为众多消费者的新宠。然而&#xff0c;面对众多品牌和款式的开放式蓝牙耳机&#xff0c;消费者往往陷入选择的困境。究竟哪个品牌的开放式蓝牙耳机真正好用&#xff1f;其性能…

Python实现贝叶斯优化器(Bayes_opt)优化简单循环神经网络回归模型(SimpleRNN回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 贝叶斯优化器 (BayesianOptimization) 是一种黑盒子优化器&#xff0c;用来寻找最优参数。 贝叶斯…

C#使用开源库EasyModbusTCP跟PLC进行通讯开发步骤

使用C#进行非标自动化系统开发一般涉及的知识包含后台、前台、手持终端、客户端软件等功能模块的开发&#xff0c;其中后台程序连接数据库&#xff0c;而前台Vue界面&#xff0c;手持终端Android程序&#xff0c;客户端C#软件都会跟后台接口程序进行数据交换。 本文主要讨论C#客…

基于知识图谱的紧急事故决策辅助系统

现代社会紧急事故频发&#xff0c;而处理这些突发事件的效率直接决定了后续影响的大小。这时候&#xff0c;数据智能的解决方案会显得尤为重要&#xff01;今天为大家分享一个用【知识图谱】技术驱动的紧急事故决策辅助系统&#xff0c;不仅能帮助你快速处理事故信息&#xff0…

当有违法数据时,浏览器不解析,返回了undefined,导致数据不解析

现象&#xff1a;页面上没有看到数据 排查&#xff1a;断点到线上的源码里&#xff1a;1、协议回调确实没有拿到数据是个undefined 2、network里看服务确实响应了数据 3、控制台没有任何报错。 心情&#xff1a;莫名其妙的现象 我本地有json格式化工具&#xff0c;copy进去后&…

STM32硬件平台

STM32 系列是 STMicroelectronics 设计的高度灵活、广泛应用的微控制器&#xff08;MCU&#xff09;系列&#xff0c;支持从低功耗应用到高性能处理的需求&#xff0c;适用于工业、汽车、消费电子和物联网等广泛领域。STM32 系列具有广泛的硬件种类和丰富的功能&#xff0c;以下…

uniapp 引入了uview-ui后,打包错误,主包过大解决方案

原因&#xff1a;由于使用uniapp来设计小程序&#xff0c;使用uview的组件库&#xff0c;导致了主包过大&#xff0c;无法打包 前提条件&#xff1a;已经完成了分包&#xff0c;如果还没有分包的先分包&#xff0c;需要上传代码时用到 1. 通常情况&#xff0c;大多数都是通过点…

VUE3实现古典音乐网站源码模板

文章目录 1.设计来源1.1 网站首页页面1.2 古典音乐页面1.3 著名人物页面1.4 古典乐器页面1.5 历史起源页面1.6 登录页面1.7 注册页面 2.效果和源码2.1 动态效果2.2 目录结构 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xc…

MIT 6.824 Lab1记录

MapReduce论文阅读 1. 编程模型 Map 函数&#xff08;kv -> kv&#xff09; Map 函数将输入的键值对处理为一系列中间值&#xff08;键值对&#xff09;&#xff0c;并将所有的中间结果传递给 Reduce 处理。 map(String key, String value):// key: document name// val…