我有一个模型,其中包含来自2种不同浏览器的2个书签节点列表(每个书签节点包含名称和可能的URL)。
class Bookmark_Node {
QString name,
QString url,
Bookmark_node* parent}
书签列表:
std::vector<Bookmark_Nodes *>bookmarkList_1
std::vector<Bookmark_Nodes *>bookmarkList_2
此模型还具有比较方法,该方法可以确定哪些书签仅包含在一个书签列表中。结果,我在模型中有2个其他列表:
std::vector<Bookmark_Nodes *>bookmarkOnlyInList_1
std::vector<Bookmark_Nodes *>bookmarkOnlyInList_2
使用Qt时,我使用2个QTreeview来显示bookmarkList_1和bookmarkList_2,其中QModelIndex在内部指向Bookmark_Nodes。
现在,由于我有bookmarkOnlyInList_1 / bookmarkOnlyInList_1,因此我想按给定的整数var滚动到Bookmark_Node(例如,bookmarkOnlyInList_1中的第3个唯一的Bookmark_Node。
为了在树视图中找到QModelIndex,我尝试使用QAbstractIem :: match()。
但是我迷路了:
如何将startIndex(第一个参数)设置为树的顶级根?
如何将我的Bookmark_Node指针传递给QVariant(第3个参数)?
或更笼统地说:如何获得具有内部指针Bookmark_Node指针的QModelIndex传递给QTreeView :: scrollTo。
我可以通过QModelIndices来丰富bookmarkOnlyInList_1 / 2,但是这会使模型与视图混合在一起,我想避免这种情况。 有什么建议吗?
更多信息:
按下按钮后,应搜索“ Mike”并展开此节点,如下图所示。问题是,它没有扩展。
这里是启动按钮后将运行的代码。 QModelIndexList行包含Mike的QModelIndex,但是row和count设置为零。也许这就是问题的原因。
void MainWindow::on_pushButton_clicked()
{
TreeNode::T_Ptr tn = model->root();
TreeNode* searchNode = tn->child(1)->child(1).get();// Should be Mike
qDebug() << "SearchNode = "
<< QString::fromStdString(searchNode->name());
QModelIndex start = model->index(0, 0);
QVariant dat = QVariant(QString::fromStdString(searchNode->name()));
QModelIndexList l = model->match(start, Qt::DisplayRole,
dat, 10,
Qt::MatchRecursive);
for (QModelIndex i : l) {
qDebug() << "Row = " << i.row() << " Column = " << i.column();
TreeNode* s = static_cast<TreeNode*>(i.internalPointer());
qDebug() << "Search Name = " << QString::fromStdString(s->name());
if (s == searchNode) {
qDebug() << "From Model = " << QString::fromStdString(s->name());
ui->treeView->expand(i);
qDebug() << "expanded = " << ui->treeView->isExpanded(i);
// ui->treeView->expandAll();
ui->treeView->scrollTo(i, QAbstractItemView::EnsureVisible);
}
}
}