我有来自 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 中的第三个唯一 Bookmark_Node。
为了在树视图中找到 QModelIndex,我尝试使用 QAbstractIem::match()。
但我迷路了:
如何将 startIndex(第一个参数)设置为树的顶级根?
如何将我的 Bookmark_Node 指针传递给 QVariant(第三个参数)?
或者更一般地说:如何获得一个 QModelIndex 以传递给 QTreeView::scrollTo,具有内部指针 Bookmark_Node 指针。
我可以通过 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);
}
}
}