QtreeWidget实现模糊搜索功能
在输入框输入检索关键字,然后根据输入的关键字去搜索任务列表,只显示包含检索关键字的项随着输入文字的变化,不断的刷新搜索内容;效果如下所示。
搜索函数实现方法如下所示:
void TreeTaskList::SlotFilterChanged(QString strText) { QTreeWidgetItemIterator it(ui.treeWidget); QString str = ui.SearchInput->text(); //为空时全部显示 if (str.isEmpty()) { while (*it) { (*it)->setHidden(false); //添加搜索关键字,高亮显示 TreeItemBase* base =(TreeItemBase*) ui.treeWidget->itemWidget((*it),0); if (base) { base->SetFilterHover(strText); } ++it; } SlotUpdateTreeListBackground(); return; } //不为空时,先全部隐藏 while (*it) { (*it)->setHidden(true); ++it; } //搜索名字包含 QList<QTreeWidgetItem*> items; int count = ui.treeWidget->topLevelItemCount(); QTreeWidgetItem* topitem = NULL; for (int i = 0; i < count; i++) { topitem = ui.treeWidget->topLevelItem(i); if (topitem) { QVariantMap info = topitem->data(0, 256).toMap(); if (info.value("type").toString() == "-1") { continue; } RecursiveTasksStatistic(topitem, items, strText); if (info.value("name").toString().contains(strText, Qt::CaseInsensitive)) { items.push_back(topitem); } } } if (items.size()== 0) { ui.treeWidget->setStyleSheet(QLatin1String("QTreeWidget\n" "{\n" " background: #303033;\n" " font-size:16px;\n" " color: rgba(255,255,255,0);\n" " border:0px;\n" " background-image:url(:/analysisCenter/Resources/analysisCenter/searchEmpty.png);\n" " background-repeat:no-repeat;\n" " background-position:center;\n" "}\n" "\n" "QTreeWidget::item\n" "{\n" " background: #303033;\n" "}\n" "QTreeWidget::branch\n" "{\n" " background:#303033;\n" "}\n" "QTreeWidget::item:hover \n" "{\n" " background: rgba(255,255,255,0.12); \n" "\n" "}\n" "\n" "QTreeWidget::item:selected{\n" "\n" " background: rgba(32,128,247,0.32);\n" " color: rgba(32,128,247,0);\n" "}\n" "QTreeWidget::branch:closed:has-children:!has-siblings,\n" "QTreeWidget::branch:closed:has-children:has-siblings {\n" " background-image:url(:/analysisCenter/Resources/analysisCenter/arrowexpend-nor.svg);\n" " background-repeat:no-repeat;\n" " background-position:center;\n" "}\n" "\n" "QTreeWidget::branch:open:has-children:!has-siblings,\n" "QTreeWidget::branch:open:has-children:has-siblings {\n" " back" "ground-image:url(:/analysisCenter/Resources/analysisCenter/arrowclose-nor.svg);\n" " background-repeat:no-repeat;\n" " background-position:center;\n" "}")); } else { ui.treeWidget->setStyleSheet(QLatin1String("QTreeWidget\n" "{\n" " background: #303033;\n" " font-size:16px;\n" " color: rgba(255,255,255,0);\n" " border:0px;\n" "}\n" "\n" "QTreeWidget::item\n" "{\n" " background: #303033;\n" "}\n" "QTreeWidget::branch\n" "{\n" " background:#303033;\n" "}\n" "QTreeWidget::item:hover \n" "{\n" " background: rgba(255,255,255,0.12); \n" "\n" "}\n" "\n" "QTreeWidget::item:selected{\n" "\n" " background: rgba(32,128,247,0.32);\n" " color: rgba(32,128,247,0);\n" "}\n" "QTreeWidget::branch:closed:has-children:!has-siblings,\n" "QTreeWidget::branch:closed:has-children:has-siblings {\n" " background-image:url(:/analysisCenter/Resources/analysisCenter/arrowexpend-nor.svg);\n" " background-repeat:no-repeat;\n" " background-position:center;\n" "}\n" "\n" "QTreeWidget::branch:open:has-children:!has-siblings,\n" "QTreeWidget::branch:open:has-children:has-siblings {\n" " back" "ground-image:url(:/analysisCenter/Resources/analysisCenter/arrowclose-nor.svg);\n" " background-repeat:no-repeat;\n" " background-position:center;\n" "}")); } foreach(auto var, items) { var->setHidden(false); TreeItemBase* base = (TreeItemBase*)ui.treeWidget->itemWidget(var, 0); if (base) { base->SetFilterHover(strText); } while (var->parent()) { var->parent()->setHidden(false);//显示 var->parent()->setExpanded(true);//展开 var = var->parent(); } } }
采用递归的方法实现去获取treeWidget中每一个item的名称,是否包含了检索关键字;
void TreeTaskList::RecursiveTasksStatistic(QTreeWidgetItem* pCurrentItem,QList<QTreeWidgetItem*>& searchItem, QString strContent) { if (pCurrentItem==NULL||strContent=="") { return; } QTreeWidgetItem* pFindTask = NULL; int count = pCurrentItem->childCount(); QTreeWidgetItem* child = NULL; QString strName = ""; QVariantMap datainfo; for (int i = 0; i < count; i++) { child = pCurrentItem->child(i); datainfo = child->data(0, 256).toMap(); strName = datainfo.value("name").toString(); if (strName.contains(strContent, Qt::CaseInsensitive)) { searchItem.push_back(child); } if (datainfo.value("type").toString() == "1"|| datainfo.value("type").toString() == "0")//子文件夹或者 { RecursiveTasksStatistic(child, searchItem, strContent); } } }
自己开发了一个股票智能分析软件,功能很强大,需要的关注微信公众号:QStockView
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix