8.QT-按钮类控件|Push Button|Radio Button|Check Box|Tool Button(C++)

Push Button

使⽤ QPushButton 表⽰⼀个按钮.这也是当前我们最熟悉的⼀个控件了.
QPushButton 继承⾃ QAbstractButton .这个类是⼀个抽象类.是其他按钮的⽗类

![[Pasted image 20250419191533.png]]

在Qt Designer中也能够看到这⾥的继承关系

属性说明
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)创建 resource.qrc ⽂件,并导⼊图⽚
![[Pasted image 20250419205021.png]]

2)在界⾯上创建⼀个按钮
![[Pasted image 20250419205128.png]]

3)修改widget.cpp,给按钮设置图标

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//创建图标对象QIcon icon(":/dog.jpg");//设置图标ui->pushButton->setIcon(icon);
}Widget::~Widget()
{delete ui;
}

![[Pasted image 20250419205838.png]]

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//创建图标对象QIcon icon(":/dog.jpg");//设置图标ui->pushButton->setIcon(icon);//设置图标尺寸ui->pushButton->setIconSize(QSize(50, 50));
}Widget::~Widget()
{delete ui;
}

![[Pasted image 20250419210014.png]]

代码⽰例:带有快捷键的按钮

1)在界⾯中拖五个按钮.
五个按钮的objectName分别为 pushButton_target , pushButton_up ,pushButton_down ,pushButton_left , pushButton_right 五个按钮的初始位置随意,其中 pushButton_target 尺⼨设置为100*100,其余按钮设为50*50.⽂本内容均清空
2)创建 resource.qrc ,并导⼊5个图⽚
![[Pasted image 20250419211936.png]]

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

  • 使⽤ setShortcut 给按钮设置快捷键.参数是⼀个QKeySequence对象.表⽰⼀个按键序列.⽀持组合键(ctrl+c这种).
  • QKeySequence的构造函数参数,可以直接使⽤"ctrl+c"这样的按键名字符串表⽰,也可以使⽤预定义好的常量(形如 Qt::CTRL + Qt::Key_C )表⽰.
    ![[Pasted image 20250419212257.png]]

![[Pasted image 20250419212400.png]]

完成初始化

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置图标ui->pushButton_target->setIcon(QIcon(":/image/box.png"));ui->pushButton_target->setIconSize(QSize(100,100));ui->pushButton_up->setIcon(QIcon(":/image/up.png"));ui->pushButton_up->setIconSize(QSize(50,50));ui->pushButton_down->setIcon(QIcon(":image/down.png"));ui->pushButton_down->setIconSize(QSize(50,50));ui->pushButton_left->setIcon(QIcon(":image/left.png"));ui->pushButton_left->setIconSize(QSize(50,50));ui->pushButton_right->setIcon(QIcon(":image/right.png"));ui->pushButton_right->setIconSize(QSize(50,50));
}Widget::~Widget()
{delete ui;
}

![[Pasted image 20250419213210.png]]

完成槽函数

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

在构造函数完成快捷键

    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.cpp,在构造函数中开启重复触发
在构造函数中

    ui->pushButton_up->setAutoRepeat(true);ui->pushButton_down->setAutoRepeat(true);ui->pushButton_left->setAutoRepeat(true);ui->pushButton_right->setAutoRepeat(true);

Radio Buttion

QRadioButton 是单选按钮.可以让我们在多个选项中选择⼀个.
作为 QAbstractButton 和 QWidget 的⼦类,上⾯介绍的属性和⽤法,对于 QRadioButton 同样适⽤.
QAbstractButton 中和 QRadioButton 关系较⼤的属性

属性说明
checkable是否能选中
checked是否已经被选中.checkable是checked的前提条件.
autoExclusive是否排他.
选中⼀个按钮之后是否会取消其他按钮的选中.
对于 QRadioButton 来说默认就是排他的
代码⽰例:选择性别

1)在界⾯上创建⼀个label,和3个单选按钮
设置的⽂本如下图.3个单选按钮的 objectName 分别为 radioButton_male ,radioButton_female , radioButton_other
![[Pasted image 20250419220147.png]]

编写槽函数

