在Qt 5.0中将QAbstractListModel元素属性公开给QML

时间:2012-12-25 14:17:33

标签: c++ qml qt5

我一直在松散地关注Christophe Dumez's blog上的文章,以获得一个自定义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中已被更改为纯虚函数。因此在他的示例中,我只是注释掉{{1在构造函数中,一切都应该工作。正确?

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

setRoleNames(m_prototype->roleNames());

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

我的假设是否正确,还是我需要做其他事情才能让QAbstractListModel对象与QML2共享列表元素属性?这似乎是一个愚蠢的问题,但Qt5文档现在已经破了,我无法理解。

谢谢!

1 个答案:

答案 0 :(得分:9)

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

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

您还可以考虑使用QQmlListProperty