我的Qt应用程序是基于Qt的EditableTreeModel示例构建的。在TreeModel类中,有一个称为getItem()的函数,该函数将QModelIndex作为参数并返回TreeItem

对于我的应用程序,我需要反向功能:从QModelIndex获取TreeItem。这应该独立于 View 。这意味着我不能使用函数QTreeView::currentIndex()

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

最佳答案

您需要调用 QAbstractItemModel::createIndex ,并传递正确的rowcolumn和iteself项。

以下应该起作用:

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是 protected 函数,因此您必须在TreeModel中添加新的成员函数,以便为您创建QModelIndex

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

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

10-08 07:54