【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通过模拟老鼠在寻找食物时的聚集、分散和跟随行为,来探索解空间并寻找最优解。该算…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...

Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...
Python的__call__ 方法
在 Python 中,__call__ 是一个特殊的魔术方法(magic method),它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时(例如 obj()),Python 会自动调用该对象的 __call__ 方法…...