本文只讲诉QTreeWidget的搜索功能,对于QTreeWidget的添加数据不进行概述
头文件
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QTreeWidget>
class CAirlineManageWidget : public CBaseWidget
{
Q_OBJECT
public:
QTreeWidget * m_airManagementWidget; //树控件
QLineEdit * m_SerachEdit; //搜索航线框
public slots:
//搜索航线数据
void SerachAirLinetNode();
private:
//对当前节点进行遍历查找并且对遍历的节点进行显示和隐藏的设置
void searchItem(QTreeWidgetItem * itm, QString keywords);
//显示子节点
void ShowSon(QTreeWidgetItem * itm);
//显示父节点
void ShowParent(QTreeWidgetItem * itm);
//显示所有节点
void ShowAllNode();
}
cpp文件
//初始化航线搜索框
m_SerachEdit = new QLineEdit(this);
m_SerachEdit->setObjectName("CommonEdit");
m_SerachEdit->setClearButtonEnabled(1);
m_SerachEdit->setPlaceholderText(QString::fromLocal8Bit("输入机场名称搜索"));
connect(m_SerachEdit, SIGNAL(textChanged(QString)), this, SLOT(SerachAirPortNode()));
m_mainLayout->addWidget(m_SerachEdit);
//搜索机场数据
void CAirManageMenuWidget::SerachAirPortNode()
{
//搜索关键字
QString keyWords = m_SerachEdit->text().trimmed();
if (keyWords == "")
{
ShowAllNode();
}
//对整个树进行一级遍历索引
for (int i = 0; i < m_airManagementWidget->topLevelItemCount(); ++i)
{
if (m_airManagementWidget->topLevelItem(i)->text(0).contains(keyWords))
{
m_airManagementWidget->topLevelItem(i)->setHidden(0);
}
else
{
m_airManagementWidget->topLevelItem(i)->setHidden(1);
}
//对当前节点进行遍历查找并且对遍历的节点进行显示和隐藏的设置
searchItem(m_airManagementWidget->topLevelItem(i), keyWords);
}
}
//对当前节点进行遍历查找并且对遍历的节点进行显示和隐藏的设置
void CAirManageMenuWidget::searchItem(QTreeWidgetItem * itm, QString keywords)
{
if (itm != nullptr)
{
for (int i = 0; i < itm->childCount(); ++i)
{
QTreeWidgetItem * cItm = itm->child(i);
if (cItm != nullptr)
{
if (cItm->text(0).contains(keywords))
{
cItm->setHidden(0);
cItm->setExpanded(1);
ShowSon(cItm);
ShowParent(cItm);
}
//不匹配隐藏
else
{
cItm->setHidden(1);
//递归判断
searchItem(cItm, keywords);
}
}
}
}
}
//显示子节点
void CAirManageMenuWidget::ShowSon(QTreeWidgetItem * itm)
{
//遍历子节点
for (int i = 0; i < itm->childCount(); ++i)
{
itm->child(i)->setHidden(0);
ShowSon(itm->child(i));
}
}
//显示父节点
void CAirManageMenuWidget::ShowParent(QTreeWidgetItem * itm)
{
if (itm != nullptr)
{
//获取当前节点的父节点
QTreeWidgetItem * pItm = itm->parent();
if (pItm != nullptr)
{
pItm->setHidden(0);
ShowParent(pItm);
}
}
}
//显示所有节点
void CAirManageMenuWidget::ShowAllNode()
{
for (int i = 0; i < m_airManagementWidget->topLevelItemCount(); ++i)
{
m_airManagementWidget->topLevelItem(i)->setHidden(0);
}
}
实现了在QLineEdit输入搜索内容,QTreeWidget出现搜索内容,当QLineEdit没有数据时,显示所有的树节点。