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

时间:2014-06-07 10:36:37

标签: c++ qt oop model qt5

我有一个clicked()-signal,它知道一个类型为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();
}

但这不起作用。为什么这么难。我在这里想念什么?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

投下它:

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

答案 2 :(得分:1)

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

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

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

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

上面说:

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

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