如何使用QModelIndex访问QStandardItemModel及其数据?

How to access QStandardItemModel and it's data using a QModelIndex?

本文关键字:数据 QStandardItemModel 何使用 QModelIndex 访问      更新时间:2023-10-16

我有一个click()信号,它知道QModelIndex类型的选定索引。

void onListClicked(const QModelIndex & index) { /* ... */ }

不,我想访问所单击项的数据。我发现我可以使用model()访问模型:

void onListClicked(const QModelIndex & index)
{
    QStandardItemModel * model {index.model()};
}

但是这失败了,因为model() getter只允许我返回一个QAbstractItemModel。

error: invalid conversion from 'const QAbstractItemModel*' to 'QStandardItemModel*' [-fpermissive]

如何访问QStandardItemModel或者更好的选择QStandardItem?我的唯一标识符存储在QStandardItem::data()中。

我需要的是这样的东西:

void onListClicked(const QModelIndex & index)
{
    QStandardItemModel * model {index.model()};
    QStandardItem * item {model->itemFromIndex(index)};
    qDebug() << item->data().toString();
}

但这不起作用。为什么这么难呢?我在这里错过了什么?

我认为你可以直接从模型索引中获取数据:

void onListClicked(const QModelIndex & index) {
    index.data(Qt::UserRole + 1);
    // ...
}

您可以使用任何其他角色来检索不同类型的数据

直接转换:

QStandardItemModel *model { static_cast<QStandardItemModel *>(model()); }

我遇到了同样的问题,因为我需要检索我的特殊模型:

auto myModel=const_cast<MySpecialModel*>(dynamic_cast<const MySpecialModel*>(modelIndex.model()));

这对我来说是一个完美的解决方案。

但是,这样做似乎有一个重要的问题:

  • http://doc.qt.io/qt-5/qmodelindex.html

上面写着:

返回一个指向模型的const指针,因为调用模型的非const函数可能会使模型索引无效,并可能导致应用程序崩溃。

不幸的是,文档没有说明为什么可能会崩溃,以及不应该做什么。