如何从QTreeView中的项目获取索引

How to get the Index from an Item in the QTreeView

本文关键字:项目 获取 索引 QTreeView      更新时间:2023-10-16

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

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

有什么好办法解决我的问题吗?

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

以下操作应该有效:

QModelIndex TreeModel::indexForTreeItem(TreeItem* item)
{
return createIndex(item->childNumber(), 0, item);
}

我是如何做到这一点的解释:

createIndex还采用void*数据指针,该数据指针在EditableTreeModelTreeModel示例代码中是指向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(最左边的列)

您可以构建从TreeItemQModelIndex的映射,如下所示:

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))
...