实现支持多选的QComboBox

Qt提供的QComboBox只支持下拉列表内容的单选,但通过QComboBox提供的setModel、setView、setLineEdit三个方法,可以对QComboBox进行改造,使其实现下拉列表选项的多选。

QComboBox可以看作两个组件的组合:一个QLineEdit和一个QListWidget。QLineEidt是框中显示的内容,QListWidget是下拉列表。我们可以实现QComboBox的子类,在其中自定义QLineEdit和QListWidget,然后通过setModel、setView、setLineEdit三个方法替换QComboBox自带的文本框和下拉列表

class MultiComboBox : public QComboBox {Q_OBJECT
public:MultiComboBox(QWidget* parent = nullptr);void addItem(const QString& text, const QVariant& userData = QVariant());  // 重写父类addItem的方法
public slots:void stateChangedSlot(int);   // 下拉列表中的内容被选中时触发
private:QListWidget* list;QLineEdit* edit;
};MultiComboBox::MultiComboBox(QWidget* parent) : QComboBox(parent) {edit = new QLineEdit(this);list = new QListWidget(this);edit->setReadOnly(true);this->setModel(list->model());this->setView(list);this->setLineEdit(edit);
}

对于我们重新定义的QListWidget,其中包含的每一条内容应该是一个QCheckBox,因此重写QComboBox中的addItem方法,将传入的字符串包装为QCheckBox

void MultiComboBox::addItem(const QString& text, const QVariant& userData) {QListWidgetItem* item = new QListWidgetItem(list);QCheckBox* checkBox = new QCheckBox(this);checkBox->setText(text);list->addItem(item);list->setItemWidget(item, checkBox);connect(checkBox, SIGNAL(stateChanged(int)), this, SLOT(stateChangedSlot(int)));
}

同理,也可以重写addItems方法

当下拉列表中的内容被选中(或取消选中)时,QCheckBox触发stateChanged(int)信号,我们实现一个对应的槽函数,完成MultiComboBox需要实现的逻辑。比如最基本的:将当前选中的内容添加到显示框中

void MultiComboBox::stateChangedSlot(int) {QString str = "";for (int i = 0; i < list->count(); i++) {QCheckBox* cb = static_cast<QCheckBox*>(list->itemWidget(list->item(i)));if (cb->isChecked()) {str += cb->text();str += ";";  // 多个内容以分号隔开}}str = str.removeAt(str.size() - 1);if (str != "") {edit->setText(str);}else {edit->clear();}
}

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

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

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

相关文章

ctfshow web入门 php特性总结

1.web89 intval函数的利用&#xff0c;intval函数获取变量的整数值&#xff0c;失败时返回0&#xff0c;空的数组返回&#xff0c;非空数组返回1 num[]1 intval ( mixed $var [, int $base 10 ] ) : int Note: 如果 base 是 0&#xff0c;通过检测 var 的格式来决定使用的进…

【工具】Git的介绍与安装

目录 前言 1W&#xff1a;什么是Git&#xff1f; 2W&#xff1a;为什么使用Git&#xff1f; 3W&#xff1a;如何使用Git&#xff1f; Git的安装步骤 测试 3.1 桌面空白部分鼠标右击 3.2 选择 Open Git Bash here 3.3 输入 git -v 命令查看版本 Git区域分布 Git的工作…

软件无线电系列——软件无线电的发展历程及体系框架

本节目录 一、软件无线电的起始 二、软件无线电SDR论坛 三、SPEAKeasy计划 四、JTRS与SCA 五、软件无线电体系框架本节内容 一、软件无线电的起始 1992年5月&#xff0c;美国电信会议上&#xff0c;Joseph Mitola III博士提出来软件无线电(Software Radio,SR)的概念。理想化的…

C语言演示多线程编程条件下自旋锁和屏障的使用

主线故事: 有4个人玩游戏输了,惩罚: 1 分别使用4台不同的ATM机给我存钱 2 必须一块一块的存 3 存完还得在ATM上看一下我的余额 设计模式: 1 每个人使用一条单独的线程,再准备一个计时线程用来输出时间 2 存钱 涉及到 对共享资源的读写,是原子操作需要用锁保护 这里使用自…

windows下安装python virtualenv 虚拟环境

1、首先验证 python 是否安装成功 python -V Python 3.8.2如果出现版本号&#xff0c;表示安装成功了 2、通过 pip 安装 virtualenv pip install virtualenv3、创建虚拟环境 C:\Users\capitek-fengxl> mkvirtualenv blog # 激活虚拟环境 C:\Users\capitek-fengxl> …

SQL 优化实践:关于增强 OceanBase本地索引性能的案例

本文通过一个案例&#xff0c;帮用户了解在Oracle迁移Oceanbase时&#xff0c;应该如何选择全局索引和本地索引以带来更好的SQL性能。 作者&#xff1a;胡呈清&#xff0c;爱可生的DBA团队成员&#xff0c;擅长故障分析和性能优化。本文约 5000 字&#xff0c;预计阅读需要 15 …

GPT实战系列-LangChain实现简单链

GPT实战系列-LangChain实现简单链 LangChain GPT实战系列-LangChain如何构建基通义千问的多工具链 GPT实战系列-构建多参数的自定义LangChain工具 GPT实战系列-通过Basetool构建自定义LangChain工具方法 GPT实战系列-一种构建LangChain自定义Tool工具的简单方法 GPT实战系…

Qt/QML编程之路:fork、vfork、exec、clone的对比及使用(46)

前言: 系统调用system call是OS提供的服务提供接口。系统调用fork()、vfork()、exec()和clone()都用于创建和操作进程。Linux下Qt编程也会用到vfork进行多进程间通信。让我们看一下以下每个系统调用的概述和比较: fork()、vfork()和clone()的工作原理相似,但在处…

「jQuery系列」jQuery DOM操作/尺寸

文章目录 一、jQuery DOM操作元素选择元素创建元素插入元素删除元素复制属性操作文本和 HTML 内容操作CSS 类操作遍历 DOM 二、jQuery 尺寸案例一&#xff1a;获取元素尺寸案例二&#xff1a;设置元素尺寸案例三&#xff1a;使用内外尺寸方法 三、热门文章 一、jQuery DOM操作 …

【Vue】.sync 修饰符作用

文章目录 基本用法 基本用法 官方文档是这样介绍的&#xff1a;.sync 修饰符 简单来说就是实现父子组件数据之间的双向绑定&#xff0c;当子组件修改了一个 props 的值时&#xff0c;也会同步到父组件中&#xff0c;实现子组件同步修改父组件&#xff0c;与v-model类似。类别在…

计算机网络面经八股-什么是 SYN洪泛攻击?如何防范?

SYN洪泛攻击属于 DOS 攻击的一种&#xff0c;它利用 TCP 协议缺陷&#xff0c;通过发送大量的半连接请求&#xff0c;耗费 CPU 和内存资源。 原理&#xff1a; 在三次握手过程中&#xff0c;服务器发送 [SYN/ACK] 包&#xff08;第二个包&#xff09;之后、收到客户端的 [ACK…

狂飙Linux平台,PostgreSQL16部署大全

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

VUE学习第三篇----VUE实例

1、当一个 Vue 实例被创建时&#xff0c;它将 data 对象中的所有的 property 加入到 Vue 的响应式系统中。当这些 property 的值发生改变时&#xff0c;视图将会产生“响应”&#xff0c;即匹配更新为新的值。 html网页文件如下所示&#xff1a; <html> <head> &…

CSS note

文章目录 CSS docCSS 盒子模型微信小程序 WXSSrpx: responsive pixel. 规定屏幕宽度为 750 rpx样式导入引用外部样式 内联样式选择器CSS 语法列举排版 CSS doc https://www.w3schools.com/cssref/pr_class_position.php https://www.w3schools.com/css/tryit.asp?filenametry…

JavaSE——面向对象高级一(3/4)-面向对象三大特征之二:继承(初步认识继承、了解继承的好处)

目录 认识继承 继承的好处 认识继承 什么是继承&#xff1f; Java中提供了一个关键字extends&#xff0c;用这个关键字&#xff0c;可以让一个类和另一个类建立起父子关系。 例如&#xff1a; public class B extends A{} 此时A类就称为父类&#xff08;基类或超类&…

MySQL Connector连接失败之SSL connection error: protocol version mismatch

调用 mysql_real_connect&#xff08;&#xff09; 连接失败&#xff0c;报错为ERROR 2026 (HY000): SSL connection error: protocol version mismatch 调用mysql_error&#xff08;&#xff09;查看失败原因&#xff0c;结果为 SSL connection error: protocol version …

人口性别年龄分布数据、不同年龄结构、性别结构人口分布数据、乡镇街道人口分布数据

人口分布是指人口在一定时间内的空间存在形式、分布状况&#xff0c;包括各类地区总人口的分布&#xff0c;以及某些特定人口&#xff08;如城市人口、、特定的人口过程和构成&#xff08;如迁移、性别等&#xff09;的分布等。 人口分布的最大特征是不平衡性。就全世界而言&am…

mysql 替换空值

函数 IFNULL() 用于判断一个表达式时否为NULL,如果为 NULL 则返回指定的代替值&#xff0c;否则返回原表达式的值。 函数&#xff1a; IFNULL(expression,alternavicate_value) expression 要判断的表达式alternavicate_value 当表达式为 NULL时要返回的代替值

Kafka整理-Consumer(消费者)

在Apache Kafka中,消费者(Consumer)是负责从Kafka的主题(Topics)读取数据的客户端应用程序。Kafka消费者的主要特点和工作原理如下: 主要特点 1、订阅主题: 消费者可以订阅一个或多个Kafka主题,并从中读取数据。2、消费者群组(Consumer Groups): 消费者可以组成消费…

Edu12 Beautiful Subarrays --- 题解

Beautiful Subarrays&#xff1a; 题目大意: 思路解析&#xff1a; 要找到一个区间并且区间的l--r里面所有的元素异或值大于等于k&#xff0c;称这样的数组是优美子数组&#xff0c;问优美子数组有多少个。 [L,R] 的数组异或和等价于 (a1,a2,a3,....aL-1) ^ (a1,a2,a3,a4,..…