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

标签 c++ qt qml qt5

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

我已经删除了很多无关的细节(例如,CustomContainer 被插入 StackViews 或从 StackViews 弹出),但以下代码有望说明我正在尝试做的事情......基本上,我想要带有 foo = 10 和 bar = 10 的 CustomControl 矩形,但它似乎加载了默认值。将有多个“自定义控件”类型和多个“自定义容器”对象,因此我需要能够通用地支持它。

Qt 文档讨论了 creation contexts ,我认为这是我的问题,但我不确定如何解决这个问题。我更喜欢纯粹的 QML 解决方案,但如果这是解决方案所在,C++ 也可以。

主.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 } )

自定义控件.qml:

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

自定义容器.qml:

Item {
    property Component loaderSource

    onLoaderSourceChanged: {
        myLoader.sourceComponent = loaderSource
    }

    Loader {
        id: myLoader

        onSourceComponentChanged: {
            doStuff()
        }
    }
}

最佳答案

组件不“包含对象”。组件是要实例化的对象的原型(prototype)。将其视为“类型”或 classstruct在 C++ 中与该类型的实例。

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

此外,一个 Loader将为您自动动态实例化。因此,您不需要将手动和自动结合起来,要么手动完成,要么让装载机完成。

最后但同样重要的是,当组件被 StackView 实例化时他们会自动填充它并且它们的大小会绑定(bind)到它,所以它会自动更改为 StackView尺寸变化。所以只需使用 Item并将您的内容放在那里并对其进行布局。只有根项的大小将绑定(bind)到 StackView大小,它的子项目将有自己的大小。

关于c++ - QML:如何将动态创建的组件与自定义的内部对象一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29237247/

相关文章:

c++ - 根据密码中的字符数用 x 替换字符串中的密码

c++ - 带智能指针的多态性

qt - 如何在 Qt VirtualKeyboard 中捕获隐藏按键事件

qt - QWidget onMinimize() onMaximize() 信号

c++ - window ,C++ : send file to exe (c++ solution) and read data from sent file

c++ - 多态性 c++,试图访问从抽象基类派生的类的成员函数

c++ - Qt jom.exe错误2

c++ - 从 C++ 实例化 QML

c++ - 在 C++ 中模拟按键以在虚拟键盘的 QML 中使用

qt - 如何有效地将单个对象的多个 C++ 数据成员公开给 QML?