如何从 QTreeView 中的项目获取索引

Chi*_*ief 7 c++ qt

我的 Qt 应用程序是基于EditableTreeModelQt 的示例构建的。在TreeModel类中,有一个名为的函数getItem(),它接受QModelIndex作为参数并返回 a TreeItem

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

我的问题有什么好的解决办法吗?

Ste*_*mer 5

您需要调用QAbstractItemModel::createIndex传递正确的row,column和项目本身。

以下应该有效:

QModelIndex TreeModel::indexForTreeItem(TreeItem* item)
{
    return createIndex(item->childNumber(), 0, item);
}
Run Code Online (Sandbox Code Playgroud)

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

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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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