我一直在松散地关注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());
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,从QAbstractListModel继承的类必须只定义roleNames(),因为它在Qt 5中被改为纯粹的虚函数.所以在他的例子中,我只是setRoleNames(m_prototype->roleNames());在构造函数中注释掉,一切都应该有效.对?
但是,当通过QML访问时,所有定义的角色都是未定义的.我可以用这个来检查C++中的名字:
QHash<int, QByteArray> mynames = model->find("Elephant")->roleNames();
qDebug() << "Model: " << mynames;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Elephant对象的角色名称按预期打印.
我的假设是否正确,或者我是否需要做其他事情才能使QAbstractListModel对象与QML2共享列表元素属性?这似乎是一个愚蠢的问题,但Qt5文档现在已经破了,我无法弄明白.
谢谢!
您需要重新实现QAbstractListModel::roleNames() const方法,并且您的角色会自动在QML中注册.
在examples/quick/modelviews/abstractitemmodel中有一个将基于QAbstractListModel的模型暴露给QML的工作示例.
您还可以考虑使用QQmlListProperty.