首页 > 解决方案 > 如何获取存储指向外部模型的指针的模型的 QModelIndex

问题描述

我有来自 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);
        }
    }
}

标签: qtmatchqtreeviewqabstractitemmodelqmodelindex

解决方案


推荐阅读