3

我一直在松散地关注Christophe Dumez 博客上的文章,以获取自定义 QAbstractListModel 类,以将数据公开给 QML (QtQuick2) 接口 (QtQuick2ApplicationViewer)。但是,由于我使用的是 Qt 5.0.0(和 MSVC2012),因此他的文章中的某些部分不适用。例如,ListModel 构造函数不再需要调用setRoleNames(),因为setRoleNames()在 Qt 5 中已被贬低。

ListModel::ListModel(ListItem* prototype, QObject *parent) :
    QAbstractListModel(parent), m_prototype(prototype)
{
  setRoleNames(m_prototype->roleNames());
}

我的理解是,继承自 QAbstractListModel 的类只能定义roleNames(),因为它在 Qt 5 中已更改为纯虚函数。所以在他的示例中,我只是在构造函数中注释掉setRoleNames(m_prototype->roleNames());,一切都应该工作。正确的?

但是,当通过 QML 访问时,所有已定义的角色都是未定义的。我可以用这个检查 C++ 中的名称:

QHash<int, QByteArray> mynames = model->find("Elephant")->roleNames();
qDebug() << "Model: " << mynames;

在这种情况下,Elephant 对象的角色名称按预期打印。

我的假设是否正确,或者我是否需要做其他事情才能让 QAbstractListModel 对象与 QML2 共享列表元素属性?这似乎是一个愚蠢的问题,但是 Qt5 文档现在很糟糕,我想不通。

谢谢!

4

1 回答 1

9

您需要重新实现QAbstractListModel::roleNames() const方法,并且您的角色会自动在 QML 中注册。

在 examples/quick/modelviews/abstractitemmodel 中有一个将基于 QAbstractListModel 的模型暴露给 QML 的工作示例。

您还可以考虑使用QQmlListProperty

于 2012-12-25T14:25:58.463 回答