我的 Qt 应用程序是基于EditableTreeModel
Qt 的示例构建的。在TreeModel
类中,有一个名为的函数getItem()
,它接受QModelIndex
作为参数并返回 a TreeItem
。
对于我的应用程序,我需要相反的功能:QModelIndex
从TreeItem
. 这应该独立于视图。这意味着我无法使用该功能QTreeView::currentIndex()
。
我的问题有什么好的解决办法吗?
您需要调用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
(最左边的列)