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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章