我一直在松散地关注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文档现在已经破了,我无法理解。
谢谢!
答案 0 :(得分:9)
您需要重新实现QAbstractListModel::roleNames() const
方法,并且您的角色会自动在QML中注册。
在examples / quick / modelviews / abstractitemmodel中有一个将基于QAbstractListModel的模型暴露给QML的工作示例。
您还可以考虑使用QQmlListProperty。