c++ - 如何从 QTreeView 中的项目中获取索引
问题描述
我的 Qt-Application 是基于EditableTreeModel
Qt 的示例构建的。在TreeModel
该类中有一个被调用的函数getItem()
,它以QModelIndex
为参数并返回一个TreeItem
。
对于我的应用程序,我需要反向功能:QModelIndex
从TreeItem
. 这应该独立于视图。这意味着我不能使用该功能QTreeView::currentIndex()
。
我的问题有什么好的解决方案吗?
解决方案
您需要调用QAbstractItemModel::createIndex
传入正确的row
,column
以及项目本身。
以下应该有效:
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
(最左边的列)
推荐阅读
- azure-stream-analytics - Azure 流分析 - 从当前开始 x 分钟后首先
- javascript - 无法解构“未定义”或“空”的属性“obj1”
- jquery - 带有jquery ui可拖动的无限可拖动元素
- javascript - 带有特定灯光三个js的灯光网格
- python - Django ORM:使用 F、MAX 和 GROUP BY 的组合
- python - 将对象分配给 django 中的特定用户?
- elasticsearch - Elasticsearch 改进滚动
- tcl - 自动显示TK标签中的TCL子字段
- excel - 如果单元格包含字符串,则VBA复制单元格
- node.js - 如何为首次构建电子设置 package.json