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.mzph.cn/news/881940.shtml

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

相关文章

Gin框架操作指南01:开山篇

Gin是目前最流行,性能最好的的GoWeb框架,几乎成为了学习GoWeb必备的知识。本人最近也在学Gin,在b站搜了很多教程,发现有的教程不够详细,有的教程工具包安装有问题,而官方文档的很多示例代码又不全&#xff…

抖音解压视频素材宝库

在快节奏的生活中,解压视频成为抖音上的热门内容类型,想要制作出精彩的解压视频,优质素材必不可少。今天,为大家推荐几个超棒的抖音解压视频素材网站,让你的创作之路轻松无忧! 蛙学网 作为国内知名的短视频…

深度解析计数排序:原理、特性与应用

目录 💯引言 💯计数排序的原理 ⭐核心概念 ⭐工作流程 1.确定计数范围 2.统计元素出现次数 3.计算累计计数 4.放置元素到正确位置 💯计数排序的实现 ⭐代码示例(以 C 为例) ⭐时间复杂度分析 ⭐稳定性分析…

【AI学习】Mamba学习(七):HiPPO通用框架介绍

HiPPO这篇论文《HiPPO: Recurrent Memory with Optimal Polynomial Projections》,提出了一个通用框架。 我们再重新看一下论文的摘要: 从连续数据中学习的一个核心问题是,随着更多数据的处理,以增量方式表示累积历史。我们介绍了…

「规模焦虑」如影随形,库迪咖啡想靠便捷店突围能行吗?

作者 | 辰纹 来源 | 洞见新研社 “我有一个广东的小兄弟,做了9年的奶茶,后来因为觉得咖啡是一个上升期的赛道,所以毅然决然拿了45万加盟了库迪咖啡,结果全亏损完了,相当于只买了一个配方。” 抖音博主茶饮圈大山哥分…

Vite创建Vue3项目以及Vue3相关基础知识

1.创建Vue3项目 1.运行创建项目命令 # 使用 npm npm create vitelatest2、填写项目名称 3、选择前端框架 4、选择语法类型 5、按提示运行代码 不出意外的话,运行之后应该会出现 下边这个页面 6.延伸学习:对比webpack和vite(这个是面试必考…

【微服务】springboot远程docker进行debug调试使用详解

目录 一、前言 二、线上问题常用解决方案 2.1 微服务线上运行中常见的问题 2.2 微服务线上问题解决方案 2.3 远程debug概述 2.3.1 远程debug原理 2.3.2 远程debug优势 三、实验环境准备 3.1 搭建springboot工程 3.1.1 工程结构 3.1.2 引入基础依赖 3.1.3 添加配置文…

400行程序写一个实时操作系统(九):替换FreeRTOS的内存管理算法

前言 通过前面几章,笔者带领大家完成了内存管理算法的编写。 我们完成的内存管理算法,被称为小内存管理算法。我们也可以将它作为一个库,在后续的嵌入式开发中,使用我们自己编写的malloc,不仅效率会更高,…

机器学习笔记-2

文章目录 一、Linear model二、How to represent this function三、Function with unknown parameter四、ReLU总结、A fancy name 一、Linear model 线性模型过于简单,有很大限制,我们需要更多复杂模式 蓝色是线性模型,线性模型无法去表示…

如何匿名浏览网站,保护在线隐私?

在现如今的网络世界,在线隐私已不复存在。你总是被跟踪,即使你使用隐身模式也无济于事。隐身模式会阻止浏览器保存你的浏览历史记录。但它并不能阻止你的互联网服务提供商 (ISP)、雇主、学校、图书馆或你访问的网站看到你在网上做什么。 更有不法分子在未…

Lumerical学习——资源管理和运行模拟

一、资源管理(Resource Manager) 在模拟计算前必须对计算资源进行配置。采用资源管理器可以完成这项任务。单击主工具条的“资源(Resources)”按钮(见上图)就可以打开资源管理器。通常每个计算机只需设置一…

大型生物制药企业如何实现安全又高效地跨网域数据传输?

大型生物制药企业由于组织结构庞大、业务覆盖研发、生产及销售,因此内部会再细分为多个管理单位,包括研发部门、生产部门、质量控制部门、供应链管理部门及营销部和日常业务支撑部门等。在物理区域划分上,大型生物制药企业会设立实验室、研发…

摇人摇人, JD内推岗位(社招+校招)

摇人摇人, 有找工作的家人们看过来啊~ 虚位以待, 快到碗里来 算法开发工程师岗 京东云 北京|T7, 5-10年 岗位职责: 参与基于RAG知识库平台和ChatBI产品打造和商业化落地,进行相关技术:包括OCR、文档拆分、意图理解、多轮对话、NL2SQL、Embed…

mysql用户管理(user表列信息介绍,本质,管理操作),数据库的权限管理(权限列表,权限操作)

目录 用户管理 介绍 user表 介绍 列信息 Host User *_priv authentication_string 用户管理的本质 操作 创建用户 删除用户 修改用户信息 修改密码 自己修改 root用户修改指定用户的密码 数据库的权限 权限列表 给用户授权 查看权限 回收权限 刷新权限 …

Linux性能调优,还可以从这些方面入手

linux是目前最常用的操作系统,下面是一些常见的 Linux 系统调优技巧,在进行系统调优时,需要根据具体的系统负载和应用需求进行调整,并进行充分的测试和监控,以确保系统的稳定性和性能。同时,调优过程中要谨…

万界星空科技:智能称重打标系统

万界星空科技的称重系统是其为制造业,特别是线缆、漆包线、食品等行业提供的重要解决方案之一。以下是对该系统的详细介绍: 一、系统概述 万界星空科技称重系统是集成在其MES(制造执行系统)中的一个功能模块,专门用于…

基于springboot实习管理系统

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的,前后端分离。 开发语言:Java数据库:MySQL技术:…

React Agent 自定义实现

目录 背景 langchin 中的 agent langchin 中 agent 的问题 langchain 的 agent 案例 自定义 React Agent 大模型 工具定义 问题设定 问题改写,挖掘潜在意图 React Prompt 下一步规划 问题总结 代码 背景 之前使用过 langchian 中的 agent 去实现过一些…

2020年计算机网络408真题解析

第一题: 解析:OSI参考模型网络协议的三要素 网络协议的三要素:语法 ,语义,同步(时序) 语法:定义收发双方所交换信息的格式 语法:定义收发双方所要完成的操作 网页的加载 …

深入理解队列(Queue)的实现(纯小白进)

目录: 前言一、 什么是队列?1.1、 队列的特性1.2、 队列的图解 二、 队列的详细实现2.1、 队列不同的实现方式2.2、 队列结构体2.3、 队列的初始化2.4、 入队列2.5、 出队列2.6、 获取对头元素2.7、 获取队尾元素2.8、 队列的判空2.9、 队列有效的元素个数2.10、 队…