Qt 对QTreeView的遍历及搜索
#pragma once
#include <QtWidgets/QWidget>
#include "ui_TestQtreeView.h"
#include <QStandardItemModel>
class TestQtreeView : public QWidget
{
Q_OBJECT
public:
TestQtreeView(QWidget *parent = Q_NULLPTR);
public slots:
void OnSearchBtnClicked();
void GetItem(QStandardItem*);
void GetParent(QStandardItem*);
void CreateSearchedTree(QStandardItem*, QStandardItem*, QString);
private:
Ui::TestQtreeViewClass ui;
QStandardItemModel *m_pModel;
QStandardItemModel *m_pSearchModel;
};
#include "TestQtreeView.h"
#include <QStandardItemModel>
#include <QBrush>
TestQtreeView::TestQtreeView(QWidget *parent)
: QWidget(parent)
, m_pModel(NULL)
, m_pSearchModel(NULL)
{
ui.setupUi(this);
connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(OnSearchBtnClicked()));
QStandardItemModel *model = new QStandardItemModel();
m_pSearchModel = new QStandardItemModel(ui.treeView_2);
m_pModel = model;
ui.stackedWidget->setCurrentIndex(0);
model->setHorizontalHeaderLabels(QStringList() << QStringLiteral("省市县"));
// 省
QStandardItem *provinceItem_1 = new QStandardItem(QStringLiteral("山东省"));
QStandardItem *provinceItem_2 = new QStandardItem(QStringLiteral("江苏省"));
// 市
QStandardItem *cityItem_1_1 = new QStandardItem(QStringLiteral("济南市"));
QStandardItem *cityItem_1_2 = new QStandardItem(QStringLiteral("青岛市"));
QStandardItem *cityItem_1_3 = new QStandardItem(QStringLiteral("徐州市test1"));
//QStandardItem *cityItem_1_3 = new QStandardItem(QStringLiteral("淄博市"));
QStandardItem *cityItem_2_1 = new QStandardItem(QStringLiteral("南京市"));
QStandardItem *cityItem_2_2 = new QStandardItem(QStringLiteral("无锡市"));
QStandardItem *cityItem_2_3 = new QStandardItem(QStringLiteral("徐州市"));
QStandardItem *cityItem_2_4 = new QStandardItem(QStringLiteral("徐州市1"));
// 县
QStandardItem *countyItem_1_3_1 = new QStandardItem(QStringLiteral("即墨市"));
QStandardItem *countyItem_1_3_2 = new QStandardItem(QStringLiteral("城阳区"));
// [1] 创建一级节点:model 下创建省节点
model->appendRow(provinceItem_1);
int n = provinceItem_1->rowCount();
model->appendRow(provinceItem_2);
// [2] 创建二级节点:provinceItem 下创建市节点
provinceItem_1->appendRow(cityItem_1_1);
provinceItem_1->appendRow(cityItem_1_2);
provinceItem_1->appendRow(cityItem_1_3);
n = provinceItem_1->rowCount();
provinceItem_2->appendRow(cityItem_2_1);
provinceItem_2->appendRow(cityItem_2_2);
provinceItem_2->appendRow(cityItem_2_3);
//provinceItem_2->appendRow(cityItem_2_4);
// [3] 创建三级节点:cityItem 下县节点
cityItem_1_3->appendRow(countyItem_1_3_1);
cityItem_1_3->appendRow(countyItem_1_3_2);
ui.treeView->setModel(model);
ui.treeView->resize(500, 500);
ui.treeView->show();
ui.treeView->expandAll();
int N = model->rowCount();
ui.treeView->setHeaderHidden(true);
}
void TestQtreeView::OnSearchBtnClicked()
{
QString strText = ui.lineEdit->text();
int iCnt = ui.treeView->model()->rowCount();
for (int i = 0; i < iCnt; ++i)
{
QStandardItem* pItem = m_pModel->item(i);
QString strTmp = pItem->text();
GetItem(pItem);
}
}
void TestQtreeView::GetItem(QStandardItem* pItem)
{
if (pItem == NULL)
{
return;
}
if (pItem->hasChildren())
{
int iCnt = pItem->rowCount();
for (int i = 0; i < iCnt; ++i)
{
QStandardItem *pChildItem = pItem->child(i);
QString strTmp = pChildItem->text();
//匹配到了
if (strTmp.contains(ui.lineEdit->text()))
{
pChildItem->setBackground(QBrush(QColor("#DDA0DD")));
QStandardItem* pParentItem = new QStandardItem(pChildItem->parent()->text());
//QStandardItem* pParentItem = pChildItem->parent();
QString strItemText = pParentItem->text();
//pParentItem->setData(strItemText)
GetParent(pParentItem);
CreateSearchedTree(pParentItem, pChildItem, strItemText);
}
GetItem(pChildItem);
}
}
ui.stackedWidget->setCurrentIndex(1);
}
void TestQtreeView::GetParent(QStandardItem* pParentItem)
{
if (pParentItem == NULL)
{
return;
}
//递归获取父节点
GetParent(pParentItem->parent());
//目标节点的父节点的父节点若为空,则代表为根节点
QStandardItem* pParent = pParentItem->parent();
if (pParent == NULL)
{
QString str = pParentItem->text();
QStandardItem* pRoot = pParentItem;
m_pSearchModel->appendRow(pRoot);
QString strEx = pRoot->text();
ui.treeView_2->setModel(m_pSearchModel);
ui.treeView_2->resize(500, 500);
ui.treeView_2->show();
ui.treeView_2->expandAll();
int N = m_pSearchModel->rowCount();
ui.treeView_2->setHeaderHidden(true);
}
}
void TestQtreeView::CreateSearchedTree(QStandardItem* pParentItem, QStandardItem* pChildItem, QString strItemText)
{
if (pParentItem && pChildItem)
{
QStandardItem* pChild = new QStandardItem(pChildItem->text());
pParentItem->appendRow(pChild);
}
}