void Widget::on_radioButton_male_clicked()
{//把界面上的label的内容进行更新ui->label->setText("你选择的性别为:男");
}void Widget::on_radioButton_female_clicked()
{ui->label->setText("你选择的性别为:女");
}void Widget::on_radioButton_other_clicked()
{ui->label->setText("你选择的性别为:其他");
}

![[Pasted image 20250419220411.png]]

在构造函数添加默认选项

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//添加一个默认的选项ui->radioButton_male->setChecked(true);ui->label->setText("你选择的性别为:男");
}

禁用其他选项

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//添加一个默认的选项ui->radioButton_male->setChecked(true);ui->label->setText("你选择的性别为:男");//禁用其他选项ui->radioButton_other->setCheckable(false);
}

![[Pasted image 20250419221123.png]]

checkable只是能够让按钮不被选中,仍然是可以响应点击事件的

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//添加一个默认的选项ui->radioButton_male->setChecked(true);ui->label->setText("你选择的性别为:男");//禁用其他选项//ui->radioButton_other->setCheckable(false);ui->radioButton_other->setEnabled(false);//ui->radioButton_other->setDisabled(true);
}

要使用Widget的属性
![[Pasted image 20250419221409.png]]

代码⽰例:click,press,release,toggled的区别
  • clicked表⽰⼀次"点击"
  • pressed表⽰⿏标"按下"
  • released表⽰⿏标"释放"
  • toggled表⽰按钮状态切换.
    1)在界⾯上创建四个单选按钮
    objectName 分别为 radioButton , radioButton_2 , radioButton_3 ,radioButton_4
    ![[Pasted image 20250419221819.png]]

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

void Widget::on_radioButton_clicked(bool checked)
{// 此处从 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)
{//如果当前checked状态发生改变,就会触发这个信号qDebug() << "toggled: " << checked;
}

![[Pasted image 20250419222518.png]]

3)运⾏程序,可以看到

  • clicked 是⼀次⿏标按下+⿏标释放触发的.
  • pressed 是⿏标按下触发的.
  • released 是⿏标释放触发的.
  • toggled 是checked属性改变时触发的.
    总的来说,toggled是最适合 QRadioButton 的
代码⽰例:单选框分组

1)在界⾯上创建6个单选框,⽤来模拟⻨当劳点餐界⾯.
objectName 分别为 radioButton 到 radioButton_6
![[Pasted image 20250420085424.png]]

此时直接运⾏程序,可以看到,这六个 QRadioButton 之间都是排他的.
我们希望每⼀组内部来控制排他,但是组和组之间不能排他.
2)引⼊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);//把上述单选按钮,放到不同的组里group1->addButton(ui->radioButton);group1->addButton(ui->radioButton_2);group1->addButton(ui->radioButton_3);group2->addButton(ui->radioButton_4);group2->addButton(ui->radioButton_5);group2->addButton(ui->radioButton_6);group3->addButton(ui->radioButton_7);group3->addButton(ui->radioButton_8);
}

再次执⾏程序,可以看到可以按照正确的分组⽅式来完成排他了
![[Pasted image 20250420090358.png]]

Check Box

QCheckBox 表⽰复选按钮.可以允许选中多个.和 QCheckBox 最相关的属性也是 checkable 和 checked ,都是继承⾃QAbstractButton .
⾄于 QCheckBox 独有的属性 tristate ⽤来实现"三态复选框".这个东西⽐较冷⻔,

代码⽰例:获取复选按钮的取值

1)在界⾯上创建三个复选按钮,和⼀个普通按钮.
![[Pasted image 20250420091312.png]]

2)给 pushButton 添加slot函数

void Widget::on_pushButton_clicked()
{QString result = "今天的安排是";if (ui->checkBox_study->isChecked()){result += ui->checkBox_study->text();}if (ui->checkBox_game->isChecked()){result += ui->checkBox_game->text();}if (ui->checkBox_work->isChecked()){result += ui->checkBox_work->text();}ui->label->setText(result);
}

3)运⾏程序,可以看到点击确认按钮时,就会在控制台中输出选中的内容
![[Pasted image 20250420091809.png]]

