您应该仅将 Q_INVOKABLE 方法用于您希望能够从 QML 调用的特定功能。除非您想在无法访问的情况下访问模型数据delegate对于您的模型,您应该始终使用更合适的模型委托方式来获取数据。
由于您继承自 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/qabstractitemmodel.html
http://qt-project.org/doc/qt-5.0/qtcore/qabstractlistmodel.html http://qt-project.org/doc/qt-5.0/qtcore/qabstractlistmodel.html