在Qt 5.0中将QAbstractListModel元素属性暴露给QML

Expose QAbstractListModel element properties to QML in Qt 5.0

本文关键字:属性 暴露 QML 元素 QAbstractListModel Qt 中将      更新时间:2023-10-16

我一直在遵循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。