我正在尝试做一些类似于Using C++ Models with Qt Quick Views的事情。具体地说,我希望QObject-derived instances
的QList
在QML ListView
中渲染。
如果我完全按照例子来做,它就能工作。
但是,如果我试图通过设置为context的自定义Session对象来获取模型,就会遇到问题。
具体来说,会话代码如下所示:
class Session : public QObject
{
Q_OBJECT
typedef QVariant result_type;
Q_PROPERTY(result_type items READ items NOTIFY itemsChanged)
...
};
它的每个项都是一个DataObject
,它具有name属性
然后我们实际上做了一个:
ListView {
model: session.items
delegate: Rectangle {
required property string name
}
}
在main中:
Session session;
QQmlContext* context = engine.rootContext();
context->setContextProperty("session", &session);
...
QList<QObject*> dataList;
session.setItems(dataList);
一切都产生一个:
Required property was not initialized
尽管验证了session.items
中存在内容。我将这种Session对象用于其他QML对象,而不会发生意外。
我做错了什么?
编辑:
正如在评论中提到的,人们可以通过modelData
获取属性,这是一个功能性的解决方案,但最初的问题仍然存在。
我没有把QML放在这里,因为它有点大,但这里是它当前形式https://gist.github.com/malachib/ac05c535fd11c5d4961feade307d9102的要点
1条答案
按热度按时间oprakyz71#
正如文档所述:
必需属性在模型-视图-委托代码中扮演特殊角色:**如果视图的委托具有名称与视图模型的角色名称匹配的必需属性,则这些属性将使用模型的相应值进行初始化。**有关更多信息,请访问Qt Quick中的模型和视图页面。
简而言之,如果你有
QList<Object*>
类型的自定义列表,其中QObject
是你的对象派生的自定义类(而不是QAbstractItemModel派生的),委托中定义的必需属性将不会用你的custom class
属性的默认值初始化(在定义它们时也不能直接设置它们的值)。