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/。 主从配…

uniapp h5实现Excel、Word、PDF文件在线预览,而不是跳转下载,也不需要下载

实现方案 word&#xff0c;微软 Office Web Viewer const url https://view.officeapps.live.com/op/view.aspx?src${encodeURIComponent(https://501351981.github.io/vue-office/examples/dist/static/test-files/test.docx)} window.open(url) //新建窗口打开链接预览 /…

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;而且可以开发大型的…

Qt6,使用 UI 界面完成命令执行自动化的设计

一、需要完成的功能 在子对话框&#xff08;CmdChildQt&#xff09;中&#xff0c;点击 “执行” 按钮&#xff0c;将多个命令行指令&#xff0c;依次输入到父对话框&#xff08;CmdQt&#xff09;的编辑框中并且执行&#xff0c;要求如下&#xff1a; 在前一个命令执行完成后&…

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()…

Android Studio(Json)

创建json文件 /main >> 右键new >> Folder >> Assets Folder json对象和数组 json对象&#xff1a;{key1:value1,key2:value2,...} json数组&#xff1a;[{key1:value1,...},{key11:value11,...}] 读取解析 // 两种方式&#xff1a;org.json&#xff1a;And…

【动手学深度学习】课程笔记 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.子…

Java8.0 lambda表达式练习

1、HJ34 图片整理 图片整理_牛客题霸_牛客网 描述 Lily上课时使用字母数字图片教小朋友们学习英语单词&#xff0c;每次都需要把这些图片按照大小&#xff08;ASCII码值从小到大&#xff09;排列收好。请大家给Lily帮忙&#xff0c;通过代码解决。 Lily使用的图片使用字符&…

threejs CSS3DRenderer添加标签并设置朝向摄像机

一.由于CSS3DRenderer 是附加组件&#xff0c;必须显式导入 import { CSS3DRenderer, CSS3DObject } from three/examples/jsm/renderers/CSS3DRenderer.js;二.CSS3DRenderer特点 CSS3D不面向摄像机&#xff0c;会跟随场景缩放&#xff0c;不被模型遮挡&#xff0c;通过DOM事…

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

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

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

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

如何用AI帮你下载安卓源码

以Android 11源码下载流程图如下所示&#xff1a; 1. 安装Git和Repo工具 2. 创建一个工作目录 3. 初始化仓库并下载源码 4. 切换到指定的分支 5. 编译源码 具体步骤如下&#xff1a; 安装Git和Repo工具&#xff1a;在Linux或Mac上&#xff0c;可以通过终端运行以下命令安装Gi…

clickhouse通过java jdbc实现批量操作

1.1、在maven中引入clickhouse jar包 <dependency><groupId>com.clickhouse</groupId><artifactId>clickhouse-jdbc</artifactId><version>0.5.0</version></dependency><dependency><groupId>com.clickhouse<…