QML模型数据按索引

时间:2013-12-05 11:21:03

标签: c++ qml qt5

我有基于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);

2 个答案:

答案 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