在輸入框輸入檢索關鍵字,然後根據輸入的關鍵字去搜索任務列表,只顯示包含檢索關鍵字的項隨着輸入文字的變化,不斷的刷新搜索內容;效果如下所示。
搜索函數實現方法如下所示:
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); } } }