c++ QML + QList〈QObject*>未在setContextProperty中选取

elcex8rz  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(133)

我正在尝试做一些类似于Using C++ Models with Qt Quick Views的事情。具体地说,我希望QObject-derived instancesQListQML 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的要点

oprakyz7

oprakyz71#

正如文档所述:
必需属性在模型-视图-委托代码中扮演特殊角色:**如果视图的委托具有名称与视图模型的角色名称匹配的必需属性,则这些属性将使用模型的相应值进行初始化。**有关更多信息,请访问Qt Quick中的模型和视图页面。
简而言之,如果你有QList<Object*>类型的自定义列表,其中QObject是你的对象派生的自定义类(而不是QAbstractItemModel派生的),委托中定义的必需属性将不会用你的custom class属性的默认值初始化(在定义它们时也不能直接设置它们的值)。

相关问题