如何获取存储指向外部模型的指针的模型的QModelIndex

时间:2019-05-05 11:17:01

标签: qt match qtreeview qabstractitemmodel 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中的第3个唯一的Bookmark_Node。

为了在树视图中找到QModelIndex,我尝试使用QAbstractIem :: match()。

但是我迷路了:

如何将startIndex(第一个参数)设置为树的顶级根?

如何将我的Bookmark_Node指针传递给QVariant(第3个参数)?

或更笼统地说:如何获得具有内部指针Bookmark_Node指针的QModelIndex传递给QTreeView :: scrollTo。

我可以通过QModelIndices来丰富bookmarkOnlyInList_1 / 2,但是这会使模型与视图混合在一起,我想避免这种情况。 有什么建议吗?

更多信息:

程序启动时,看起来像: enter image description here

按下按钮后,应搜索“ Mike”并展开此节点,如下图所示。问题是,它没有扩展。 enter image description here

如果我扩展所有内容,则会得到完整的模型: enter image description here

这里是启动按钮后将运行的代码。 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);
        }
    }
}

0 个答案:

没有答案