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

2023-11-09 06:28

本文主要是介绍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);
}

总结

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

这篇关于Qt实现自定义多选下拉列表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/374433

相关文章

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur