QTreeView实现搜索功能并且关键字标红

news/2024/11/17 20:38:19/文章来源:https://www.cnblogs.com/bclshuai/p/18414403

1、需求描述

实现组织树搜索,关键字红色显示;搜索规则,名称匹配显示,没有匹配不显示,子节点匹配,父节点即使没有匹配也显示;

2.实现方法

(1)top节点名称匹配关键则显示,否则隐藏

void TreeTaskList::SlotFilterChanged(QString strText)
{m_TreeDelegate->setProperty("FilterString", strText);//给代理设置搜索关键字
    QRegExp regExp(strText, Qt::CaseInsensitive);for (int i = 0; i < m_modelTree->rowCount(); i++){QStandardItem* topitem = m_modelTree->item(i, 0);bool iret = RecluserFindItem(topitem, regExp);QString strName = topitem->data(Qt::UserRole).toMap().value("name").toString();if (strName.contains(regExp) || iret == false){ui.treeView->setRowHidden(i, topitem->index().parent(), false);}else{ui.treeView->setRowHidden(i, topitem->index().parent(), true);}}
}

(2)递归查看子节点名称是否匹配

如果子节点包含关键字,父节点没有包含关键字也要显示

bool TreeTaskList::RecluserFindItem(QStandardItem* pFItem, QRegExp strText)
{bool rethidden = true;if (pFItem == NULL){return rethidden;}int rowcount = pFItem->rowCount();for (int c = rowcount - 1; c >= 0; c--){QStandardItem* childItem = pFItem->child(c, 0);if (childItem != NULL){if (strText.isEmpty()){ui.treeView->setRowHidden(c, pFItem->index(), false);RecluserFindItem(childItem, strText);rethidden = false;}else{bool childret = RecluserFindItem(childItem, strText);if (childret == false){rethidden = false;}QString strName = childItem->data(Qt::UserRole).toMap().value("name").toString();if (strName.contains(strText) || childret == false){ui.treeView->setRowHidden(c, pFItem->index(), false);rethidden = false;}else{ui.treeView->setRowHidden(c, pFItem->index(), true);}}}}return rethidden;
}

3)匹配文字显示红色

要使搜索关键字变成红色,需要在代理中重写代理的paintevent函数,绘制文字颜色;根据设置给代理的属性"FilterString",就是搜索关键字,匹配名称,匹配的关键字设置为红色,文字长度超出范围,增加省略号;

void TreeTaskDelegate::paintName(QPainter *painter,QRect rect,QString strName) const
{QString filter = this->property("FilterString").isValid() ? this->property("FilterString").toString() : "";painter->save();QColor text_color = QColor(255, 255, 255, 0.7);          // 文本颜色QColor filter_color = QColor(250, 50, 57, 255);      // 高亮颜色// 高亮文本QString filter_text = filter;  // 文字与过滤文字首先获取出来QString text = strName;QFont font;font.setPixelSize(16);font.setFamily("Microsoft YaHei UI");painter->setFont(font);QFontMetrics font_metrics(font);int realwidth=font_metrics.width(text);int text_width = rect.width();QTextDocument m_LabelName;m_LabelName.setDefaultFont(font);// 右部显示省略号
    QFontMetrics font_width(font);//text = font_width.elidedText(text, Qt::ElideRight, text_width);// 然后将匹配项加上font-color标签,若非空的话if (!filter_text.isEmpty()){int last_index = text.lastIndexOf(filter_text, -1, Qt::CaseInsensitive);while (last_index != -1){text.insert(last_index + filter_text.length(), "</font>");text.insert(last_index, QString("<font color=%1>").arg(filter_color.name()));last_index = text.lastIndexOf(filter_text, last_index, Qt::CaseInsensitive);}}// 在文档中设置字体,并设置文字QString strColorText = QString("<font color=%1>%2</font>").arg(text_color.name()).arg(text);m_LabelName.setHtml(strColorText);int y =40;//居中显示高度y = (y - 24) / 2;if (y < 0){y = 0;}QRect text_rect = rect;  // 文字高度为20,所以文字上下空白为6pxint h1 = text_rect.height();int h2 = font_metrics.height();painter->translate(QPoint(text_rect.x(), text_rect.y() -2));// +(text_rect.height() - font_metrics.height()) / 2)m_LabelName.drawContents(painter, text_rect.translated(-text_rect.x(), -text_rect.y()));painter->restore();if (realwidth > text_rect.width())//超过长度绘制省略号
    {QRect rectsl = QRect(text_rect.right()+1, text_rect.y(), 20, 24);painter->drawText(rectsl, Qt::AlignLeft | Qt::AlignVCenter, "");}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/797109.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息学奥赛初赛天天练-89-CSP-S2023基础题1-linux常用命令、完全平方数、稀疏图、队列、散列表、二叉树、哈夫曼树

PDF文档公众号回复关键字:202409142023 CSP-S 选择题 单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项) 1 在 Linux 系统终端中,以下哪个命令用于创建一个新的目录 ? ( ) A newdir B mkdir C create D mkfold 2 从0,1,2,3,4 中选取 4 个数字,能…

格力-空调遥控器说明书

客厅柜机遥控器 主卧空调遥控器 aa

【YashanDB知识库】单机升级典型问题及应急措施

升级典型问题 官网升级操作指引 离线升级,一般线上操作之前需要照着做一遍,但是由于数据量少、monit进程在测试环境没有启动等原因,一些操作、配置问题在测试过程中不会暴露,在生成操作的时候才暴露,下面3项是比较常见的容易遗漏的: 1、monit进程没停止引起升级失败 moni…

征程 6E/M 快速上手实战 Sample-Codec

征程 6E/M 快速上手实战 Sample-Codec 01 Codec 模块简述 Codec(Coder-Decoder)是指编解码器,用于压缩或解压缩视频、图像、音频等媒体数据;J6 Soc 中存在两种硬件编解码单元,分别是 VPU(Video process unit)和 JPU(Jpeg process unit),可提供 4K@90fps 的视频编解码…

【触想智能】工控一体机在船舶航运上应用的优势和应用场景分析

随着船舶航运业的发展,工控一体机在船舶航运领域上的应用越来越广泛。工控一体机的功能和性能可以加强船舶航运领域的自动化和智能化水平。下面,触想智能小编针对工控一体机在船舶航运领域上应用的优势和应用场景进行简单分析,给大家借鉴参考。一、船舶管理工控一体机可以通…

工控机维修

工控机维修是一个涉及硬件和软件多方面知识的综合性工作,针对工控机可能出现的各种故障,以下是一些常见的维修方法和注意事项: 一、常见故障原因及维修方法 电源故障 故障现象:电源指示灯不亮或闪烁,无法启动机器。 解决方法: 检查电源插头是否插紧,电源线是否损坏。 尝…

SAP B1 Web Client MS Teams App集成连载一:先决条件/Prerequisites

一、先决条件/Prerequisites 在设置 SAP Business One 应用之前,确保您已具备以下各项: Before you set up the SAP Business One app, make sure you have acquired the following: 1.Microsoft Teams 管理员账户/A Microsoft Teams admin account您需要使用此账户为贵组织上…

异构仿真:打造更可靠的综合化航空电子软件

​综合化航空电子系统是一类典型的安全关键系统,具有分布式、异构、计算资源和物理资源强耦合等特征。随着IMA(Integrated Modular Avionics,综合模块化航空电子)系统趋于复杂化和智能化,系统的功能越来越多地采用软件来实现,如何打造更为可靠的综合化航空电子软件成为一…

Halo 开发者指南——项目运行、构建

准备工作 环境要求OpenJDK 17 LTS Node.js 20 LTS pnpm 9 IntelliJ IDEA Git Docker(可选)名词解释 工作目录 指 Halo 所依赖的工作目录,在 Halo 运行的时候会在系统当前用户目录下产生一个 halo-next 的文件夹,绝对路径为 ~/halo-next。里面通常包含下列目录或文件:​db​…

react-pdf预览在线PDF的使用

记录在PC端和移动端使用react-pdf插件预览pdf文件的使用1、在react项目中安装react-pdf依赖包 建议安装8.0.2版本的react-pdf,如果安装更高版本的可能出现一些浏览器的兼容性问题;npm install react-pdf@8.0.2 -S 1、PC端的使用 1.1、封装一个组件:PdfViewModal.tsximport …

数业智能心大陆探索生成式AIGC创新前沿

近日,数业智能心大陆参与了第九届“创客中国”生成式人工智能(AIGC)中小企业创新创业大赛。在这场汇聚了众多创新力量的研讨过程中,广东数业智能科技有限公司基于多智能体的心理健康技术探索与应用成果,从众多参赛者中脱颖而出。彰显了公司在技术创新领域的深厚实力,也为…

CSS 设置中英文和数字文本的换行

CSS 设置中英文和数字文本的换行CSS 设置中英文和数字文本的换行 在 CSS 中,可以使用不同的规则来控制中文、英文、数字等文本的换行行为。以下是一些常用的 CSS 属性和技巧,用于处理不同类型文本的换行。 1. 中文自动换行 中文字符之间通常不需要额外处理即可自动换行。不过…