我有一个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();
}
但这不起作用。为什么这么难。我在这里想念什么?
答案 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函数的调用可能会使模型索引无效,并可能导致应用程序崩溃。
不幸的是,文档没有说,为什么可能会发生崩溃以及不应该做的事情。