在Qt 5.0中将QAbstractListModel元素属性暴露给QML
Expose QAbstractListModel element properties to QML in Qt 5.0
我一直在遵循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文档现在是如此的破碎,我不能弄清楚它。
谢谢!
您需要重新实现QAbstractListModel::roleNames() const
方法,并且您的角色将自动在QML中注册。
有一个将基于qabstractlistmodel的模型暴露给QML的工作示例:examples/quick/modelviews/abstractitemmodel。
您还可以考虑使用QQmlListProperty。
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- C++概念:如何使用'concept'检查模板化结构的属性?
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 通过指向指针数组的指针访问子类的属性
- MSVC是否支持C++11样式的属性而不是__declspec
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 类的C++属性似乎已重新初始化
- Qt Quick-如何仅从c++代码与qml属性交互
- 用概念检查属性的类型
- C++如何将同一类的实例作为属性
- 按多个属性排序
- 主函数参数的属性
- "perf_event_attr"结构的"read_format"属性的选项到底是什么?
- C++删除未使用的类属性会导致 std::logic_error
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 使用内存地址访问结构的属性值
- C++调用具有 *this 属性的单个帮助程序函数
- C++ 在堆栈中包含多态属性的类对象存储
- C++ 命名参数习惯用语 - 未设置字符串属性
- 在Qt 5.0中将QAbstractListModel元素属性暴露给QML