Tool Button

QToolButton 的⼤部分功能,和 QPushButton 是⼀致的.但是 QToolButton 主要应⽤在⼯具栏,菜单等场景

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

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

相关文章

CFIS-YOLO:面向边缘设备的木材缺陷检测轻量级网络解析

论文地址:https://arxiv.org/pdf/2504.11305 目录 一、论文核心贡献 二、创新点详解 2.1 CARAFE动态上采样 工作原理 优势对比 2.2 C2f_FNB轻量模块 计算效率 2.3 Inner-SIoU损失函数 三、实验验证 3.1 消融实验 3.2 对比实验 四、应用部署 4.1 边缘设备部署流程…

BUUCTF PWN刷题笔记(1-9)

才知道&#xff0c;由于栈对齐&#xff0c;直接动调看栈估计会错&#xff0c;用cyclic看 1.test_your_nc NC连接一下&#xff0c;这个网站似乎直接访问是不中的&#xff0c;怀疑是没开启web的端口。NC链接输入cat flag就OK了&#xff0c;应该只是让我这样的小菜鸟培养自信用的…

C#处理网络传输中不完整的数据流

1、背景 在读取byte数组的场景&#xff08;例如&#xff1a;读取文件、网络传输数据&#xff09;中&#xff0c;特别是网络传输的场景中&#xff0c;非常有可能接收了不完整的byte数组&#xff0c;在将byte数组转换时&#xff0c;因字符的缺失/增多&#xff0c;转为乱码。如下…

PostgreSQL 用户资源管理

PostgreSQL 用户资源管理 PostgreSQL 提供了多种机制来管理和限制用户对数据库资源的使用&#xff0c;以下是全面的资源管理方法&#xff1a; 1 连接限制 1.1 限制最大连接数 -- 在 postgresql.conf 中设置 max_connections 100 -- 全局最大连接数-- 为特定用户设置连接限…

新书速览|OpenCV计算机视觉开发实践:基于Qt C++

《OpenCV计算机视觉开发实践:基于Qt C》 本书内容 OpenCV是计算机视觉领域的开发者必须掌握的技术。《OpenCV计算机视觉开发实践:基于Qt C》基于 OpenCV 4.10与Qt C进行编写&#xff0c;全面系统地介绍OpenCV的使用及实战案例&#xff0c;并配套提供全书示例源码、PPT课件与作…

【上位机——MFC】消息映射机制

消息映射机制 Window消息分类消息映射机制的使用代码示例 MFC框架利用消息映射机制把消息、命令与它们的处理函数映射起来。具体实现方法是在每个能接收和处理消息的类中&#xff0c;定义一个消息和消息函数指针对照表&#xff0c;即消息映射表。 在不重写WindowProc虚函数的大…

docker学习笔记2-最佳实践

一、在容器中启动mysql的最佳实践 &#xff08;一&#xff09;查找目录 1、mysql的配置文件路径 /etc/mysql/conf.d 2、mysql的数据目录 /var/lib/mysql 3、环境变量 4、端口 mysql的默认端口3306。 &#xff08;二&#xff09;启动命令 docker run -d -p 3306:3306 …

Vue3核心源码解析

/packages/complier-core 定位​​&#xff1a;​​编译时核心​​&#xff0c;处理 Vue 模板的编译逻辑。​​核心功能​​&#xff1a; ​​模板解析​​&#xff1a;将 .vue 文件的模板语法&#xff08;HTML-like&#xff09;解析为 ​​抽象语法树 (AST)​​。​​转换优化…

n8n 中文系列教程_05.如何在本机部署/安装 n8n(详细图文教程)

n8n 是一款强大的开源工作流自动化工具&#xff0c;可帮助你连接各类应用与服务&#xff0c;实现自动化任务。如果你想快速体验 n8n 的功能&#xff0c;本机部署是最简单的方式。本教程将手把手指导你在 Windows 或 MacOS 上通过 Docker 轻松安装和运行 n8n&#xff0c;无需服务…

【python】pyCharm常用快捷键使用-(2)

pyCharm常用快捷键使用 快速导入任意类 【CTRLALTSPACE】代码补全【CTRLSHIFTENTER】代码快速修正【ALTENTER】代码调试快捷键

Docker 镜像、容器和 Docker Compose的区别

前言&#xff1a;Docker 的镜像、容器和 Docker Compose 是容器化技术的核心组件&#xff0c;以下是对它们的详细解析及使用场景说明。 ​​1、Docker 镜像&#xff08;Image&#xff09;​​ ​​定义​​&#xff1a; 镜像是只读模板&#xff0c;包含运行应用程序所需的代码、…

算法——背包问题(分类)

背包问题&#xff08;Knapsack Problem&#xff09;是一类经典的组合优化问题&#xff0c;广泛应用于资源分配、投资决策、货物装载等领域。根据约束条件和问题设定的不同&#xff0c;背包问题主要分为以下几种类型&#xff1a; 1. 0-1 背包问题&#xff08;0-1 Knapsack Probl…

多路由器通过RIP动态路由实现通讯(单臂路由)

多路由器通过RIP动态路由实现通讯&#xff08;单臂路由&#xff09; R1(开启端口并配置IP) Router>en Router#conf t Router(config)#int g0/0 Router(config-if)#no shu Router(config-if)#no shutdown Router(config-if)#ip add 192.168.10.254 255.255.255.0 Router(c…

从底层设计原理分析并理解SQL 的执行顺序

​一、执行顺序的底层设计原理​​ ​​1. 数据源的确定与连接&#xff08;FROM → ON → JOIN&#xff09;​​ ​​FROM​​&#xff1a;数据库首先需要确定数据的物理来源&#xff0c;从磁盘加载表或子查询的原始数据。此时尚未应用任何筛选&#xff0c;仅读取元数据&#…

游戏引擎学习第237天:使用 OpenGL 显示图像

win32_game.cpp: 禁用 PFD_DOUBLEBUFFER 我们正在处理一个新的开发阶段&#xff0c;目标是在使用 OpenGL 渲染的同时能正常通过 OBS 进行直播。昨天我们已经尝试了一整天来解决这个问题&#xff0c;希望能找到一种方式让 OBS 能正确地捕捉到 OpenGL 的窗口画面。虽然我们不确定…

(二)mac中Grafana监控Linux上的MySQL(Mysqld_exporter)

框架&#xff1a;GrafanaPrometheusMysqld_exporter 一、监控查看端安装 Grafana安装-CSDN博客 普罗米修斯Prometheus监控安装&#xff08;mac&#xff09;-CSDN博客 1.启动Grafana服务 brew services start grafana 打开浏览器输入http://localhost:3000进入grafana登录…

GitHub 趋势日报 (2025年04月17日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1Anduin2017/HowToCook程序员在家做饭方法指南。Programmer’s guide about how to cook at home (Simplified Chinese onl…⭐ 224…

(一)mac中Grafana监控Linux上的CPU等(Node_exporter 安装使用)

框架&#xff1a;GrafanaPrometheusNode_exporter 机器状态监控(监控服务器CPU,硬盘&#xff0c;网络等状态) Node_exporter安装在被测服务器上&#xff0c;启动服务 各步骤的IP地址要换为被测服务器的IP地址Prometheus.yml的 targets值网页访问的ip部分grafana添加数据源的…

java IO/NIO/AIO

(✪▽✪)曼波~~~~&#xff01;让曼波用最可爱的赛马娘方式给你讲解吧&#xff01;(⁄ ⁄•⁄ω⁄•⁄ ⁄) &#x1f3a0;曼波思维导图大冲刺&#xff08;先看框架再看细节哦&#xff09;&#xff1a; &#x1f4da; 解释 Java 中 IO、NIO、AIO 的区别和适用场景&#xff1a; …

Silverlight发展历程(微软2021年已经停止支持Silverlight 5)

文章目录 Microsoft Silverlight 发展历程引言起源与背景&#xff08;2006-2007&#xff09;互联网技术格局与微软的挑战WPF/E 项目的启动 Silverlight 1.0 的诞生&#xff08;2007&#xff09;正式命名与首次发布初步的市场定位 Silverlight 2.0&#xff1a;真正的突破&#x…