ObjectList/Repeater的QML DefaultProperty

mic*_*oo8 5 c++ qt qml

我正在使用我自己的小部件从c ++扩展QML,DefaultPropertyQQmlListProperty,就像这里一样.

这样我就可以写了

Parent {    
    Child { prop: "ch1" }
    Child { prop: "ch2" }
    Child { prop: "ch3" }
}
Run Code Online (Sandbox Code Playgroud)

Child对象追加到QQmlListProperty类型的成员属性.

但是当我想使用这样的Repeater:

Parent {
    Repeater {
        model: ["ch1","ch2","ch3"]
        delegate: Child {
            prop: modelData
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后运行时给了我一个错误: Cannot assign object to list property "childObjects"

如何设置Repeater的Parent对象的list属性?

编辑:我发现,Repeater继承Item并且只能重复项目.但是我的Child对象继承了QObject.所以我必须创建一个Repeaterfor QObjects.但那不是问题.Item对象如何有一个手动编写的子项,还有一个Repeater孩子给了他很多孩子?

Ari*_* M. 0

使用 QObjectList 模型

你说你Child是 QObjects,那么你可以使用 QObjectList不是你的构造。使用类似于以下内容的内容公开列表:

class Parent : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QList<QObject*> elements READ ...  WRITE ... NOTIFY ...)
}

class Child : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString something READ ...  WRITE ... NOTIFY ...)
    Q_PROPERTY(int     myValue   READ ...  WRITE ... NOTIFY ...)
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后,您使用elements的属性Parent作为中继器的模型,它将可以访问子元素的所有属性 (Q_PROPERTIES)。

Parent {
    id: main
}
Repeater {
    model: main.elements
    delegate: Whatever { // will create one for each element
        prop: something
        prop2: myValue
    }
 }
Run Code Online (Sandbox Code Playgroud)