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专家的任何解释! 谢谢!
答案 0 :(得分:0)
你不能这样做导致createComponent只占用一个字符串,你应该使用createObject。 使用这个方法:
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)
}
}
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: