QML:如何将动态创建的组件与自定义的内部对象一起使用

QML: How to use a dynamically created component with a customized internal object?

本文关键字:自定义 内部对象 一起 组件 QML 动态 创建      更新时间:2023-10-16

我正在寻找一种动态创建组件和对象的方法,并使用组件。似乎大多数可用的示例,如Qt文档或其他StackOverflow帖子中的示例,都与使用createObject()返回的对象有关,而我希望使用包含(自定义)对象的组件。

我去掉了很多无关的细节(例如,CustomContainer被推到StackViews上/弹出),但下面的代码有望说明我要做的事情……基本上,我希望有一个foo=10和bar=10的CustomControl矩形,但它似乎是用默认值加载的。将有多个"自定义控件"类型和多个"定制容器"对象,所以我需要能够通用地支持这一点。

Qt文档讨论了创建上下文,我认为这是我的问题,但我不确定如何解决这个问题。我更喜欢纯QML解决方案,但如果C++就是解决方案的所在,那就可以了。

Main.qml:

CustomContainer {
    id: myCustomContainer
}
CustomContainer {
    id: myOtherCustomContainer
}
function addCustomControl( control, args ) {
    var newComponent = Qt.createComponent( control )
    var newObj = newComponent.createObject( myCustomContainer, args )
    return newComponent
}
myCustomContainer.loaderSource = addCustomControl( "CustomControl.qml", { "foo": 10, "bar": 10 } )
myOtherCustomContainer.loaderSource = addCustomControl( "CustomControl.qml", { "foo": 20, "bar": 20 } )

CustomControl.qml:

Rectangle {
    property int foo: 5
    property int bar: 5
}

CustomContainer.qml:

Item {
    property Component loaderSource
    onLoaderSourceChanged: {
        myLoader.sourceComponent = loaderSource
    }
    Loader {
        id: myLoader
        onSourceComponentChanged: {
            doStuff()
        }
    }
}

组件不"包含对象"。该组件是要实例化的对象的原型。把它想象成C++中的一个"类型"或classstruct,而不是该类型的实例。

您的代码创建组件,然后从中创建一个具有修改后的属性值的对象,但该组件仍然具有其默认属性,因此将其用作源组件将生成具有默认属性的对象。

此外,Loader将为您进行自动动态实例化。所以你不需要手动和自动结合,要么手动,要么让加载器来做

最后,但并非最不重要的是,当组件由StackView实例化时,它们将自动填充它,并且它们的大小将绑定到它,因此它将随着StackView大小的变化而自动更改。因此,只需使用Item,将您的内容放在其中并进行布局。只有根项目的大小将绑定到StackView大小,其子项目将有自己的大小。