我的Qt应用程序是基于Qt的EditableTreeModel
示例构建的。在TreeModel
类中,有一个称为getItem()
的函数,该函数将QModelIndex
作为参数并返回TreeItem
。
对于我的应用程序,我需要反向功能:从QModelIndex
获取TreeItem
。这应该独立于 View 。这意味着我不能使用函数QTreeView::currentIndex()
。
我的问题有什么好的解决方案吗?
最佳答案
您需要调用 QAbstractItemModel::createIndex
,并传递正确的row
,column
和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
(最左侧的列)