C++ 在Qt5.0中将QAbstractListModel元素属性公开给QML

C++ 在Qt5.0中将QAbstractListModel元素属性公开给QML,c++,qml,qt5,C++,Qml,Qt5,我一直在松散地关注这篇文章,以获得一个定制的QAbstractListModel类,将数据公开给QML(QtQuick2)接口(QtQuick2ApplicationViewer)。然而,由于我使用的是Qt5.0.0(和MSVC2012),他的文章中有些部分不适用。例如,ListModel构造函数不再需要调用setRoleNames(),因为setRoleNames()在Qt5中已贬值 ListModel::ListModel(ListItem* prototype, QObject *pare

我一直在松散地关注这篇文章,以获得一个定制的QAbstractListModel类,将数据公开给QML(QtQuick2)接口(QtQuick2ApplicationViewer)。然而,由于我使用的是Qt5.0.0(和MSVC2012),他的文章中有些部分不适用。例如,ListModel构造函数不再需要调用
setRoleNames()
,因为
setRoleNames()
在Qt5中已贬值

ListModel::ListModel(ListItem* prototype, QObject *parent) :
    QAbstractListModel(parent), m_prototype(prototype)
{
  setRoleNames(m_prototype->roleNames());
}
我的理解是,继承自QAbstractListModel的类必须只定义
roleNames()
,因为它在Qt5中已更改为纯虚拟函数。所以在他的例子中,我只是注释掉
setRoleNames(m_prototype->roleNames())在构造函数中,一切都应该正常。对吧?

但是,当通过QML访问时,所有已定义的角色都是未定义的。我可以用C++来检查C++中的名称:< /P>
QHash<int, QByteArray> mynames = model->find("Elephant")->roleNames();
qDebug() << "Model: " << mynames;
QHash mynames=model->find(“大象”)->roleNames();

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

在examples/quick/modelviews/abstractitemmodel中有一个向QML公开基于QAbstractListModel的模型的工作示例


也可以考虑使用. 我很难理解如何使QQmlListProperty适合我的情况。还有什么像样的文档或示例可用吗?@jmbeck我今天测试了基于QAbstractListModel的代码,效果很好。我根据这个更新了我的答案。好吧,下面是我所做的:Dumez的代码使用了一个ListModel类,您可以使用它来为自己的模型子类化。问题是没有实现

roleName()
函数;它依赖于
setRoleNames()
来注册原型的名称。为了修复它,我只需将
roleNames()
函数添加到ListModel类中,并调用
return m_prototype->roleNames()
返回正确的角色名称。一切正常。再次感谢@trollixx,你的回答真的帮助我缩小了问题的范围。对于想知道如何实现这一点的人,。这要归功于jdahlbom。