该界面包括一个QLineEdit控件和一个QTreeWidget控件。
2、使用递归实现对查找到的项的父子索引项遍历且设置为可见
//使用递归的方式向目标节点的父节点进行递归查找
void TableWidgwet::showParent(QTreeWidgetItem* pItem)
{
if (pItem != nullptr) //判断当前节点是否存在
{
QTreeWidgetItem* pTreeParentItem = pItem->parent(); //获取当前节点的父节点
if (pTreeParentItem != nullptr) //判断父节点是否存在
{
pTreeParentItem->setHidden(false); //将该父级索引项设置为显示
showParent(pTreeParentItem);//直接传入处理过的节点
//避免传入该节点后递归后跳转到祖父节点
}
}
}
//使用递归的方式遍历子节点同时设置为显示
void TableWidgwet::showSon(QTreeWidgetItem* pItem)
{
int iChild = pItem->childCount(); //获取该子节点的数目
for (int i = 0; i < iChild; ++i)//遍历当前项的子节点并设置
{
pItem->child(i)->setHidden(false);
showSon(pItem->child(i));//对当前 子项进行递归
}
}
3、对当前的节点进行遍历查找且对遍历的节点进行显示和隐藏的设置
//依旧是采用递归的方式实现
void TableWidgwet::searchItem(QTreeWidgetItem* tableItem,QString& strText)
{
if (tableItem != nullptr)//防止野指针的问题
{
for (int i = 0; i < tableItem->childCount(); ++i)
{
QTreeWidgetItem* pTreeItem = tableItem->child(i);
if (pTreeItem != nullptr)
{
//如何索引项字段部分匹配于输入框字段则设置该项及其父子项显示且展开
if (pTreeItem->text(0).contains(strText))
{
pTreeItem->setHidden(false);
pTreeItem->setExpanded(true);
showSon(pTreeItem);
showParent(pTreeItem);
}
else
{
pTreeItem->setHidden(true);//不匹配则隐藏
searchItem(pTreeItem, strText);//递归遍历
}
}
}
}
}
4、对整个树形索引控件的一级索引项进行遍历,并调用上述的函数实现对每个一级索引项下的索引项进行递归遍历设置
void TableWidgwet::showItem()
{
for (int i = 0; i < ui.treeWidget->topLevelItemCount(); ++i)
{
if (ui.treeWidget->topLevelItem(i)->text(0).contains(ui.lineEdit->text()))
{
ui.treeWidget->topLevelItem(i)->setHidden(false);
}
else
{
ui.treeWidget->topLevelItem(i)->setHidden(true);
}
searchItem(ui.treeWidget->topLevelItem(i), ui.lineEdit->text());
}
}
5、使用connect对QLineEdit的textchange事件响应与槽函数绑定处理
connect(ui.lineEdit, &QLineEdit::textChanged, this, &TableWidgwet::showItem);
四、实现的效果
QT的QTreewidget实现索引的搜索_腾讯视频
禁止转载,