如何从QTreeView中的项目获取索引
How to get the Index from an Item in the QTreeView
我的Qt应用程序是基于Qt中的EditableTreeModel
示例构建的。在TreeModel
类中,有一个名为getItem()
的函数,它将QModelIndex
作为参数并返回TreeItem
。
对于我的应用程序,我需要相反的函数:从TreeItem
获取QModelIndex
。这应该独立于视图。这意味着我不能使用函数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
是一个受保护的函数,因此您必须向TreeModel
添加一个新的成员函数,该函数将为您创建QModelIndex
。
为了计算给定TreeItem
的行,有一个成员函数childNumber
,它在其父级的子级列表(即:其行)中返回其索引
不幸的是,对于给定的TreeItem
,无法计算列,因为TreeItem
包含其列的所有数据,因此包含所有列。因此,一个合理的默认值是使用0
(最左边的列)
您可以构建从TreeItem
到QModelIndex
的映射,如下所示:
void buildMap(const QModelIndex &index, const QAbstractItemModel *model, QMap<TreeItem *, QModelIndex> &itemMap)
{
if( !index.isValid() )
return;
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
itemMap.insert( item, index );
int rows = model->rowCount(index);
int cols = model->columnCount(index);
for (int i = 0; i < rows; ++i)
for (int j = 0; j < cols; ++j){
QModelIndex idChild = model->index(i, j, index);
buildMap( idChild , model, itemMap );
}
}
函数buildMap应用作:
QMap<TreeItem *, QModelIndex> itemMap;
TreeModel *model = static_cast<TreeModel *>(view->model());
for (int row = 0; row < model->rowCount(); ++row){
buildMap( model->index(row,0), model, itemMap );
}
qDebug() << "Item map count : " << itemMap.count();
foreach( TreeItem * item, itemMap.keys( )){
qDebug() << "item " << item << " -> " << itemMap[ item ];
}
输出:
Item map count : 35
item 0xbe1fe8 -> QModelIndex(1,1,0xbe1fe8,TreeModel(0x4421390))
item 0xbe2020 -> QModelIndex(2,1,0xbe2020,TreeModel(0x4421390))
item 0xbe22f8 -> QModelIndex(3,1,0xbe22f8,TreeModel(0x4421390))
item 0xbe2330 -> QModelIndex(2,0,0xbe2330,TreeModel(0x4421390))
...
相关文章:
- 如何在我的项目中从 CMAKE 中的同一项目获取多个库
- 如何自动获取我的项目的路径并删除一些文件
- 有没有一种简单的方法可以在C++中获取特定索引之后向量中的所有项目?
- 获取位于安卓工作室中可绘制的图像的绝对路径,用于NDK项目
- 如何从安卓、高通设备获取射频/NV项目?
- 从 boost::variant 中逐个索引获取项目,就像使用 std::variant 一样
- Qt - 在QGraphicScene中拖放时如何从项目中获取文本?
- 如何获取cmake工具链文件中的项目根目录,这可能吗
- 如何使用QList<QStandardItem *>获取列中的所有项目?
- 通过查找一对项目的代码获取错误的输出,在给定的总和相等的给定列表中列表
- 当我在子菜单MFC中按项目时如何获取事件
- 如何从unordered_set获取单个项目
- 无法通过 QModelIndex 从 QTreeView 获取项目
- 从 Freeglut/Opengl 2.1 项目中获取返回值
- 如何获取外部项目定义的目标的输出路径?
- C Winapi ListBox使用lb_getsel/lb_getCursel获取所选项目
- 如何从QTreeView中的项目获取索引
- 如何从C 代码获取项目名称
- 欧拉项目 #3 获取数字的最大质因数
- 无法从freeGlut项目获取stdoutput