当前位置: 首页 > news >正文

【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);

下拉框关联表格代理

  1. 通过信号与槽关联
 connect(typeBox, &TableComboBox::selectionChange, this, &ShowTableView::filterBtnClick);
  1. 获取下拉框内容传到代理类做过滤
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("");
}
  1. 取消过滤,复位
void ShowTableView::noFilterBtnClick()
{proxyModel->isFilter = false;proxyModel->setFilterFixedString("");
}

截图

  1. 过滤前
  2. 过滤后
    在这里插入图片描述

相关文章:

【Qt】QTableView添加下拉框过滤条件

实现通过带复选框的下拉框来为表格添加过滤条件 带复选框的下拉框 .h文件 #pragma once #include <QCheckBox> #include <QComboBox> #include <QEvent> #include <QLineEdit> #include <QListWidget>class TableComboBox : public QComboBox …...

部署DNS主从服务器

一。DNS主从服务器作用&#xff1a; DNS作为重要的互联网基础设施服务&#xff0c;保证DNS域名解析服务的正常运转至关重要&#xff0c;只有这样才能提供稳定、快速日不间断的域名查询服务 DNS 域名解析服务中&#xff0c;从服务器可以从主服务器上获取指定的区域数据文件&…...

从可逆计算看低代码

2020年低代码&#xff08;LowCode&#xff09;这一buzzword频繁亮相于主流技术媒体&#xff0c;大背景下是微软/亚马逊/阿里/华为等巨头纷纷入场&#xff0c;推出自己的相应产品。一时之间&#xff0c;大大小小的技术山头&#xff0c;无论自己原先是搞OA/ERP/IOT/AI的&#xff…...

设计模式最佳实践代码总结 - 结构型设计模式篇 - 侨接设计模式最佳实践

目录 侨接设计模式最佳实践 侨接设计模式最佳实践 桥接模式是一种结构型设计模式&#xff0c;它将抽象部分与它的实现部分分离&#xff0c;使它们可以独立地变化。桥接模式是一种结构型设计模式&#xff0c;它将抽象部分与它的实现部分分离&#xff0c;使它们可以独立地变化。…...

【软件测试】python——Unittest

UnitTest 框架 笔记来自于黑马程序员python自动化测试教程&#xff0c;python从基础到Uinttest框架管理测试用例。链接&#xff1a;[黑马程序员python自动化测试教程&#xff0c;python从基础到Uinttest框架管理测试用例](https://www.bilibili.com/video/BV1av411q7dT?spm_i…...

Maven:详解 clean 和 install 命令的使用

clean 的主要功能是清理项目构建过程中生成的所有临时文件和输出文件。具体来说&#xff0c;clean 阶段会删除 target 目录及其所有内容。 clean 阶段的具体功能 删除 target 目录&#xff1a; target 目录是 Maven 构建过程中默认的输出目录&#xff0c;存放所有构建生成的文件…...

HTTP与RPC

一、概念 HTTP&#xff08;Hypertext Transfer Protocol,超文本传输协议&#xff09;是一种应用层协议&#xff0c;主要用于在Web服务器之间传输html页面和其他Web资源。 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用) 是一种通用的远程调用通信协议&#…...

解决蓝牙键盘按键错乱的问题

最近发现我的蓝牙键盘按下的键盘与实际不符&#xff0c;于是就上网搜索答案&#xff0c;网上的方法都试了一遍 最后想着准备退货&#xff0c;没想到客服直接给我解决了 原因很简单&#xff0c;就是之前误触了键盘的某些按键导致的 每个键盘品牌的按键因该都不同的&#xff0c;可…...

MiL.k X Biggie 奇妙宇宙来袭!

MiL.k 和亚航奖励计划联手推出 MiL.k X BIGGIE 奇妙宇宙&#xff0c;为亚航会员和 MiL.k 用户提供神奇的 Web3 体验。这款沉浸式体验位于 The Sandbox 的 MiL.k Land&#xff0c;提供趣味游戏&#xff0c;解锁令人兴奋的新奖励。 亚航吉祥物 BIGGIE 和他友好的机舱服务员将引导…...

云服务器中删除非空目录(包含文件和子目录)rm -rf <directory_name>

