首页 > 解决方案 > 如何从 QTreeView 中的项目中获取索引

问题描述

我的 Qt-Application 是基于EditableTreeModelQt 的示例构建的。在TreeModel该类中有一个被调用的函数getItem(),它以QModelIndex为参数并返回一个TreeItem

对于我的应用程序,我需要反向功能:QModelIndexTreeItem. 这应该独立于视图。这意味着我不能使用该功能QTreeView::currentIndex()

我的问题有什么好的解决方案吗?

标签: c++qt

解决方案


您需要调用QAbstractItemModel::createIndex传入正确的rowcolumn以及项目本身。

以下应该有效:

QModelIndex TreeModel::indexForTreeItem(TreeItem* item)
{
    return createIndex(item->childNumber(), 0, item);
}

解释我是如何得出这个结论的:

createIndex还接受一个void*数据指针,在EditableTreeModel TreeModel示例代码中,它是一个指向TreeItem. TreeModel::index您可以在成员函数中看到这种情况:

QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) const
{
    if (parent.isValid() && parent.column() != 0)
        return QModelIndex();

    TreeItem *parentItem = getItem(parent);

    TreeItem *childItem = parentItem->child(row);
    if (childItem)
        return createIndex(row, column, childItem); // <-- here childItem is the TreeItem*
    else
        return QModelIndex();
}

请注意,这QAbstractItemModel::createIndex是一个受保护的函数,因此您必须向您的新成员函数添加一个为您TreeModel创建的函数QModelIndex

为了计算给定的TreeItem,有一个成员函数childNumber返回其在其父子列表中的索引(即:它的行)

不幸的是,不可能计算给定的TreeItem,因为 aTreeItem包含其列的所有数据,因此包含所有列。因此,合理的默认设置是使用0(最左边的列)


推荐阅读