【QT】 控件 -- 按钮类(Button)

🔥 目录

    • 1. 前言
    • 2. Push Button 按钮
      • 1、带有图标的按钮 -- 纯代码实现
      • 2、带有快捷键的按钮 -- 图形化&代码实现
      • 3、按钮的重复触发
    • 3. Radio Button 按钮
      • **1. click、press、release、toggled 的区别**
      • **2. 单选框分组**
    • 4. Check Box 复选
    • 5. Tool Button
    • 6. 共勉


1. 前言

🚀 之前我在上一篇文章已经说了 QWidget 涉及到的各种属性/函数/使用方法,针对接下来等下要介绍的 Qt 的各种控件都是有效的啦 !!!

2. Push Button 按钮

在这里插入图片描述

在 Qt Designer 也能看到这里的继承关系.

  • 继承关系:在 Qt Designer 中可以看到 QPushButton 的继承层次结构,它继承了 QWidget 的所有属性,并添加了一些特有的属性。
    在这里插入图片描述

QAbstractButton 中,和 QPushButton 相关性较大的属性:

属性说明
text按钮中的文本。用于显示在按钮上的文字内容。
icon按钮中的图标。可以为按钮设置一个图标,增强视觉效果或指示功能。
iconSize按钮中图标的尺寸。指定图标的大小,确保图标在不同分辨率下都能正确显示。
shortCut按钮对应的快捷键。允许用户通过键盘快捷键触发按钮的点击事件。
autoRepeat按钮是否会重复触发。当鼠标左键按住不放时:
- 如果设为 true,则会持续产生鼠标点击事件(相当于游戏手柄上的“连发”效果);
- 如果设为 false,则必须释放鼠标,再次按下鼠标时才能产生点击事件。
autoRepeatDelay重复触发的延时时间。按住按钮多久之后,开始重复触发。
autoRepeatInterval重复触发的周期。即每次重复触发之间的时间间隔。
  • QAbstractButton 作为 QWidget 的子类,当然也继承了 QWidget 的属性。上面介绍的 QWidget 里的各种属性用法,对于 QAbstractButton 同样适用。因此表格仅列出 QAbstractButton 独有的属性
  • Qt 的 api 设计风格是非常清晰的,此处列出的属性都是可以获取和设置的。例如,使用 text() 获取按钮文本,使用 setText() 设置文本

事实上,QPushButton 的核心功能都是 QAbstractButton 提供的,自身提供的属性都比较简单。其中,defaultaudoDefault 影响的是按下 enter 时自动点击哪个按钮的行为,flat 把按钮设置为扁平的样式。

1、带有图标的按钮 – 纯代码实现

具体操作步骤参见上篇文章所讲的 QWidget 核心属性中的 windowIcon 部分。

老样子,先引入图片 prc,然后在界面上创建一个按钮, 再修改 widget.cpp,给按钮设置图标

在这里插入图片描述

2、带有快捷键的按钮 – 图形化&代码实现

1)在界面中拖五个按钮

五个按钮的 objectName 分别为 pushButton_targetpushButton_uppushButton_downpushButton_leftpushButton_right
在这里插入图片描述

  • 上面我们可以通过点阵把按钮对齐

2)创建 resource.qrc,并导入 5 个图片
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 像上述这样的图片资源,可以在 阿里巴巴矢量图标库 中查找并免费下载.

3)修改 widget.cpp,设置图标资源和快捷键

  • 使用 setShortcut 给按钮设置快捷键,参数是⼀个QKeySequence 对象,表示一个按键序列,支持持组合键(Ctrl + C 这种)。
  • QKeySequence 的构造函数参数,可以直接使用 “Ctrl + C” 这样的按键名字符串表示,也可以使用预定义好的常量(形如 Qt::CTRL + Qt::Key_C)表示。

widget.cpp 构造函数代码修改如下:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 设置这些按钮的图标ui->pushButton_target->setIcon(QIcon(":/target.png"));ui->pushButton_target->setIconSize(QSize(150, 120));ui->pushButton_up->setIcon(QIcon(":/Up.png"));ui->pushButton_up->setIconSize(QSize(50, 50));ui->pushButton_down->setIcon(QIcon(":/down.png"));ui->pushButton_down->setIconSize(QSize(50, 50));ui->pushButton_left->setIcon(QIcon(":/left.png"));ui->pushButton_left->setIconSize(QSize(50, 50));ui->pushButton_right->setIcon(QIcon(":/right.png"));ui->pushButton_right->setIconSize(QSize(50, 50));// 按键快捷键设置//    // 方法1:直接通过按键的名字来设置,虽然简单但易写错
//    ui->pushButton_up->setShortcut(QKeySequence("ctrl + w"));
//    ui->pushButton_down->setShortcut(QKeySequence("s"));
//    ui->pushButton_left->setShortcut(QKeySequence("a"));
//    ui->pushButton_right->setShortcut(QKeySequence("d"));// 方法2:通过按键的枚举来设置按键快捷键// ui->pushButton_up->setShortcut(QKeySequence(Qt::CTRL+ Qt::Key_W));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));
}

4)再修改 widget.cpp,设置四个方向键的 slot 函数

void Widget::on_pushButton_up_clicked()
{// 获取到 target 位置QRect rect = ui->pushButton_target->geometry();// 基于获取的位置,设置新位置ui->pushButton_target->setGeometry(rect.x(), rect.y() - 5, rect.width(), rect.height());
}void Widget::on_pushButton_down_clicked()
{// 获取到 target 位置QRect rect = ui->pushButton_target->geometry();// 基于获取的位置,设置新位置ui->pushButton_target->setGeometry(rect.x(), rect.y() + 5, rect.width(), rect.height());
}void Widget::on_pushButton_left_clicked()
{// 获取到 target 位置QRect rect = ui->pushButton_target->geometry();// 基于获取的位置,设置新位置ui->pushButton_target->setGeometry(rect.x() - 5, rect.y(), rect.width(), rect.height());
}void Widget::on_pushButton_right_clicked()
{// 获取到 target 位置QRect rect = ui->pushButton_target->geometry();// 基于获取的位置,设置新位置ui->pushButton_target->setGeometry(rect.x() + 5, rect.y(), rect.width(), rect.height());
}

5)运行程序 ,此时点击按钮,或者使用 wasd 均可让 target 移动

在这里插入图片描述

3、按钮的重复触发

在上述案例中按住快捷键,是可以进行重复触发的,但是鼠标点击则不能。

修改 widget.cpp,在构造函数中开启 重复触发 的功能

在这里插入图片描述

3. Radio Button 按钮

QRadioButton单选按钮,可以让我们在多个选项中选择一个

作为 QAbstractButton 和 QWidget 的子类,上面介绍的属性和用法,对于 QRadioButton 同样适用。

QAbstractButton 中和 QRadioButton 关系较大的属性:

属性说明
checkable是否能选中。如果设置为 true,按钮可以在选中和未选中状态之间切换;如果设置为 false,则按钮不具备选中功能。
checked是否已经被选中。只有当 checkable 设置为 true 时,此属性才有意义。用于检查或设置按钮当前是否处于选中状态。
autoExclusive是否排他。对于一组按钮而言,如果其中一个按钮被选中,则其他按钮的选中状态将被取消。此属性通常用于单选按钮(如 QRadioButton),但也可以应用于 QPushButton 来实现类似的行为。

下面我们举一个 选择性别 的例子,如下:

(1)在界面上创建⼀个 label 和 3 个单选按钮

设置的文本如下图,3 个单选按钮的 objectName 分别为:radioButton_maleradioButton_femaleradioButton_other

在这里插入图片描述

  • 这里强调一下:如果我们的 Label 标签拉的不够长的话,可能会出现点击按钮没有变化的情况

(2)修改 widget.cpp,编辑三个 QRadioButton 的 slot 函数,然后运行程序就可以看到随着选择不同的单选按钮,label 中的提示文字就会随之变化:

在这里插入图片描述

(3)当前代码中,如果程序启动时并不会选择任何选项,但是可以修改代码,让程序 启动默认选中某个选项 或者 禁用某个选项被选中,如下:

在这里插入图片描述

  • 运行程序可以看到,点击 “其他” 按钮的时候,虽然不会被选中,但是可以触发点击事件,使上面的 label 显示性别为其他
  • 但是如果使用 setEnabled 是更彻底的禁用按钮的方式,此时该按钮无法被选中,也无法响应任何输入

还记得我们转到槽那里的四个选项,它们究竟有什么区别呢?下面我们来看看

在这里插入图片描述

1. click、press、release、toggled 的区别

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

(1)在界面上创建四个单选按钮

objectName 分别为 radioButton、radioButton_2、radioButton_3、radioButton_4

在这里插入图片描述

(2)给 1 创建 clicked 槽函数,给 2 创建 pressed 槽函数,给 3 创建 released 槽函数,给 4 创建 toggled 槽函数

在这里插入图片描述

可以看到:

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

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

2. 单选框分组

1)在界面上创建 6 个单选框,用来模拟麦当劳点餐界面。

objectName 分别为 radioButton 到 radioButton_6
在这里插入图片描述

此时直接运行程序可以看到,这六个 QRadioButton 之间都是排他的。我们希望每一组内部来控制排他,但是 组和组之间不能排他

2)引入 QButtonGroup 进行分组

修改 widget.cpp

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);
}

再次执行程序可以看到可以按照正确的分组方式来完成排他了

在这里插入图片描述

4. Check Box 复选

QCheckBox 表示复选按钮,可以允许选中多个。和 QCheckBox 最相关的属性也是 checkablechecked,都是继承自 QAbstractButton

🔥至于 QCheckBox 独有的属性 tristate 用来实现 “三态复选框”,这个东西比较冷门,这里暂时不讲述。

【获取复选按钮的取值】

(1)在界面上创建三个复选按钮和一个普通按钮

objectName 分别为 checkBox_eatcheckBox_studycheckBox_sleep 以及 pushButton

在这里插入图片描述

(2)给 pushButton 添加 slot 函数,运行程序,可以看到点击确认按钮时,就会在控制台中输出选中的内容:

在这里插入图片描述

5. Tool Button

QToolButton 的大部分功能和 QPushButton 是一致的,但 QToolButton 主要应用在工具栏、菜单等场景。

6. 共勉

★,°:.☆( ̄▽ ̄)/$:.°★ 】那么本篇到此就结束啦,如果有不懂 和 发现问题的小伙伴可以在评论区说出来哦,同时我还会继续更新关于【Qt】的内容,请持续关注我 !!
在这里插入图片描述

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

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

相关文章

postman请求参数化

postman界面介绍 一、使用环境变量(Environment Variables)进行参数化 1、在请求中使用环境变量 在请求的url、请求头(Headers)、请求体(Body)等部分都可以使用环境变量。 URL 部分示例 点击 Postman 界面右上角的 “眼睛” 图标(Environment Quick Look)打开环境管理…

在 Babylon.js 中使用 Gizmo:交互式 3D 操作工具

在 3D 应用程序中,交互式操作对象(如平移、旋转、缩放)是一个常见的需求。Babylon.js 提供了一个强大的工具——Gizmo,用于在 3D 场景中实现这些功能。本文将介绍如何在 Babylon.js 中使用 Gizmo,并展示如何通过代码实…

虚幻商城 Fab 免费资产自动化入库

文章目录 一、背景二、实现效果展示三、实现自动化入库一、背景 上一次写了个这篇文章 虚幻商城 Quixel 免费资产一键入库,根据这个构想,便决定将范围扩大,使 Fab 商城的所有的免费资产自动化入库,是所有!所有! 上一篇文章是根据下图这部分资产一键入库: 而这篇文章则…

Ubuntu 22.04.5 修改IP

Ubuntu22.04.5使用的是netplan管理网络,因此需要在文件夹/etc/netplan下的01-network-manager-all.yaml中修改,需要权限,使用sudo vim或者其他编辑器,修改后的内容如下: # Let NetworkManager manage all devices on …

通过学习更多样化的生成数据进行更广泛的数据分发来改进实例分割

大家读完觉得有帮助记得关注和点赞!!! 本次使用的英文整理的一些记录,练习一下为后续SCI发表论文打好基础 Improving Instance Segmentation by Learning Wider Data Distribution with More Diverse Generative Data Abstract In…

写作利器:如何用 PicGo + GitHub 图床提高创作效率

你好呀,欢迎来到 Dong雨 的技术小栈 🌱 在这里,我们一同探索代码的奥秘,感受技术的魅力 ✨。 👉 我的小世界:Dong雨 📌 分享我的学习旅程 🛠️ 提供贴心的实用工具 💡 记…

通过Ukey或者OTP动态口令实现windows安全登录

通过 安当SLA(System Login Agent)实现Windows安全登录认证,是一种基于双因素认证(2FA)的解决方案,旨在提升 Windows 系统的登录安全性。以下是详细的实现方法和步骤: 1. 安当SLA的核心功能 安…

基于Python的多元医疗知识图谱构建与应用研究(上)

一、引言 1.1 研究背景与意义 在当今数智化时代,医疗数据呈爆发式增长,如何高效管理和利用这些数据,成为提升医疗服务质量的关键。传统医疗数据管理方式存在数据孤岛、信息整合困难等问题,难以满足现代医疗对精准诊断和个性化治疗的需求。知识图谱作为一种知识表示和管理…

疑难Tips:解决 SQL*Plus 中工具插入中文数据到Oracle数据库报错及乱码问题

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 原文地址:疑难Tips:解决 SQL*Plus 中工具插入中文数据到Oracle数据库报错及乱码问题在SQL*Plus执行插入语句中含有中文时,出现ORA-01756错误和乱码。这两个问题…

Mac 上如何安装Mysql? 如何配置 Mysql?以及如何开启并使用MySQL

前言: 有许多开发的小伙伴,使用的是mac,那么在mac上如何安装,配置Mysql,以及使用Mysql了,今天来一个系统的教程。 安装Mysql 使用mysql前,我们需要先下载mysql,并按照以下几个步骤…

iOS中的设计模式(三)- 工厂方法

引言 几乎在每个用面向对象语言开发的应用程序中,都能见到工厂方法模式的身影。它是 抽象工厂模式 的核心组成部分。通过重载抽象工厂父类中定义的工厂方法,各种具体工厂能够创建属于自己的对象。 在工厂方法模式中,生产者 本身并不一定是抽…

VSCode最新离线插件拓展下载方式

之前在vscode商店有以下类似的download按钮,但是2025年更新之后这个按钮就不提供了,所以需要使用新的方式下载 ps:给自己的网站推广下~~(国内直连GPT/Claude) 新的下载方式1 首先打开vscode商店官网:vscode插件下载…

2024人工智能AI+制造业应用落地研究报告汇总PDF洞察(附原数据表)

原文链接: https://tecdat.cn/?p39068 本报告合集洞察深入剖析当前技术应用的现状,关键技术 创新方向,以及行业应用的具体情况,通过制造业具体场景的典型 案例揭示人工智能如何助力制造业研发设计、生产制造、运营管理 和产品服…

【2024 年度总结】从小白慢慢成长

【2024 年度总结】从小白慢慢成长 1. 加入 CSDN 的契机2. 学习过程2.1 万事开头难2.2 下定决心开始学习2.3 融入技术圈2.4 完成万粉的目标 3. 经验分享3.1 工具的选择3.2 如何提升文章质量3.3 学会善用 AI 工具 4. 保持初心,继续前行 1. 加入 CSDN 的契机 首次接触…

Unity Shader学习日记 part5 CG基础

在了解完Shader的基本结构之后,我们再来看看编写着色器的语言。 Shader编写语言有CG,HLSL两种,我们主要学习CG的写法。 数据类型 CG的基础变量类型 uint a12;//无符号32位整形 int b12;//32位整形float f1.2f;//32位浮点型 half h1.2h;//…

AI Agent:深度解析与未来展望

一、AI Agent的前世:从概念到萌芽 (一)早期探索 AI Agent的概念可以追溯到20世纪50年代,早期的AI研究主要集中在简单的规则系统上,这些系统的行为是确定性的,输出由输入决定。随着时间的推移,…

【24】Word:小郑-准考证❗

目录 题目 准考证.docx 邮件合并-指定考生生成准考证 Word.docx 表格内容居中表格整体相较于页面居中 考试时一定要做一问保存一问❗ 题目 准考证.docx 插入→表格→将文本转换成表格→✔制表符→确定选中第一列→单击右键→在第一列的右侧插入列→布局→合并单元格&#…

计算机网络 (46)简单网络管理协议SNMP

前言 简单网络管理协议(SNMP,Simple Network Management Protocol)是一种用于在计算机网络中管理网络节点的标准协议。 一、概述 SNMP是基于TCP/IP五层协议中的应用层协议,它使网络管理员能够管理网络效能,发现并解决网…

机器人“大脑+小脑”范式:算力魔方赋能智能自主导航

在机器人技术的发展中,“大脑小脑”的架构模式逐渐成为推动机器人智能化的关键。其中,“大脑”作为机器人的核心决策单元,承担着复杂任务规划、环境感知和决策制定的重要角色,而“小脑”则专注于运动控制和实时调整。这种分工明确…

Linux 使用 GDB 进行调试的常用命令与技巧

GDB 调试的常用命令与技巧 1. GDB 常用命令1.1 安装 GDB1.2 启动 GDB1.3 设置程序的参数1.4 设置断点1.5 启动程序并运行至断点1.6 执行一步1.7 打印变量值1.8 查看函数调用栈 2. GDB 调试 Core 文件2.1 生成 Core 文件2.2 使用 GDB 调试 Core 文件 3. GDB 调试正在运行的程序3…