在云服务器中删除目录可以使用 rm 命令。如果您需要删除一个非空目录&#xff08;包含文件和子目录&#xff09;&#xff0c;可以使用以下命令&#xff1a; rm -rf <directory_name>参数解释&#xff1a; -r&#xff1a;递归删除&#xff0c;即删除目录及其所有内容&am…...

1991-2024年经管类国自然、国社科立项名单(附68份国自然标书)-最新出炉 附下载链接

很全&#xff01;1991-2024年经管类国自然、国社科立项名单&#xff08;附68份国自然标书&#xff09; 下载链接-点它&#x1f449;&#x1f449;&#x1f449;&#xff1a;很全1991-2024年经管类国自然、国社科立项名单&#xff08;附68份国自然标书&#xff09;.zip 资源介…...

Flutter问题记录 - 布局中莫名其妙的白线/缝隙

文章目录 前言开发环境问题描述问题分析解决方案最后 前言 最近客服反馈了一个奇怪的问题&#xff0c;有个用户反馈其他问题时给了应用截图&#xff0c;然后他发现这截图中有一条奇怪的白线。他在自己手机上没有发现这个问题&#xff0c;于是提工单反馈到我这。 开发环境 Fl…...

从零学习大模型(七)-----LoRA(中)

自注意力层中的 LoRA 应用 Transformer 的自注意力机制是模型理解输入序列之间复杂关系的核心部分。自注意力层通常包含多个线性变换&#xff0c;包括键&#xff08;Key&#xff09;、查询&#xff08;Query&#xff09; 和 值&#xff08;Value&#xff09; 三个权重矩阵的线…...

Java知识巩固(十二)

I/O JavaIO流了解吗&#xff1f; IO 即 Input/Output&#xff0c;输入和输出。数据输入到计算机内存的过程即输入&#xff0c;反之输出到外部存储&#xff08;比如数据库&#xff0c;文件&#xff0c;远程主机&#xff09;的过程即输出。数据传输过程类似于水流&#xff0c;因…...

一家光伏企业终止,恐不具行业代表性,市占率仅为2.35%

海达光能终止原因如下&#xff1a;报告期内海达光能销售金额较所在行业第二名亚玛顿相差两倍以上&#xff0c;公司毛利率更是远低于行业龙头福莱特&#xff0c;恐难以说明公司行业代表性。在企业竞争上&#xff0c;公司2021年度的市场占有率约为2.35%&#xff0c;公司未来光伏玻…...

企业计算机监控软件是什么?6款电脑监控软件分享!提升企业管理效率,吐血推荐!

嘿&#xff0c;各位企业管理者和IT小伙伴们&#xff01; 您是否曾担忧员工在工作时间内效率低下&#xff1f;是否对公司的数据安全感到不安&#xff1f; 别担心&#xff0c;今天我们就来聊聊企业计算机监控软件&#xff0c;它就像是企业的"超级侦探"&#xff0c;帮…...

VisionPro —— CogOCRMaxTool工具详解

CogOCRMaxTool的作用&#xff1a; CogOCRMaxTool:是一个字符识别工具&#xff0c;主要用于字符识别,它能够根据已训练的字符样本读取灰度图像中的字符,并返回读取结果。 一&#xff1a;工具位置 二&#xff1a;添加图片 三&#xff1a;工具的初始页面 将识别框拖到需要识别处…...

网站安全问题都有哪些,分别详细说明

网站安全问题涉及多个方面&#xff0c;以下是一些常见的网站安全问题及其详细说明&#xff1a; 数据泄露 问题描述&#xff1a;数据泄露是指网站存储的用户敏感信息&#xff08;如用户名、密码、信用卡信息等&#xff09;被非法获取。黑客可能通过SQL注入、XSS攻击等手段窃取这…...

DiskGenius一键修复磁盘损坏

下午外接磁盘和U盘都出现扇区损坏&#xff0c;估计就是在开着电脑&#xff0c;可能是电脑运行的软件还在对磁盘进行读写&#xff0c;不小心按到笔记本关机键&#xff0c;重新开机读写磁盘分区变得异常卡顿&#xff0c;估摸就是这个原因导致扇区损坏。在进行读写时&#xff0c;整…...

Matlab实现鼠群优化算法优化回声状态网络模型 (ROS-ESN)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 鼠群优化算法&#xff08;Rat Swarm Optimization, ROS&#xff09;是一种基于老鼠群体行为的群体智能优化算法。ROS通过模拟老鼠在寻找食物时的聚集、分散和跟随行为&#xff0c;来探索解空间并寻找最优解。该算…...

nfs作业

一、作业要求 1、开放/nfs/shared目录&#xff0c;供所有用户查询资料 2、开放/nfs/upload目录&#xff0c;为192.168.xxx.0/24网段主机可以上传目录&#xff0c; 并将所有用户及所属的组映射为nfs-upload,其UID和GID均为210 3、将/home/tom目录仅共享给192.168.xxx.xxx这台…...

Linux 基础io_理解文件系统_软硬链接_动静态库

一.磁盘 1.磁盘物理结构 盘片 磁盘可以有多个磁片&#xff0c;每个磁片有两个盘面&#xff0c;每个盘面都对应一个磁头&#xff0c;都可以存储数据。 磁道 扇区 磁道是指在盘面上&#xff0c;由磁头读写的数据环形轨道。每个磁道都是由一圈圈的圆形区域组成&#xff0c;数据…...

大语言模型参数传递、model 构建与tokenizer构建(基于llama3模型)

文章目录 前言一、传递参数构建1、构建模型参数2、构建数据参数3、构建训练参数4、类似parse方式解析数据、模型、训练参数五、构建tokenizer与model1、tokenizer与model调用代码2、tokenizer实现2、model实现前言 上一篇说到huggingface的参数传递理论方法,本篇文章应用与ll…...

使用 `screen` + `nohup` 实现高效日志记录和多环境任务管理

使用 screen nohup 实现高效日志记录和多环境任务管理 在深度学习模型训练中&#xff0c;特别是在服务器上运行长时间的任务时&#xff0c;有效的任务管理和日志记录至关重要。我们通常需要在后台运行多个任务&#xff0c;同时为每个任务配置不同的 conda 环境。通过结合使用…...

【探索数字孪生,引领未来技术】

在数字化浪潮的推动下&#xff0c;数字孪生技术正成为连接虚拟与现实的桥梁&#xff0c;它不仅是工业互联网的基石&#xff0c;更是智慧城市、智慧园区、智慧楼宇以及元宇宙构建的核心。为了帮助更多专业人士掌握这一前沿技术&#xff0c;我们荣幸地宣布&#xff0c;“新质技术…...

Tcp_Sever(线程池版本的 TCP 服务器)

Tcp_Sever&#xff08;线程池版本的 TCP 服务器&#xff09; 前言1. 功能介绍及展示1.1 服务端连接1.2 客户端连接&#xff08;可多个用户同时在线连接服务端&#xff09;1.3 功能服务1.3.1 defaultService&#xff08;默认服务&#xff09;1.3.2 transform&#xff08;大小写转…...

第十一章 Vue生命周期及生命周期的四个阶段

目录 一、引言 1.1. Vue生命周期的具体阶段 1.2. 每个阶段的具体作用和常用场景 1.3. 生命周期钩子函数 ​二、代码示例 三、运行效果 一、引言 Vue生命周期是指Vue组件实例从创建到销毁的整个过程。在这个过程中&#xff0c;组件经历了一系列的阶段&#xff0c;每个阶段…...

展厅展会客流显示屏的客流统计功能如何实现

随着科技的发展&#xff0c;展厅和展会的管理越来越智能化。客流显示屏作为一种高效的管理工具&#xff0c;能够实时显示参观人数&#xff0c;帮助主办方更好地了解客流情况&#xff0c;优化资源配置。本文将详细介绍展厅展会客流显示屏的客流统计功能如何实现&#xff0c;分为…...

golang正则表达式的使用及举例

正则表达式很强大&#xff0c;在一些场合如抓包&#xff0c;爬虫等方面很有用。在 Go语言中&#xff0c;正则表达式通过标准库 regexp 提供支持。使用正则表达式可以进行字符串匹配、替换和分割等操作。 以下是正则表达式的基本使用方法及示例&#xff1a; 1. 导入 regexp 包 …...

Flutter杂学: iOS 上启用自动填充和关联域

下面是详细的配置和代码&#xff0c;以确保在 iOS 上启用自动填充和关联域&#xff08;Associated Domains&#xff09;功能。 配置步骤 1. 在 Apple Developer 控制台中启用 Associated Domains 登录 Apple Developer。导航至您的 App ID 设置页面。找到您要配置的 App ID&…...