QT笔记- QStandardItemModel树数据检索/遍历,查找特定分支结构中的特定QStandardItem节点项

函数

我们利用QStandardItem建立QStandardItemModel类型树形数据结构时,并不会保存QStandardItem类指针对象,因而会有一个问题:当我们想要获得树形结构中特定的某项的QStandardItem指针时,该如做?

这会涉及几个函数,一个函数用于在创建树形结构时做标记,另外两个函数用于检索:

  1. QStandardItem::QStandardItem(const QString & text)
  2. void QStandardItem::setToolTip(const QString & toolTip)
  3. QString QStandardItem::toolTip() const
  4. QList QStandardItemModel::findItems(const QString & text, Qt::MatchFlags flags = Qt::MatchExactly) const

释义

  1. QStandardItem类构造函数,text是项名称,是必设置的,它其实就是在treeview视图中显示项名称。利用函数text()可以获取它。
  2. 该函数字面意思是“工具提示”,实际它就是为该QStandardItem项设置一个字符串标记,设置后可以随时获取这个标记。一般在创建QStandardItem时设置。
  3. 获取QStandardItem标记
  4. 获取QStandardItemModel中所有项名称为(或包含)text的项,这些QStandardItem指针项被放入一个QList数组中。函数参数中的枚举用于指定在树中的搜索方式。比如Qt::MatchExactly表示项名称必须完全匹配text,而Qt::MatchContains表示只要项名称中包含text就行,另外Qt::MatchRecursive表示搜索树的全部节点,此枚举项可以与前面两项进行组合。

示例

创建树:

QStandardItemModel * model = new QStandardItemModel(this);
QStandardItem * item = model->invisibleRootItem();//获取根节点

//创建一级目录: a
QStandardItem * name = new QStandardItem("a");
name->setToolTip("a");//做标记
item->appendRow(name);//给item建立分支节点                        

//创建二级目录: a,b
QStandardItem * item1 = new QStandardItem(QString("a"));
item1->setToolTip("a/a");//按照树形结构分支,以目录形式设置标记,这样标记具有唯一性。
name->appendRow(item1); 
QStandardItem * item2 = new QStandardItem(QString("b"));
item2->setToolTip("a/b");
name->appendRow(item2); 

//创建三级目录:a
QStandardItem * item3 = new QStandardItem(QString("a"));
item3->setToolTip("a/a/a");
item1->appendRow(item3); 

若想要获取上面二级目录中的项名称为“a”的QStandardItem指针,该如何做呢?

树形结构中有三个名称为“a”的项,这里的方法是获取所有项名称为“a”的QStandardItem项,然后一一对比它们的标记,直到找到我们所需要的那个分支下的项:

//枚举参数“Qt::MatchExactly | Qt::MatchRecursive”表示以项名称、全树进行搜索
QList list = model->findItems("a", Qt::MatchExactly | Qt::MatchRecursive);
for(int i = 0; i < list.size(); ++i)
{
    if(list[i]->toolTip() == "a/a")//查找标记为a/a的项
        ;//这里list[i]即为树形分支a/a对应的QStandardItem指针
}

 

你可能感兴趣的:(QT笔记- QStandardItemModel树数据检索/遍历,查找特定分支结构中的特定QStandardItem节点项)