【Qt】QTableView添加下拉框过滤条件
实现通过带复选框的下拉框来为表格添加过滤条件
带复选框的下拉框

.h文件
#pragma once
#include <QCheckBox>
#include <QComboBox>
#include <QEvent>
#include <QLineEdit>
#include <QListWidget>class TableComboBox : public QComboBox
{Q_OBJECTpublic:TableComboBox(QWidget* parent = NULL);~TableComboBox();// 隐藏下拉框virtual void hidePopup();// 添加一条选项void addItem(const QString& _text, const QVariant& _variant = QVariant());// 添加多条选项void addItems(const QStringList& _text_list);// 返回当前选中选项QStringList currentText();// 返回当前选项条数int count() const;// 设置搜索框默认文字void SetSearchBarPlaceHolderText(const QString _text);// 设置文本框默认文字void SetPlaceHolderText(const QString& _text);// 下拉框状态恢复默认void ResetSelection();// 清空所有内容void clear();// 文本框内容清空void TextClear();// 设置选中文本--单void setCurrentText(const QString& _text);// 设置选中文本--多void setCurrentText(const QStringList& _text_list);// 设置搜索框是否禁用void SetSearchBarHidden(bool _flag);protected:// 事件过滤器virtual bool eventFilter(QObject* watched, QEvent* event);// 滚轮事件virtual void wheelEvent(QWheelEvent* event);// 按键事件virtual void keyPressEvent(QKeyEvent* event);private slots:// 文本框文本变化void stateChange(int _row);// 点击下拉框选项void itemClicked(int _index);signals:// 发送当前选中选项void selectionChange(const QString _data);private:// 下拉框QListWidget* pListWidget;// 文本框,搜索框QLineEdit *pLineEdit, *pSearchBarEdit;// 搜索框显示标志bool isHidden;// 下拉框显示标志bool isShow;
};
.cpp文件
#include "PowerTableComboBox.h"#include <QMessageBox>#define FREEPTR(p) \if (p != NULL) \{ \delete p; \p = NULL; \}TableComboBox::TableComboBox(QWidget* parent): QComboBox(parent), isHidden(true), isShow(false)
{pListWidget = new QListWidget();pLineEdit = new QLineEdit();pSearchBarEdit = new QLineEdit();QListWidgetItem* currentItem = new QListWidgetItem(pListWidget);pSearchBarEdit->setPlaceholderText("搜索...");pSearchBarEdit->setClearButtonEnabled(true);pListWidget->addItem(currentItem);pListWidget->setItemWidget(currentItem, pSearchBarEdit);pLineEdit->setReadOnly(true);pLineEdit->installEventFilter(this);pLineEdit->setStyleSheet("QLineEdit:disabled{background:rgb(233,233,233);}");this->setModel(pListWidget->model());this->setView(pListWidget);this->setLineEdit(pLineEdit);connect(this, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, &TableComboBox::itemClicked);
}TableComboBox::~TableComboBox()
{FREEPTR(pLineEdit);FREEPTR(pSearchBarEdit);
}void TableComboBox::hidePopup()
{isShow = false;int width = this->width();int height = this->height();int x = QCursor::pos().x() - mapToGlobal(geometry().topLeft()).x() + geometry().x();int y = QCursor::pos().y() - mapToGlobal(geometry().topLeft()).y() + geometry().y();if (x >= 0 && x <= width && y >= this->height() && y <= height + this->height()){}else{QComboBox::hidePopup();}
}void TableComboBox::addItem(const QString& _text, const QVariant& _variant)
{Q_UNUSED(_variant);QListWidgetItem* item = new QListWidgetItem(pListWidget);QCheckBox* checkbox = new QCheckBox(this);checkbox->setText(_text);pListWidget->setItemWidget(item, checkbox);pListWidget->addItem(item);connect(checkbox, &QCheckBox::stateChanged, this, &TableComboBox::stateChange);checkbox->setChecked(true);
}void TableComboBox::addItems(const QStringList& _text_list)
{for (const auto& text_one : _text_list){addItem(text_one);}
}QStringList TableComboBox::currentText()
{QStringList text_list;if (!pLineEdit->text().isEmpty()){// 以空格为分隔符分割字符串text_list = pLineEdit->text().split(' ');}return text_list;
}int TableComboBox::count() const
{int count = pListWidget->count() - 1;if (count < 0){count = 0;}return count;
}void TableComboBox::SetSearchBarPlaceHolderText(const QString _text)
{pSearchBarEdit->setPlaceholderText(_text);
}void TableComboBox::SetPlaceHolderText(const QString& _text)
{pLineEdit->setPlaceholderText(_text);
}void TableComboBox::ResetSelection()
{int count = pListWidget->count();for (int i = 1; i < count; i++){QWidget* widget = pListWidget->itemWidget(pListWidget->item(i));QCheckBox* check_box = static_cast<QCheckBox*>(widget);check_box->setChecked(false);}
}void TableComboBox::clear()
{pLineEdit->clear();pListWidget->clear();QListWidgetItem* currentItem = new QListWidgetItem(pListWidget);pSearchBarEdit->setPlaceholderText("搜索...");pSearchBarEdit->setClearButtonEnabled(true);pListWidget->addItem(currentItem);pListWidget->setItemWidget(currentItem, pSearchBarEdit);SetSearchBarHidden(isHidden);
}void TableComboBox::TextClear()
{pLineEdit->clear();ResetSelection();
}void TableComboBox::setCurrentText(const QString& _text)
{int count = pListWidget->count();for (int i = 1; i < count; i++){QWidget* widget = pListWidget->itemWidget(pListWidget->item(i));QCheckBox* check_box = static_cast<QCheckBox*>(widget);if (_text.compare(check_box->text()))check_box->setChecked(true);}
}void TableComboBox::setCurrentText(const QStringList& _text_list)
{int count = pListWidget->count();for (int i = 1; i < count; i++){QWidget* widget = pListWidget->itemWidget(pListWidget->item(i));QCheckBox* check_box = static_cast<QCheckBox*>(widget);if (_text_list.contains(check_box->text()))check_box->setChecked(true);}
}void TableComboBox::SetSearchBarHidden(bool _flag)
{isHidden = _flag;pListWidget->item(0)->setHidden(isHidden);
}bool TableComboBox::eventFilter(QObject* watched, QEvent* event)
{if (watched == pLineEdit && event->type() == QEvent::MouseButtonRelease && this->isEnabled()){showPopup();return true;}return false;
}void TableComboBox::wheelEvent(QWheelEvent* event)
{Q_UNUSED(event);
}void TableComboBox::keyPressEvent(QKeyEvent* event)
{QComboBox::keyPressEvent(event);
}void TableComboBox::stateChange(int _row)
{Q_UNUSED(_row);QString selected_data("");int count = pListWidget->count();for (int i = 1; i < count; i++){QWidget* widget = pListWidget->itemWidget(pListWidget->item(i));QCheckBox* check_box = static_cast<QCheckBox*>(widget);if (check_box->isChecked()){// 添加空格做为分割符selected_data.append(check_box->text()).append(" ");}}selected_data.chop(1);if (!selected_data.isEmpty()){pLineEdit->setText(selected_data);}else{pLineEdit->clear();}// 文字从最左边开始显示pLineEdit->setToolTip(selected_data);pLineEdit->setSelection(0, 0);pLineEdit->setCursorPosition(0);emit selectionChange(selected_data);
}void TableComboBox::itemClicked(int _index)
{if (_index != 0){QCheckBox* check_box = static_cast<QCheckBox*>(pListWidget->itemWidget(pListWidget->item(_index)));check_box->setChecked(!check_box->isChecked());}
}
表格过滤器代理类
class TableProxyModel : public QSortFilterProxyModel
{
public:TableProxyModel (QObject* parent = nullptr): QSortFilterProxyModel(parent){}protected:bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override{QModelIndex targetTypeIndex = sourceModel()->index(source_row, 0, source_parent);QModelIndex boomNameIndex = sourceModel()->index(source_row, 1, source_parent);QModelIndex destructionDegreeIndex = sourceModel()->index(source_row, 2, source_parent);QString typeText = sourceModel()->data(targetTypeIndex).toString();QString nameText = sourceModel()->data(boomNameIndex).toString();int levelText = sourceModel()->data(destructionDegreeIndex).toInt();if (!isFilter){return true;}bool matchType = false;bool matchName = false;bool levelText = false;for (QString type : sType){if (typeText == type){matchType = true;break;}}for (QString name : sName){if (nameText == name){matchName = true;break;}}for (int level: nLevelVec){if (levelText == level){matchLevel = true;break;}}if (matchLevel && matchName && matchType){return true;}return false;}public:QStringList sType;QStringList sName;QVector<int> nLevelVec;bool isFilter = false;
};
表格设置代理关联下拉框内容变更
添加代理
tableView = new QTableView;proxyModel = new TableProxyModel;// 设置过滤规则来执行过滤proxyModel->setFilterRole(Qt::DisplayRole);proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);proxyModel->setSourceModel(model);tableView->setModel(proxyModel);
下拉框关联表格代理
- 通过信号与槽关联
connect(typeBox, &TableComboBox::selectionChange, this, &ShowTableView::filterBtnClick);
- 获取下拉框内容传到代理类做过滤
void ShowTableView::filterBtnClick(QString)
{// 复位proxyModel->isFilter = true;proxyModel->sType.clear();proxyModel->sName.clear();proxyModel->nLevelVec.clear();// 获取筛选条件proxyModel->sType = typeBox->currentText();proxyModel->sName= boomNameBox->currentText();for (QString level: levelBox->currentText()){proxyModel->nLevelVec.push_back(level.toInt());}proxyModel->setFilterFixedString("");
}
- 取消过滤,复位
void ShowTableView::noFilterBtnClick()
{proxyModel->isFilter = false;proxyModel->setFilterFixedString("");
}
截图
- 过滤前

- 过滤后

相关文章:
【Qt】QTableView添加下拉框过滤条件
实现通过带复选框的下拉框来为表格添加过滤条件 带复选框的下拉框 .h文件 #pragma once #include <QCheckBox> #include <QComboBox> #include <QEvent> #include <QLineEdit> #include <QListWidget>class TableComboBox : public QComboBox …...
部署DNS主从服务器
一。DNS主从服务器作用: DNS作为重要的互联网基础设施服务,保证DNS域名解析服务的正常运转至关重要,只有这样才能提供稳定、快速日不间断的域名查询服务 DNS 域名解析服务中,从服务器可以从主服务器上获取指定的区域数据文件&…...
从可逆计算看低代码
2020年低代码(LowCode)这一buzzword频繁亮相于主流技术媒体,大背景下是微软/亚马逊/阿里/华为等巨头纷纷入场,推出自己的相应产品。一时之间,大大小小的技术山头,无论自己原先是搞OA/ERP/IOT/AI的ÿ…...
设计模式最佳实践代码总结 - 结构型设计模式篇 - 侨接设计模式最佳实践
目录 侨接设计模式最佳实践 侨接设计模式最佳实践 桥接模式是一种结构型设计模式,它将抽象部分与它的实现部分分离,使它们可以独立地变化。桥接模式是一种结构型设计模式,它将抽象部分与它的实现部分分离,使它们可以独立地变化。…...
【软件测试】python——Unittest
UnitTest 框架 笔记来自于黑马程序员python自动化测试教程,python从基础到Uinttest框架管理测试用例。链接:[黑马程序员python自动化测试教程,python从基础到Uinttest框架管理测试用例](https://www.bilibili.com/video/BV1av411q7dT?spm_i…...
Maven:详解 clean 和 install 命令的使用
clean 的主要功能是清理项目构建过程中生成的所有临时文件和输出文件。具体来说,clean 阶段会删除 target 目录及其所有内容。 clean 阶段的具体功能 删除 target 目录: target 目录是 Maven 构建过程中默认的输出目录,存放所有构建生成的文件…...
HTTP与RPC
一、概念 HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种应用层协议,主要用于在Web服务器之间传输html页面和其他Web资源。 RPC(Remote Procedure Call,远程过程调用) 是一种通用的远程调用通信协议&#…...
解决蓝牙键盘按键错乱的问题
最近发现我的蓝牙键盘按下的键盘与实际不符,于是就上网搜索答案,网上的方法都试了一遍 最后想着准备退货,没想到客服直接给我解决了 原因很简单,就是之前误触了键盘的某些按键导致的 每个键盘品牌的按键因该都不同的,可…...
MiL.k X Biggie 奇妙宇宙来袭!
MiL.k 和亚航奖励计划联手推出 MiL.k X BIGGIE 奇妙宇宙,为亚航会员和 MiL.k 用户提供神奇的 Web3 体验。这款沉浸式体验位于 The Sandbox 的 MiL.k Land,提供趣味游戏,解锁令人兴奋的新奖励。 亚航吉祥物 BIGGIE 和他友好的机舱服务员将引导…...
云服务器中删除非空目录(包含文件和子目录)rm -rf <directory_name>
在云服务器中删除目录可以使用 rm 命令。如果您需要删除一个非空目录(包含文件和子目录),可以使用以下命令: rm -rf <directory_name>参数解释: -r:递归删除,即删除目录及其所有内容&am…...
1991-2024年经管类国自然、国社科立项名单(附68份国自然标书)-最新出炉 附下载链接
很全!1991-2024年经管类国自然、国社科立项名单(附68份国自然标书) 下载链接-点它👉👉👉:很全1991-2024年经管类国自然、国社科立项名单(附68份国自然标书).zip 资源介…...
Flutter问题记录 - 布局中莫名其妙的白线/缝隙
文章目录 前言开发环境问题描述问题分析解决方案最后 前言 最近客服反馈了一个奇怪的问题,有个用户反馈其他问题时给了应用截图,然后他发现这截图中有一条奇怪的白线。他在自己手机上没有发现这个问题,于是提工单反馈到我这。 开发环境 Fl…...
从零学习大模型(七)-----LoRA(中)
自注意力层中的 LoRA 应用 Transformer 的自注意力机制是模型理解输入序列之间复杂关系的核心部分。自注意力层通常包含多个线性变换,包括键(Key)、查询(Query) 和 值(Value) 三个权重矩阵的线…...
Java知识巩固(十二)
I/O JavaIO流了解吗? IO 即 Input/Output,输入和输出。数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。数据传输过程类似于水流,因…...
一家光伏企业终止,恐不具行业代表性,市占率仅为2.35%
海达光能终止原因如下:报告期内海达光能销售金额较所在行业第二名亚玛顿相差两倍以上,公司毛利率更是远低于行业龙头福莱特,恐难以说明公司行业代表性。在企业竞争上,公司2021年度的市场占有率约为2.35%,公司未来光伏玻…...
企业计算机监控软件是什么?6款电脑监控软件分享!提升企业管理效率,吐血推荐!
嘿,各位企业管理者和IT小伙伴们! 您是否曾担忧员工在工作时间内效率低下?是否对公司的数据安全感到不安? 别担心,今天我们就来聊聊企业计算机监控软件,它就像是企业的"超级侦探",帮…...
VisionPro —— CogOCRMaxTool工具详解
CogOCRMaxTool的作用: CogOCRMaxTool:是一个字符识别工具,主要用于字符识别,它能够根据已训练的字符样本读取灰度图像中的字符,并返回读取结果。 一:工具位置 二:添加图片 三:工具的初始页面 将识别框拖到需要识别处…...
网站安全问题都有哪些,分别详细说明
网站安全问题涉及多个方面,以下是一些常见的网站安全问题及其详细说明: 数据泄露 问题描述:数据泄露是指网站存储的用户敏感信息(如用户名、密码、信用卡信息等)被非法获取。黑客可能通过SQL注入、XSS攻击等手段窃取这…...
DiskGenius一键修复磁盘损坏
下午外接磁盘和U盘都出现扇区损坏,估计就是在开着电脑,可能是电脑运行的软件还在对磁盘进行读写,不小心按到笔记本关机键,重新开机读写磁盘分区变得异常卡顿,估摸就是这个原因导致扇区损坏。在进行读写时,整…...
Matlab实现鼠群优化算法优化回声状态网络模型 (ROS-ESN)(附源码)
目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 鼠群优化算法(Rat Swarm Optimization, ROS)是一种基于老鼠群体行为的群体智能优化算法。ROS通过模拟老鼠在寻找食物时的聚集、分散和跟随行为,来探索解空间并寻找最优解。该算…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...

