Qt实现自定义多选下拉列表

目录

      • 前言
      • 1、 功能描述
      • 2、代码实现
      • 总结

前言

本文记录了一种通过继承 QComboBox 实现下拉列表多选功能的方法。效果如下图所示:
在这里插入图片描述

1、 功能描述

普通的下拉列表只支持选择一个选项,在软件开发过程中,经常会遇到下拉列表支持选择多个选项的需求,下面的代码实现了下拉列表多选功能,支持设置弹窗的高度,支持添加显示文本和用户数据,支持设置默认选中项目,支持获取选中数据。

2、代码实现

1、头文件

#ifndef LLCOMBOBOX_H
#define LLCOMBOBOX_H#include <QComboBox>class QListWidgetItem;
class LLComboBoxPrivate;
class LLComboBox : public QComboBox
{Q_OBJECT
public:explicit LLComboBox(QWidget* parent = NULL);/*** @brief addDataItem 添加数据* @param text* @param userData*/void addDataItem(const QString &text, const QVariant &userData = QVariant());/*** @brief setSelectedData 设置选中的数据* @param selectedData*/void setSelectedData(const QStringList &selectedData);/*** @brief setPopupViewHeight 设置下拉列表弹窗的高度,默认值100* @param height*/void setPopupViewHeight(int height);/*** @brief selectedDataText 获取选择的数据* @return*/QStringList selectedDataText();/*** @brief selectedUserData 获取选择数据对应的用户数据* @return*/QList<QVariant> selectedUserData();private slots:void slot_itemChanged(QListWidgetItem *item);
private:LLComboBoxPrivate *m_pd;
};#endif // LLCOMBOBOX_H

2、cpp文件

#include <QListWidget>
#include <QCheckBox>
#include <QList>
#include <QLineEdit>
#include <QDebug>#include "llcombobox.h"class LLComboBoxPrivate
{
public:QStringList selectedDataList;QListWidget *pListWidget;
};LLComboBox::LLComboBox(QWidget *parent): QComboBox(parent), m_pd(new LLComboBoxPrivate)
{m_pd->pListWidget = new QListWidget;m_pd->pListWidget->setFixedHeight(100);connect(m_pd->pListWidget, SIGNAL(itemChanged(QListWidgetItem *)), this, SLOT(slot_itemChanged(QListWidgetItem *)));setView(m_pd->pListWidget);//设置Editable为true,lineEdit() 函数才不返回空setEditable(true);
}void LLComboBox::addDataItem(const QString &text, const QVariant &userData)
{m_pd->pListWidget->blockSignals(true);QListWidgetItem *pItem = new QListWidgetItem(text, m_pd->pListWidget);pItem->setData(Qt::UserRole, userData);pItem->setCheckState(Qt::Unchecked);//设置QListWidgetItem 可交互且可以选中和取消选中pItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);m_pd->pListWidget->addItem(pItem);QComboBox::addItem(text);QComboBox::setCurrentText("");m_pd->pListWidget->blockSignals(false);
}void LLComboBox::setSelectedData(const QStringList &selectedData)
{m_pd->selectedDataList.clear();m_pd->selectedDataList += selectedData;QString text = "";for (int var = 0; var < m_pd->selectedDataList.size(); ++var){m_pd->pListWidget->blockSignals(true);QListWidgetItem *pItem = m_pd->pListWidget->item(var);pItem->setCheckState(Qt::Checked);m_pd->pListWidget->blockSignals(false);text.append(m_pd->selectedDataList[var]);if(var < m_pd->selectedDataList.size() - 1){text.append(",");}}lineEdit()->setText(text);
}QStringList LLComboBox::selectedDataText()
{return m_pd->selectedDataList;
}QList<QVariant> LLComboBox::selectedUserData()
{QList<QVariant> dataList;for (int var = 0; var < m_pd->selectedDataList.size(); ++var){QListWidgetItem *pItem = m_pd->pListWidget->item(var);if(pItem->checkState() == Qt::Checked){dataList.append(pItem->data(Qt::UserRole));}}return dataList;
}void LLComboBox::slot_itemChanged(QListWidgetItem *item)
{qDebug() << QString("text=") << item->text();if(m_pd->selectedDataList.contains(item->text())){m_pd->selectedDataList.removeOne(item->text());}else{m_pd->selectedDataList.append(item->text());}QString text = "";for (int var = 0; var < m_pd->selectedDataList.size(); ++var){text.append(m_pd->selectedDataList[var]);if(var < m_pd->selectedDataList.size() - 1){text.append(",");}}lineEdit()->setText(text);
}

总结

以上就是本文的所有内容了,欢迎留言讨论,源码下载地址 多选下拉列表下载地址

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

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

相关文章

Mybatis-Plus同时使用逻辑删除和唯一索引的问题及解决办法

1 问题背景 在开发中&#xff0c;我们经常会有逻辑删除和唯一索引同时使用的情况。但当使用mybatis plus时&#xff0c;如果同时使用逻辑删除和唯一索引&#xff0c;会报数据重复Duplicate entry的问题。 举例来说&#xff0c;有表user&#xff0c;建立唯一索引&#xff08;u…

centos 7部署Mysql8.0主从

Mysql官网中关于部署主从的网址 环境准备&#xff1a; 搭建虚拟机和安装Mysql之前的文章中已经涉及&#xff0c;在此不再赘述。 主从IPMysql账号密码主192.168.213.4root/Root1234!从192.168.213.5root/Root1234! 1、主数据库设置 配置my.cnf 一般存放于/etc/。 主从配…

idea使用git删除本地提交(未推送)

1、找到reset head 2、打开弹窗&#xff0c;在HEAD后面输入^ 结果为HEAD^ 注释&#xff1a; Reset Type 有三种&#xff1a; Mixed&#xff08;默认方式&#xff09;&#xff0c;保留本地源码&#xff0c;回退 commit 和 index 信息&#xff0c;最常用的方式Soft 回退到某个版本…

用于图像处理的高斯滤波器 (LoG) 拉普拉斯

一、说明 欢迎来到拉普拉斯和高斯滤波器的拉普拉斯的故事。LoG是先进行高斯处理&#xff0c;继而进行拉普拉斯算子的图像处理算法。用拉普拉斯具有过零功能&#xff0c;实现边缘岭脊提取。 二、LoG算法简述 在这篇博客中&#xff0c;让我们看看拉普拉斯滤波器和高斯滤波器的拉普…

STM32_project:led_beep

代码&#xff1a; 主要部分&#xff1a; #include "stm32f10x.h" // Device header #include "delay.h"// 给蜂鸣器IO口输出低电平&#xff0c;响&#xff0c;高&#xff0c;不向。 //int main (void) //{ // // 开启时钟 // RC…

Git 行结束符:LF will be replaced by CRLF the next time Git touches it问题解决指南

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

怎么学编程效率高,编程练习网站编程软件下载,中文编程开发语言工具下载

怎么学编程效率高&#xff0c;编程练习网站编程软件下载&#xff0c;中文编程开发语言工具下载 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的…

MySQL的默认引擎为什么是InnoDB

MySQL支持InnoDB、MyISAM、MEMORY、CSV等多个存储引擎&#xff0c;那为什么选InnoDB作为默认引擎呢&#xff1f; 主要原因有几点&#xff1a; 事务 事务主要用于保持数据一致性&#xff0c;是一组操作的集合&#xff0c;要么全部成功&#xff0c;要么全部失败。InnoDB引擎提供…

Pytorch 里面torch.no_grad 和model.eval(), model.train() 的作用

torch.no_grad: 影响模型的自微分器&#xff0c;使得其停止工作&#xff1b;这样的话&#xff0c;数据计算的数据就会变快&#xff0c;内存占用也会变小&#xff0c;因为没有了反向梯度计算&#xff0c;当然&#xff0c;我哦们也无法做反向传播。 model.eval() 和model.train()…

【动手学深度学习】课程笔记 05-07 线性代数、矩阵计算和自动求导

05 线性代数 1. 基础知识补充 向量相关 矩阵相关 简单来说&#xff0c;范数是用来衡量矩阵&#xff08;张量&#xff09;大小的值&#xff0c;范数的值有不同的规定。 2. 代码实现 仅记录一些我比较陌生的知识。 张量的克隆 A torch.arange(20, dtypetorch.float32).resh…

【C++】继承详解

本篇要分享的内容是关于继承的内容哼哼哼啊啊啊啊啊啊啊啊啊啊啊啊啊啊 以下为本篇目录 目录 1.简单了解继承 2.继承的简单定义 3.继承简单使用 4.继承方式 4.1基类的privat 4.2基类的protected 4.3不可见与private的区别 5.父子类对象赋值转换 6.继承的作用域 7.子…

Linux C语言进阶-D14指针函数

指针函数&#xff1a;指一个函数的返回值为地址量的函数 <数据类型>* <函数名称>&#xff08;<参数说明>&#xff09; { 语句序列; } 返回值&#xff1a;全部变量的地址、静态变量的地址、字符串常量的地址、堆上的地址 注意&#xff1a;不可返回局部变量…

项目管理之如何出道(上)

前言 终于有时间更新了&#xff0c;大家是不是等不及了&#xff1f;那么书接上文&#xff0c;言归正传。 各位盆友&#xff0c;时间之轮已划入夜晚&#xff0c;尝试静下心来&#xff0c;思考一番。 Q1&#xff1a;是否曾经期待自己做一名项目经理&#xff0c;干了几年的coder甚…

【NLP】特征提取: 广泛指南和 3 个操作教程 [Python、CNN、BERT]

什么是机器学习中的特征提取&#xff1f; 特征提取是数据分析和机器学习中的基本概念&#xff0c;是将原始数据转换为更适合分析或建模的格式过程中的关键步骤。特征&#xff0c;也称为变量或属性&#xff0c;是我们用来进行预测、对对象进行分类或从数据中获取见解的数据点的…

软件测试/测试开发丨接口测试学习笔记,TcpDump与WireShark

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27859 协议分析工具 网络监听&#xff1a;TcpDump WireShark 代理 Proxy 推荐工具&#xff1a;手工测试charles [全平台]、安全测试burpsuite [全平台 j…

chrome安装vue devtools

不能访问应用商店 如果可以访问应用商店可以往下看 插件源代码 选择shell-chrome&#xff0c;这是官方的插件源码 下载源代码打包 参考教程 点击扩展按钮->管理扩展程序->打开开发者模式->把crx文件拖拽进去即可 可以访问chrome应用商店 插件地址 官方文档地址 选…

VSCode修改主题为Eclipse 绿色护眼模式

前言 从参加开发以来&#xff0c;一直使用eclipse进行开发&#xff0c;基本官方出新版本&#xff0c;我都会更新。后来出来很多其他的IDE工具&#xff0c;我也尝试了&#xff0c;但他们的主题都把我劝退了&#xff0c;黑色主题是谁想出来&#xff1f;&#x1f602; 字体小的时…

二维码智慧门牌管理系统升级解决方案:轻松实现辖区范围门址统计

文章目录 前言一、系统功能与优势 前言 在这个数字化时代&#xff0c;传统的门牌管理系统已经无法满足现代管理的需求。为了满足辖区内门址的统计需求&#xff0c;我们引入了全新的二维码智慧门牌管理系统升级解决方案。这一升级将让您轻松实现辖区范围门址的统计&#xff0c;…

开源的全能维护 U 盘工具:Ventoy

开源的全能维护 U 盘工具&#xff1a;Ventoy 本篇文章聊聊迄今为止&#xff0c;我用着最舒服的一款开源 U 盘启动工具&#xff0c;Ventoy。 写在前面 好久不见&#xff0c;接下来计划写一个比较连续的内容&#xff0c;就先从最小的处着手吧。 经过长久的折腾&#xff0c;除…

pytest 的使用===谨记

发现用例的规则 a) 文件test_.py开头和_test.py结尾 b) Test开头的类中test开头的方法&#xff08;测试类不能带有__init__方法&#xff09; c) 模块中test开头的函数&#xff08;可以不在class中&#xff09; 注意点&#xff1a; pytest是以方法为单位发现用例的&#xff0c;你…