从Module动态创建QML组件

时间:2015-08-17 23:23:09

标签: qt qml qtquick2 qt-quick

QML允许我们将应用程序很好地构建到模块中,然后在需要时将它们导入到我们的应用程序中。这是有道理的,特别是因为我们只需要使用命名空间而不是URI /路径。

但是,当我想动态创建QML组件时,我只能从URI /路径加载它。例如:

var myComponent = Qt.createComponent("./qml/Button/Button.qml");

对我来说,这似乎与Qt / QML使用命名空间而不是URI /路径的哲学相矛盾。

为什么无法执行以下操作:

import QtQuick 2.4
import com.MyCustomStuff 1.0   // <-- contains my custom Button

...

function createMyObj(){
    return Qt.createComponent(Button);
}

我非常感谢Qt专家的任何解释! 谢谢!

2 个答案:

答案 0 :(得分:0)

你不能这样做导致createComponent只占用一个字符串,你应该使用createObject。 使用这个方法:

ComponentCreator.qml

    import QtQuick 2.2

    Item {
        id:idRoot
        // take the component that you want to create
        property Component component
// reference to the created object, with that property you can 
// access all properties of the created component, like I am doing in the Component.onCompleted in my main.qml 
        property Item createdObject
        function createMyObj(component){
            createdObject = component.createObject(idRoot);
        }
        onComponentChanged:{
            createMyObj(component)
        }

    }

main.qml

import QtQuick 2.2
import QtQuick.Controls 1.2
Item {
    width:800
    height: 480
    ComponentCreator{
        id:idCompCreator
        component: Button{}
    }
Component.onCompleted: idCompCreator.createdObject.width = 100
}

答案 1 :(得分:0)

我从来没有尝试过,因为我过去常常使用你提到的基于路径的方法,而我现在还没有我的笔记本电脑进行测试,但我猜你可以使用{跟随其他方法{1}}如上所述,然后定义import之类的内容,从而将其与Component { id: myComponent; Button { } }一起使用。

从[文档] [1]中,myComponent.createObject确实是任何createObject的方法,所以它应该有效。

无论如何,使用Component的方法并不适合我,因为它与哲学相矛盾,因为通常我会使用Qt.createComponent字符串来完美地遵循该哲学,并且不会是吗?

让我知道如果它能解决问题,我会在晚上试一试,因为我整天都在远离笔记本电脑。

它是一个例子:

qrc: