【QT】常⽤控件详解(三)常用按钮控件PushButton RadioButton CheckButton Tool Button

请添加图片描述

文章目录

  • 前言
  • 一、PushButton
    • 1.1 QAbstractButton
    • 1.2 添加图标的按钮
    • 1.3 给按钮添加快捷键
    • 1.4 代码⽰例:按钮的重复触发
  • 二、 RadioButtion
    • 2.1简介
    • 2.2 几个槽函数 click,press,release, toggled 的区别
    • 2.2 模拟分组点餐
  • 三、 CheckBox
  • 四、Tool Button
  • 🚩总结


前言

一、PushButton

1.1 QAbstractButton

使用QPushButton表示一个按钮.这也是当前我们最熟悉的一个控件了.
QPushButton继承自QAbstractButton .这个类是一个抽象类.是其他按钮的父类.

在这里插入图片描述
在QtDesigner中也能够看到这⾥的继承关系.
在这里插入图片描述
QAbstractButton 中,和QPushButton 相关性较⼤的属性

属性说明
text按钮中的文本
icon按钮中的图标
iconSize按钮中图标的尺寸
shortCut按钮对应的快捷键
autoRepeat按钮是否会重复触发。当鼠标左键按住不放时,
如果设为 true,则会持续产生鼠标点击事件;
如果设为 false,则必须释放鼠标,再次按下鼠标时才能产生点击事件。
(相当于游戏手柄上的 “连发” 效果)
autoRepeatDelay重复触发的延时时间。按住按钮多久之后,开始重复触发。
autoRepeatInterval重复触发的周期。
  1. QAbstractButton作为Qwidget的子类,当然也继承了Qwidget的属性.上面
    介绍的 Qwidget里的各种属性用法,对于QAbstractButton同样适用.因此表格仅列出QAbstractButton独有的属性.
    2.Qt的api 设计风格是非常清晰的.此处列出的属性都是可以获取和设置的.例如,使用text()获取按钮文本;使用setText()设置文本.

事实上,QPushButton的核心功能都是QAbstractButton提供的.自身提供的属性都比较简单.
其中default和audoDefault影响的是按下enter时自动点击哪个按钮的行为;flat把按钮设置为扁平的样式.这里我们暂时都不做过多关注.
在这里插入图片描述

1.2 添加图标的按钮

1)创建resource.qrc⽂件,并导⼊图⽚

#include "widget.h"
#include "ui_widget.h"
#include <QIcon>
#include <QSize>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QIcon icon(":/hachimitsu.jpg");ui->pushButton->setIcon(icon);ui->pushButton->setIconSize(QSize(100, 1000));}

1)在界面中拖五个按钮.
五个按钮的objectName分别为pushButton_target , pushButton_up,pushButton_down , pushButton_left , pushButton_right
五个按钮的初始位置随意,其中 pushButton_target尺寸设置为100*100,其余按钮设为50*50.文本内容均清空
在这里插入图片描述

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

像上述这样的图⽚资源,可以在"阿⾥巴巴⽮量图标库"中查找并免费下载.
https://www.iconfont.cn/

1.3 给按钮添加快捷键

  1. 修改widget.cpp,设置图标资源和快捷键
    使用setShortcut给按钮设置快捷键.参数是一个QKeySequence对象.表示一个按键序列.支持组合键(ctrl+c这种).
    QKeySequence的构造函数参数,可以直接使用"ctrl+c"这样的按键名字符串表示,也可以使用预定义好的常量(形如Qt : : CTRL + Qt : :Key_C )表示.
#include "widget.h"
#include "ui_widget.h"
#include <QIcon>
#include <QSize>
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 正确设置目标按钮的图标(QPushButton使用setIcon而非setPixmap)QIcon targetIcon(":/hachimitsu.jpg");ui->pushButton_target->setIcon(targetIcon);// 设置图标大小(根据需要调整,避免过大或过小)ui->pushButton_target->setIconSize(QSize(140, 120));  // 修正原代码中1000的不合理高度// 方向按钮图标设置ui->pushButton_up->setIcon(QIcon(":/up.png"));ui->pushButton_down->setIcon(QIcon(":/down.png"));ui->pushButton_left->setIcon(QIcon(":/left.png"));ui->pushButton_right->setIcon(QIcon(":/right.png"));// 统一方向按钮图标大小QSize btnSize(30, 30);ui->pushButton_up->setIconSize(btnSize);ui->pushButton_down->setIconSize(btnSize);ui->pushButton_left->setIconSize(btnSize);ui->pushButton_right->setIconSize(btnSize);// 设置快捷键// 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));
}Widget::~Widget()
{delete ui;
}// 上移按钮
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() << "上移";  // 修正调试信息
}// 下移按钮
void Widget::on_pushButton_down_clicked()
{const QRect& rect = ui->pushButton_target->geometry();ui->pushButton_target->setGeometry(rect.x(), rect.y() + 5, rect.width(), rect.height());qDebug() << "下移";  // 修正调试信息
}// 左移按钮
void Widget::on_pushButton_left_clicked()
{const QRect& rect = ui->pushButton_target->geometry();ui->pushButton_target->setGeometry(rect.x() - 5, rect.y(), rect.width(), rect.height());qDebug() << "左移";  // 修正调试信息
}// 右移按钮
void Widget::on_pushButton_right_clicked()
{const QRect& rect = ui->pushButton_target->geometry();ui->pushButton_target->setGeometry(rect.x() + 5, rect.y(), rect.width(), rect.height());qDebug() << "右移";  // 修正调试信息
}
  1. 运⾏程序,此时点击按钮,或者使⽤wasd 均可让哈基米飞行移动.

在这里插入图片描述

1.4 代码⽰例:按钮的重复触发

在上述案例中,按住快捷键,是可以进⾏重复触发的.但是⿏标点击则不能.
修改widget.cpp,在构造函数中开启重复触发.

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

此时,按住⿏标时,即可让哈基米连续飞行移动.

二、 RadioButtion

2.1简介

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

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

  1. 修改widget.cpp,编辑三个QRadioButton 的slot函数.
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("你的选择的性别为:其他");
}
  1. 运⾏程序,可以看到随着选择不同的单选按钮,label中的提⽰⽂字就会随之变化.
    在这里插入图片描述
  2. 当前代码中,如果程序启动,则不会选择任何选项.
    可以修改代码,让程序启动默认选中性别男
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置默认选中按钮ui->radioButton_male->setChecked(true);ui->label->setText("你的选择的性别为:男");
}

此时运⾏程序,即可看到性别男已经被选中了.

在这里插入图片描述

  1. 当前代码中,也可以禁⽤"其他"被选中.

修改widget.cpp的构造函数

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

可见无论怎么点其他都无法选中
在这里插入图片描述

2.2 几个槽函数 click,press,release, toggled 的区别

一直用clicked,这次来学习一下,这剩下四个的区别

  • clicked表⽰⼀次"点击"
  • pressed表⽰⿏标"按下"
  • released表⽰⿏标"释放"
  • toggled表⽰按钮状态切换
  1. 在界⾯上创建四个单选按钮
    objectName分别为radioButton , radioButton_2 , radioButton_3 ,radioButton_4
    在这里插入图片描述
    2)给1创建clicked槽函数,给2创建pressed槽函数,给3创建released槽函数,给4创建toggled槽函数.
void Widget::on_radioButton_1_clicked(bool checked)
{//这个参数就表示当前 radioButton的选中状态qDebug() << "clicked" << checked;
}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";}
}
  1. 运⾏程序,可以看到
  • clicked 是⼀次⿏标按下+⿏标释放触发的.
  • pressed 是⿏标按下触发的.
  • released 是⿏标释放触发的.
  • toggledchecked属性改变时触发的.
    总的来说,toggled是最适合

2.2 模拟分组点餐

  1. 在界⾯上创建6个单选框,⽤来模拟⻨当劳点餐界⾯.
    objectName 分别为radioButtonradioButton_6
    在这里插入图片描述
    此时直接运⾏程序,可以看到,这六个QRadioButton 之间都是排他的.(也就是六个只能选一个)
    我们希望每⼀组内部来控制排他,但是组和组之间不能排他
    在这里插入图片描述

  2. 引⼊QButtonGroup进⾏分组.
    修改widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QButtonGroup>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//创建三个 QButtonGroupQButtonGroup* 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);
}

再次执⾏程序,可以看到可以按照正确的分组⽅式来完成排他了
在这里插入图片描述

三、 CheckBox

  • QcheckBox表示复选按钮.可以允许选中多个.
  • QcheckBox最相关的属性也是checkablechecked ,都是继承自QAbstractButton .
  • 至于QCheckBox独有的属性tristate用来实现"三态复选框".这个东西比较冷门,咱们课堂不做讨论.

1)在界面上创建三个复选按钮,和一个普通按钮.
objectName分别为checkBox_eat , checkBox_sleep , checkBox_play ,以及pushButton
在这里插入图片描述

  1. pushButton 添加slot函数
void Widget::on_pushButton_clicked()
{// 1. 重置结果,避免重复叠加QString result = "今天你的安排是:";// 2. 用列表存储选中的内容,自动处理逗号QStringList tasks;if (ui->checkBox_eat->isChecked())   tasks << ui->checkBox_eat->text();if (ui->checkBox_sleep->isChecked()) tasks << ui->checkBox_sleep->text();if (ui->checkBox_play->isChecked())  tasks << ui->checkBox_play->text();// 3. 拼接内容(自动用逗号分隔)result += tasks.join("、");// 4. 更新显示 + 调试输出ui->label->setText(result);qDebug() << "选中的内容:" << result;
}

效果:
在这里插入图片描述

四、Tool Button

QToolButton的大部分功能,和QPushButton是一致的.但是QToolButton主要应用在工具栏,菜单等场景.这个我们暂时先不介绍.
下篇写完会附注链接


🚩总结

在这里插入图片描述

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

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

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

相关文章

数据结构:反转链表(reverse the linked list)

目录 通过交换元素值实现反转&#xff08;reverse by swapping elements&#xff09; 滑动指针&#xff08;sliding pointers&#xff09; 使用滑动指针反转链表&#xff08;Reversing a Linked List using Sliding Pointers&#xff09; 对比分析 如何用递归&#xff08;R…

【C#】基于SharpCompress实现压缩包解压功能

1.SharpCompress安装 在vs的nuget下搜索安装SharpCompress&#xff0c;如图所示2.解压缩包功能实现 /// <summary> /// 解压压缩包 /// </summary> /// <param name"filePath">压缩包文件路径</param> /// <param name"directoryPat…

mybatis连接PGSQL中对于json和jsonb的处理方法

pgsql数据库表字段设置了jsonb格式&#xff1b;在java的实体里使用String或者对象转换会一直提示一个错误&#xff1a; Caused by: org.postgresql.util.PSQLException: ERROR: column “xx” is of type jsonb but expression is of type character varying 需要加一个转换方法…

Spring AI Alibaba Graph 深度解析:原理、架构与应用实践

1. 引言概述 1.1 什么是 Spring AI Alibaba Graph Spring AI Alibaba Graph 是阿里云团队基于 Spring AI 生态开发的一个强大的工作流编排框架&#xff0c;专门用于构建复杂的 AI 应用。它采用声明式编程模型&#xff0c;通过图结构来定义和管理 AI 工作流&#xff0c;让开发…

C++少儿编程(二十一)—软件执行流程

让我们将以下程序视为用C编写的示例程序。步骤1&#xff1a;预处理器将源代码转换为扩展代码。当您运行程序时&#xff0c;源代码首先被发送到称为预处理器的工具。预处理器主要做两件事&#xff1a;它会从程序中删除注释。它扩展了预处理器指令&#xff0c;如宏或文件包含。它…

精通Webpack搭建Vue2.0项目脚手架指南

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;在Web应用程序开发中&#xff0c;Vue 2.0因其虚拟DOM、单文件组件、增强的生命周期钩子和Vuex及Vue Router状态管理与路由解决方案&#xff0c;成为了提高开发效率和代码组织性的关键。Webpack作为必不可少的模…

无偿分享120套开源数据可视化大屏H5模板

数据可视化跨越了语言、技术和专业的边界&#xff0c;是能够推动实现跨界沟通&#xff0c;实现国际间跨行业的创新的工具。正如画家用颜料表达自我&#xff0c;作者用文字讲述故事&#xff0c;而统计人员用数字沟通 ...... 同样&#xff0c;数据可视化的核心还是传达信息。而设…

Qt按键响应

信号与槽机制是一个非常强大的事件通信机制&#xff0c;是 Qt 最核心的机制之一&#xff0c;初学者掌握它之后&#xff0c;几乎可以做任何交互操作。信号&#xff08;Signal&#xff09; 是一种“事件”或“通知”&#xff0c;比如按钮被点击、文本改变、窗口关闭等。 槽&#…

【Git】常见命令整理

Git分区与操作关系&#xff1a;Working Directory&#xff08;工作区&#xff0c;对于本地的编辑和修改在此进行&#xff09;->Staging Area&#xff08;暂存区/Index&#xff0c;在工作区进行git add操作后的位置&#xff09;->Git Repository&#xff08;本地仓库&…

Linux-Shell脚本基础用法

1.变量定义变量命名规则&#xff1a;可以包含字母&#xff0c;数字&#xff0c;下划线&#xff0c;首字母不能用数字开头&#xff0c;中间不能又空格&#xff1b;为变量赋值等号之间不能为空格&#xff1b;变量命名不能使用标点符号&#xff0c;不能使用bash的关键字&#xff1…

JS中的Map和WeakMap区别和联系

JavaScript 中 Map 与 WeakMap 的区别、联系及示例核心区别特性MapWeakMap键的类型允许任意类型的键&#xff08;对象、原始值&#xff09;键必须是对象&#xff08;非原始值&#xff09;垃圾回收强引用键 → 阻止垃圾回收弱引用键 → 不影响垃圾回收可遍历性支持遍历&#xff…

Linux 环境 libpq加载异常导致psql 连接 PostgreSQL 库失败失败案例

文章目录局点现象定位结论局点环境补充知识点如下库文件加载顺序关键事实&#xff1a;您系统中的证据&#xff1a;优先级对比表&#xff1a;解决方案强化&#xff1a;最终检查&#xff1a;本局点解决方法局点现象 数据库 mdm 升级失败检查日志, 发现是由于 psql 连接数据库报错…

C# XML 文件

在 C# 中处理 XML 文件是非常常见的操作&#xff0c;可以使用System.Xml命名空间中的类来实现。以下是一些常用的 XML 操作示例&#xff1a; 手册链接&#xff1a; System.Xml 命名空间 XmlDocument 创建一个xml数据格式的文档 XmlDocument xml new XmlDocument(); Xml…

LOVON——面向足式Open-Vocabulary的物体导航:LLM做任务分解、YOLO11做目标检测,最后L2MM将指令和视觉映射为动作(且解决动态模糊)

前言 因为项目需要(比如我们在做的两个展厅讲解订单)&#xff0c;近期我一直在研究VLN相关&#xff0c;有些工作哪怕暂时还没开源(将来可能会开源)&#xff0c;但也依然会解读&#xff0c;比如好处之一是构建完整的VLN知识体系&#xff0c;本文便是其中一例 我在解读过程中&am…

【Django】-3- 处理HTTP响应

HttpResponse 家族” 的常用操作&#x1f31f;1. 设置状态码 &#x1f44b;状态码是服务器告诉客户端 “请求处理结果” 的数字暗号&#xff08;比如 404 表示 “没找到页面”&#xff09;。Django 里有 3 种设置方式&#xff1a;方式 1&#xff1a;直接写数字&#xff08;简单…

《React Router深解:复杂路由场景下的性能优化与导航流畅性构建》

路由系统是连接用户操作与应用功能的中枢神经,而React Router作为React生态中处理路由逻辑的核心工具,其在复杂应用中的表现直接决定着用户体验的优劣。当应用规模扩张至数十甚至上百个路由,嵌套层级跨越多层,导航控制中的性能问题便会逐渐凸显——从首屏加载的延迟到路由切…

网络与信息安全有哪些岗位:(4)应急响应工程师

想知道网络与信息安全领域有哪些具体岗位吗&#xff1f; 网络与信息安全有哪些岗位&#xff1a;&#xff08;1&#xff09;网络安全工程师-CSDN博客 网络与信息安全有哪些岗位&#xff1a;&#xff08;2&#xff09;渗透测试工程师_网络安全渗透工程师-CSDN博客 网络与信息安…

Leetcode 3634. Minimum Removals to Balance Array

Leetcode 3634. Minimum Removals to Balance Array 1. 解题思路2. 代码实现 题目链接&#xff1a;3634. Minimum Removals to Balance Array 1. 解题思路 这一题思路上就是一个滑动窗口的思路。 我们首先将整个数组有序排列&#xff0c;然后分别从左向右考察每一个元素作为…

C#/.NET/.NET Core优秀项目和框架2025年7月简报

前言 每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架&#xff08;每周至少会推荐两个优秀的项目和框架当然节假日除外&#xff09;&#xff0c;推文中有项目和框架的详细介绍、功能特点、使用方式以及部分功能截图等。注意&#xff1a;排名不分先后&#xff0c;都是十分…

第 10 篇:深度学习的“军火库”——CNN、RNN与Transformer,AI如何看懂世界?

《人工智能AI之机器学习基石》系列⑩ 专栏核心理念: 用通俗语言讲清楚机器学习的核心原理,强调“洞察 + 技术理解 + 应用连接”,构建一个完整的、富有启发性的知识体系。 引