我有一个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函数可能会使模型索引无效,并可能导致应用程序崩溃。
不幸的是,文档没有说明为什么可能会崩溃,以及不应该做什么。