在 Qt 5.0 中向 QML 公开 QAbstractListModel 元素属性

Posted

技术标签:

【中文标题】在 Qt 5.0 中向 QML 公开 QAbstractListModel 元素属性【英文标题】:Expose QAbstractListModel element properties to QML in Qt 5.0 【发布时间】:2012-12-25 14:17:33 【问题描述】:

我一直松散地关注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 中已更改为纯虚函数。所以在他的示例中,我只是将 setRoleNames(m_prototype->roleNames()); 注释掉构造函数,一切都应该工作。对吧?

但是,当通过 QML 访问时,所有已定义的角色都是未定义的。我可以用这个检查 C++ 中的名称:

QHash<int, QByteArray> mynames = model->find("Elephant")->roleNames();
qDebug() << "Model: " << mynames;

在这种情况下,Elephant 对象的角色名称按预期打印。

我的假设是否正确,或者我是否需要做其他事情来获取 QAbstractListModel 对象以与 QML2 共享列表元素属性?这似乎是一个愚蠢的问题,但是 Qt5 文档现在已经很糟糕了,我想不通。

谢谢!

【问题讨论】:

对于想知道如何实现这一点的人,github.com/jdahlbom/QtQmlListModel。归功于 jdahlbom。 【参考方案1】:

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

examples/quick/modelviews/abstractitemmodel 中有一个将基于 QAbstractListModel 的模型暴露给 QML 的工作示例。

您也可以考虑使用QQmlListProperty。

【讨论】:

我很难理解如何使 QQmlListProperty 适合我的情况。有没有像样的文档或示例可用? @jmbeck 我今天测试了基于 QAbstractListModel 的代码,它运行良好。我根据这个更新了我的答案。 好的,这就是我所做的:Dumez 的代码使用一个 ListModel 类,您可以使用它来继承您自己的模型。问题是 roleName() 函数没有实现;它依靠setRoleNames() 来注册原型的名称。为了解决这个问题,我简单地将 roleNames() 函数添加到 ListModel 类并调用 return m_prototype-&gt;roleNames(); 以返回正确的角色名称。一切都按预期工作。再次感谢@trollixx,您的回答确实帮助我缩小了问题范围。

以上是关于在 Qt 5.0 中向 QML 公开 QAbstractListModel 元素属性的主要内容,如果未能解决你的问题,请参考以下文章

无法在 QML 中播放视频

模型中的 Qt 模型?

为啥 Qt 框架不是很流行

QML-如何在 ui.qml 中向 onClick 添加另一个命令?

QML 中的全局图像资源

从 QML 生成 KeyEvent