Qt documentation指出,使用设置了QAbstractItemModel::match()
和Qt::MatchRecursive
标志的Qt::MatchWrap
进行搜索将遍历“整个层次结构”和“当搜索到达末尾的最后一项时模型,它会从第一个项目再次开始,一直持续到检查完所有项目为止。”
但是,在我的示例中,情况并非如此。 match()
仅搜索start
索引的子项/兄弟项。
我正在尝试实现一个简单的“下一个”和“上一个”搜索功能,以在QTreeView
中搜索文本。但是由于match()
不会搜索父项/上级项,因此退出为时过早。
这是我的“下一个”功能:
QModelIndex searchStartIndex;
if(!treeView->currentIndex().isValid())
searchStartIndex = treeView->model()->index(0,0);//root item
else
searchStartIndex = treeView->currentIndex();
QModelIndexList nextMatches = treeView->model()->match(searchStartIndex, Qt::DisplayRole, lineEdit->text(), 1, Qt::MatchContains | Qt::MatchWrap | Qt::MatchRecursive);
if(nextMatches.size() == 1)
{
//first result might be the currently selected item
if(nextMatches.at(0) == treeView->currentIndex())
{
nextMatches = treeView->model()->match(searchStartIndex, Qt::DisplayRole, lineEdit->text(), 2, Qt::MatchContains | Qt::MatchWrap | Qt::MatchRecursive);
if(nextMatches.size() == 2)
{
treeView->setCurrentIndex(nextMatches.at(1));
}
}
else
treeView->setCurrentIndex(nextMatches.at(0));
}
我不明白为什么文档会说一件事,但是行为却有所不同。