我有基于QAbstractListModel的模型......
class RecordModel : public QAbstractListModel { ... };
QQmlContext *ctxt = engine.rootContext();
ctxt->setContextProperty("recordModel", &model);
// QML
recordModel.get(0).name // now work
如何按索引和角色名称获取模型数据?
... 解决方案:
// C++
class RecordModel : public QAbstractListModel
{
Q_OBJECT
Q_ENUMS(Roles)
public:
// ...
Q_INVOKABLE QVariant data(int i, int role) const
{
return data(index(i, 0), role);
}
};
// QML
recordModel.data(0, RecordModel.NameRole);
答案 0 :(得分:1)
您可以使用Q_INVOKABLE方法:
Q_INVOKABLE QVariant getRecord(int iIndex)
{
return QVariant::fromValue<CRecord*>((CRecord*)this->at(iIndex));
}
然后在QML中:
recordModel.getRecord(0)
您只需要声明元类型:
Q_DECLARE_METATYPE( RecordModel* )
在main.cpp的某处:
qmlRegisterType<RecordModel>("PrivateComponents", 1, 0, "RecordModel");
qmlRegisterType<CRecord>("PrivateComponents", 1, 0, "CRecord");
答案 1 :(得分:1)
您应该只对您希望能够从QML调用的特定功能使用Q_INVOKABLE方法。除非您以某种方式想要访问模型数据而无法访问模型的委托,否则应始终使用更合适的模型&lt; - &gt;委托获取数据的方式。
由于您继承自QAbstractListModel,它的工作方式与QAbstractItemModel类似。
如下所示声明角色:
enum Roles {
RoleA = Qt::UserRole + 1,
RoleB = Qt::UserRole + 2
};
重写此方法以允许使用角色进行QML访问:
QHash<int, QByteArray> RecordModel::roleNames() const
{
QHash<int, QByteArray> roles;
roles[RoleA] = _Ut("roleA");
roles[RoleB] = _Ut("roleB");
return roles;
}
当QML尝试访问时,重写此方法以返回数据:
QVariant RecordModel::data(const QModelIndex &modelIndex, int role) const
{
QVariant rv;
int index = modelIndex.row();
switch( role ) {
case RoleA:
rv = "A";
break;
case RoleB:
rv = "B";
break;
default:
DASSERT(FALSE); // Unexpected role.
break;
}
return rv;
}
然后在QML中,您只需在使用此模型访问数据的QML元素的委托中使用“roleA”和“roleB”。
参考文献:
http://qt-project.org/doc/qt-5.0/qtcore/qabstractitemmodel.html
http://qt-project.org/doc/qt-5.0/qtcore/qabstractlistmodel.html