函数
我们利用QStandardItem建立QStandardItemModel类型树形数据结构时,并不会保存QStandardItem类指针对象,因而会有一个问题:当我们想要获得树形结构中特定的某项的QStandardItem指针时,该如做?
这会涉及几个函数,一个函数用于在创建树形结构时做标记,另外两个函数用于检索:
- QStandardItem::QStandardItem(const QString & text)
- void QStandardItem::setToolTip(const QString & toolTip)
- QString QStandardItem::toolTip() const
- QList<QStandardItem *> QStandardItemModel::findItems(const QString & text, Qt::MatchFlags flags = Qt::MatchExactly) const
释义
- QStandardItem类构造函数,text是项名称,是必设置的,它其实就是在treeview视图中显示项名称。利用函数text()可以获取它。
- 该函数字面意思是“工具提示”,实际它就是为该QStandardItem项设置一个字符串标记,设置后可以随时获取这个标记。一般在创建QStandardItem时设置。
- 获取QStandardItem标记。
- 获取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<QStandardItem *> 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指针
}