QT--单选按钮(QRadioButton)和复选按钮(QCheckBox)

在Qt中,单选按钮(QRadioButton)和复选按钮(QCheckBox)是两种常用的用户界面控件,它们的主要区别在于选择行为和用途:

QRadioButton(单选按钮)

  1. 选择行为:单选按钮用于在一组选项中选择一个选项。组内的单选按钮是互斥的,这意味着在同一组内只有一个按钮可以被选中。
  2. 用途:通常用于需要用户在多个选项中选择一个的时候,例如选择性别、选择支付方式等。
  3. 默认行为:单选按钮一般是成组使用,通过将它们放置在同一个父容器(如QGroupBoxQButtonGroup)中实现互斥选择。
  4. 外观和操作:单选按钮通常是一个圆形的控件,点击后内部会填充一个小圆点来表示选中状态。

示例代码(单选按钮):

QGroupBox *groupBox = new QGroupBox("Select an option"); 
QRadioButton *radio1 = new QRadioButton("Option 1"); 
QRadioButton *radio2 = new QRadioButton("Option 2"); 
QRadioButton *radio3 = new QRadioButton("Option 3"); 
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(radio1); 
vbox->addWidget(radio2); 
vbox->addWidget(radio3); 
groupBox->setLayout(vbox); // 将radio1设置为默认选中 radio1->setChecked(true);

QCheckBox(复选按钮)

  1. 选择行为:复选按钮用于在多个选项中进行独立的选择。每个复选按钮都是独立的,可以单独选中或取消选中。
  2. 用途:通常用于需要用户选择多个选项或者启用/禁用某些设置的时候,例如选择兴趣爱好、启用功能选项等。
  3. 默认行为:复选按钮是独立的,选中一个复选按钮不会影响其他复选按钮的状态。
  4. 外观和操作:复选按钮通常是一个方形的控件,点击后内部会显示一个勾来表示选中状态。

示例代码(复选按钮):

QCheckBox *checkBox1 = new QCheckBox("Option A");
QCheckBox *checkBox2 = new QCheckBox("Option B");
QCheckBox *checkBox3 = new QCheckBox("Option C");// 将checkBox1设置为默认选中
checkBox1->setChecked(true);// 添加到布局中
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(checkBox1);
vbox->addWidget(checkBox2);
vbox->addWidget(checkBox3);

总结

  • QRadioButton(单选按钮)

    • 用于在一组选项中选择一个。
    • 组内的按钮是互斥的。
    • 适用于需要用户在多个选项中选择一个的场合。
  • QCheckBox(复选按钮)

    • 用于在多个选项中进行独立选择。
    • 每个按钮都是独立的,选中一个不会影响其他按钮的状态。
    • 适用于需要用户选择多个选项或启用/禁用某些设置的场合。

单选按钮 QRadioButton

Qt 中的单选按钮类是 QRadioButton

它是一个可以切换选中(checked)或未选中(unchecked)状态的单选按钮

单选按钮常用在 “多选一” 的场景,也就是说,在一组单选按钮中,一次只能选中一个单选按钮

比如性别中的 “男女” 二选一,学历中的 “博士/硕士/本科/其他” 四选一,等等。

选中状态

// 获取和设置单选按钮的选中状态
bool isChecked() const
void setChecked(bool)

可见,切换单选按钮的选中状态,有两种方式:

  • 通过鼠标点击实现
  • 在代码中使用 setChecked(bool) 来实现

自动排他

我们前面说过,单选按钮实现的是 “多选一”,因此单选按钮的该属性默认是使能的

// 获取和设置自动排他
bool autoExclusive() const
void setAutoExclusive(bool)

而对于多选按钮,也叫复选按钮-QCheckBox,通常的场景是用户选择一组按钮中的多个,因此该属性默认是禁能的。

综合以上,“多选一” 要满足以下两个条件:

把同一组的单选按钮,放在同一个布局中。不同的组的单选按钮,放在不同的布局中

单选按钮的 autoExclusive 属性设置为 true,单选按钮的该属性默认是使能的。可在右侧的属性按钮中看到,如下:

信号槽

按钮在按下和抬起的过程中,会发射多个信号。

// 单选按钮 QRadioButton 被点击时,会发出该信号
void clicked();// 当单选按钮的选中状态发生改变时,会发射该信号
// 所谓状态改变,是指选中变为非选中,和非选中变为选中
void toggled(bool checked)

案例

复选框

Qt 中的复选按钮类是 QCheckBox

它和单选按钮很相似,单选按钮常用在 “多选一” 的场景,而复选按钮常用在 "多选多"的场景

比如喜欢的水果选项中,可以在 “苹果/桃/梨/橘子/香蕉” 中选择多个。

这两个是其父类 QAbstractButton 中的属性和方法,因此 QPushButtonQRadioButtonQCheckBox 都具有该属性

三态

单选按钮,有选中(Checked)和非选中(UnChecked)这两种状态;

而复选按钮可以有三种状态:

Qt::Checked 选中
Qt::Unchecked 非选中
Qt::PartiallyChecked 半选中,比如当一组复选按钮中只选择了部分时,可以设置其父项为半选状态,如下

可以设置复选按钮,是否支持三态,如下:

// 用于获取和设置是否支持三态
bool isTristate() const
void setTristate(bool y = true)

如果不支持三态,使用方法单选按钮一样,只有选中(Checked)和非选中(unchecked)两种状态,没有半选中状态( PartiallyChecked )

此时可以使用如下获取复选按钮是否选中:

// 获取和设置复选按钮是否选中:checked/unchecked
bool isChecked() const
void setChecked(bool)

如果支持三态,除了选中(Checked)和非选中(unchecked)两种状态,还有半选中状态( PartiallyChecked )

此时可以使用如下获取复选按钮的状态:

// 设置和获取复选按钮的状态
Qt::CheckState checkState() const
void setCheckState(Qt::CheckState state)

 信号槽

// 单选按钮 QRadioButton 被点击时,会发出该信号
void clicked();// 当复选按钮的选中状态发生改变时,会发射该信号
// 所谓状态改变,是指在 Checked/UnChecked/PartiallyChecked 之间状态改变
void stateChanged(int state)

案例

代码

#include "SelectButton.h"SelectButton::SelectButton(QWidget *parent): QMainWindow(parent), ui(new Ui::SelectButtonClass())
{QRadioButton/// 初始化ui->setupUi(this);ui->rbMan->setChecked(true);ui->rbDoctor->setChecked(true);ui->rbMan1->setChecked(true);ui->rbDoctor1->setChecked(true);// 使用QHBoxLayoutconnect(ui->rbMan, &QRadioButton::clicked, this, &SelectButton::on_QRadioButton_clicked);connect(ui->rbWoman, &QRadioButton::clicked, this, &SelectButton::on_QRadioButton_clicked);connect(ui->rbDoctor, &QRadioButton::clicked, this, &SelectButton::on_QRadioButton_clicked);connect(ui->rbMaster, &QRadioButton::clicked, this, &SelectButton::on_QRadioButton_clicked);connect(ui->rbBachelor, &QRadioButton::clicked, this, &SelectButton::on_QRadioButton_clicked);connect(ui->rbOther, &QRadioButton::clicked, this, &SelectButton::on_QRadioButton_clicked);on_QRadioButton_clicked();// 使用QGroupBoxconnect(ui->pbtOut, &QPushButton::clicked, this, [this]() {QString s;if (ui->rbMan1->isChecked())s = ui->rbMan1->text();else if (ui->rbWoman1->isChecked())s = ui->rbWoman1->text();if (ui->rbDoctor1->isChecked())s += ui->rbDoctor1->text();else if (ui->rbMaster1->isChecked())s += ui->rbMaster1->text();else if (ui->rbBachelor1->isChecked())s += ui->rbBachelor1->text();elses += ui->rbOther1->text();ui->lineEditOut->setText(s);});
QCheckBox///// 全选和全取消connect(ui->cbAll, &QCheckBox::stateChanged, this, [this]() {// 这里需要将“全选”按钮的三态设置为false// 也就是在鼠标点击时,只允许在checked和unchecked之间切换,不允许出现半选状态   Qt::CheckState state = ui->cbAll->checkState();if (state == Qt::Checked){ui->cbApple->setChecked(true);ui->cbBanana->setChecked(true);ui->cbOrange->setChecked(true);ui->cbPear->setChecked(true);ui->cbWatermelon->setChecked(true);}else if (state == Qt::Unchecked){ui->cbApple->setChecked(false);ui->cbBanana->setChecked(false);ui->cbOrange->setChecked(false);ui->cbPear->setChecked(false);ui->cbWatermelon->setChecked(false);}else{}});//局部选择connect(ui->cbApple, &QCheckBox::stateChanged, this, &SelectButton::onQCheckBoxChicked);connect(ui->cbBanana, &QCheckBox::stateChanged, this, &SelectButton::onQCheckBoxChicked);connect(ui->cbOrange, &QCheckBox::stateChanged, this, &SelectButton::onQCheckBoxChicked);connect(ui->cbPear, &QCheckBox::stateChanged, this, &SelectButton::onQCheckBoxChicked);connect(ui->cbWatermelon, &QCheckBox::stateChanged, this, &SelectButton::onQCheckBoxChicked);
}SelectButton::~SelectButton()
{delete ui;
}void SelectButton::on_QRadioButton_clicked()
{QString s;if (ui->rbMan->isChecked())s = ui->rbMan->text();else if(ui->rbWoman->isChecked())s = ui->rbWoman->text();if (ui->rbDoctor->isChecked())s += ui->rbDoctor->text();else if (ui->rbMaster->isChecked())s += ui->rbMaster->text();else if (ui->rbBachelor->isChecked())s += ui->rbBachelor->text();elses += ui->rbOther->text();ui->out->setText(s);
}void SelectButton::onQCheckBoxChicked()
{//ui->cbAll->setTristate(true);QString s;bool appleChecked = ui->cbApple->isChecked();bool bananaChecked = ui->cbBanana->isChecked();bool orangeChecked =  ui->cbOrange->isChecked();bool pearChecked = ui->cbPear->isChecked();bool watermelonChecked = ui->cbWatermelon->isChecked();if (appleChecked && bananaChecked && orangeChecked && pearChecked && watermelonChecked)ui->cbAll->setCheckState(Qt::Checked);else if(!(appleChecked|| bananaChecked|| orangeChecked|| pearChecked|| watermelonChecked))ui->cbAll->setCheckState(Qt::Unchecked);elseui->cbAll->setCheckState(Qt::PartiallyChecked);if (appleChecked)s += ui->cbApple->text()+" ";if (bananaChecked)s += ui->cbBanana->text() + " ";if (orangeChecked)s += ui->cbOrange->text() + " ";if (pearChecked)s += ui->cbPear->text() + " ";if (watermelonChecked)s += ui->cbWatermelon->text() + " ";ui->lineEditOut_2->setText(s);
}

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

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

相关文章

jvm虚拟机调优实战

使用命令 jps查看进程使用jstat gc -1 5000查看内存占用和回收情况 正式测试 是否跑job区别。大量的job,部分用户点击的热数据 ,不同时刻在跑 600-700对比 200 多了400-500m,代码原数据(不占用堆区)占了300m,所以 堆空间老年代(90…

VsCode环境配置C++环境

目录 第一步下载应用 第二步应用文字汉化 第三步安装编译器MinGW 第四步 环境变量的配置 第五步 打开VsCode 第六步 配置环境设施 几个其他的好用的插件 会了吧 MarsCode: AI Coding Assistant 第一步下载应用 VSCode下载官方指定网址: Visual Studio Cod…

使用豆包MarsCode 来处理 Excel 的数据吧!

作者可乐三分糖 背景 Excel 是大部分没有信息化的公司通用的数据处理手段。但并不是所有的人对 excel 都是非常熟悉的。这些同学主要会遇到三类问题: Excel 的一些操作问题,如公式怎么写跨表处理太复杂,即使是写公式也很繁琐。一些数据批处…

关于k8s集群高可用性的探究

1. k8s的高可用的核心是什么? 说到核心、本质 意味着要从物理层来考虑技术 k8s是一个容器编排管理工具,k8s受欢迎的时机 是docker容器受欢迎时,因为太多的docker容器,管理起来是一个大工程 那么刚好k8s是google自己用了十来年…

如何设计开发RTSP直播播放器?

技术背景 我们在对接RTSP直播播放器相关技术诉求的时候,好多开发者,除了选用成熟的RTSP播放器外,还想知其然知其所以然,对RTSP播放器的整体开发有个基础的了解,方便方案之作和技术延伸。本文抛砖引玉,做个…

【环境搭建】更换电脑后的开发环境怎么重建

目录 🍸前言 🍻一、系统配置检查 🍺二、开发环境搭建 🍹三、章末 🍸前言 小伙伴们大家好,这次文章跟技术没有关联,因为最近刚更换了装备,开发环境啥的残缺不全,也不能…

Java基础:面向对象编程5

1 Java内部类 1.1 概念 在 Java 中,内部类是指定义在另一个类内部或方法内部的类。内部类可以分为以下几种类型: 成员内部类局部内部类匿名内部类静态内部类 1.2 成员内部类 定义:成员内部类是最常见的内部类,它定义在外部类…

深度解析 Redis 存储结构及其高效性背后的机制

目录 1. Redis 存储结构存储结构存储转换 2. 字典实现数据结构冲突处理负载因子 3. 扩容扩容步骤影响与优化 4. 缩容缩容步骤优化策略 5. 渐进式 Rehash**渐进式 Rehash 的工作原理**Rehash 规则优势 6. SCAN 命令SCAN 的实现原理遍历顺序避免重复和遗漏使用场景 7. 过期&#…

电子商务网站维护技巧:保持WordPress、主题和插件的更新

在这个快节奏的数字时代,维护一个电子商务网站的首要任务之一是保持WordPress、主题和插件的最新状态。过时的软件不仅可能导致功能故障,还可能带来安全风险。本文将深入探讨如何有效地更新和维护您的WordPress网站,以确保其安全性和性能。 …

工业物联网关-ModbusTCP

Modbus-TCP模式把网关视作Modbus从端设备,主端设备可以通过Modbus-TCP协议访问网关上所有终端设备。用户可以自定义多条通道,每条通道可以配置为TCP Server或者TCP Slave。注意,该模式需要指定采集通道,采集通道可以是串口和网口通…

简述微服务高可用之Sentinel、Seate

简述微服务高可用之Sentinel、Seate使用 下文主要讲述使用sentinel,如何降级限流熔断及如何使用seata管理分布式事务 sentinel服务端安装与使用 1、下载 进入https://github.com/alibaba/Sentinel/releases 根据你的需求进行下载对应版本 我这里是JDK17 下载的1.8.8版本&am…

【数据结构与算法】链表(上)

记录自己所学&#xff0c;无详细讲解 无头单链表实现 1.项目目录文件 2.头文件 Slist.h #include <stdio.h> #include <assert.h> #include <stdlib.h> struct Slist {int data;struct Slist* next; }; typedef struct Slist Slist; //初始化 void SlistI…

【C#】WPF MVVM 简单示例代码

1. 目录结构 2. 代码 2.1 DelegateCommand.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input;namespace MVVSSample.Commands {class DelegateCommand : ICommand{publ…

信息安全工程师(52)网络安全审计系统组成与类型

前言 网络安全审计系统是一种用于监控、分析和报告网络环境中安全事件的系统。其组成与类型均体现了对网络安全性的全面考虑和细致划分。 一、网络安全审计系统的组成 网络安全审计系统一般由以下几个关键部分组成&#xff1a; 审计数据采集系统&#xff1a;负责采集被审计系统…

shell案例之一键部署kafka

Shell案例之一键部署kafka 一、案例问题 &#xff08;1&#xff09;Kafka是用Java编写的&#xff0c;需要配置jdk环境变量 &#xff08;2&#xff09;Kafka配置文件数目多 &#xff08;3&#xff09;命令安装繁琐 二、案例分析&#xff1a; &#xff08;1&#xff09;检查…

elementUI,设置日期,只能选择过去的和今天的日期

在 el-date-picker 组件中加&#xff1a;:picker-options"pickerOptions" <el-form-item label"票据生成日期&#xff1a;"> <el-date-picker v-model"date1" type"daterange" range-separator"至" value-format&…

chatgpt搭建大模型技术知识解读与总结

搭建大型语言模型&#xff08;如ChatGPT&#xff09;的技术知识涉及多个领域&#xff0c;包括机器学习、自然语言处理&#xff08;NLP&#xff09;、深度学习、数据处理等。下面是一些关键概念和步骤的总结&#xff1a; ### 1. **基础知识** #### a. **自然语言处理 (NLP)** …

基于Qt/QChart实现折线图和散点图的绘制示例程序解析

1. 项目简介 本文讲解的是一个基于Qt框架的QChart模块实现的折线图与散点图结合的绘制程序。程序通过自定义类LineChartWithGradient实现折线图、散点图以及带有渐变填充的区域图&#xff0c;最终形成一个美观的数据可视化效果。 2. 类构造函数 LineChartWithGradient::LineC…

天锐绿盾VS Ping32数据安全新选择,用户体验分享

随着网络威胁日益严重&#xff0c;如何保护个人和企业的网络安全成为了一个迫在眉睫的问题。天锐绿盾和Ping32作为市场上两款备受欢迎的网络安全软件&#xff0c;各自拥有独特的特点和功能。本文将对这两款软件进行深入的使用体验分享&#xff0c;帮助用户做出最佳选择。 防护性…

Docker 拉取镜像时配置可用镜像源(包含国内可用镜像源)

文章目录 写在前面一、Docker 官方源二、更换Docker 国内可用镜像源 &#xff08;推荐使用&#xff09;参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04&#xff0c;docker-27.3.1 一、Docker 官方源 打开 /etc/docker/daemon.json文件&#xff1a; sudo gedit …