我在Qt 5.9中遇到了Qt Quick 2.1的一些困难。具体来说,我正在努力使StackView QML组件完成我需要它做的事情。我正在尝试使用属性来推送在单独的QML文件中定义的项目,这里是对我所做的事情的描述。
QML / main.qml
它包含保存屏幕的StackView QML组件。 initialItem正确显示OverView屏幕,因此您可以说这基本上按预期工作。
// import ...
import "screens"
StackView {
id: mainView
initialItem: OverviewScreen {}
}
QML /画面/ OverviewScreen.qml
这是OverView屏幕,其中包含一个GridView。单击GridView的委托时,我想初始化一个ItemDetailScreen实例,并在GridView委托上附加属性“Id”,这是附加模型的一个角色。
// import ...
import "screens"
Item {
// ...
GridView {
// model: ...
delegate: Item {
// ...
MouseArea {
anchors.fill: parent
onClicked: {
mainView.push({item: ItemDetailScreen, parameters: {id: Id}}) // ERROR
}
}
}
}
}
qml/screens/ItemDetailScreen.qml
它包含各种QML组件,但它遵循熟悉的模式,Item作为根组件。
// import ...
Item {
// ...
}
问题是当执行GridView委托的onClicked处理程序时,我会在屏幕上打印一个错误,引用ItemDetailScreen被推送到mainView的行。
如果我向OverviewScreen添加一个组件属性,如下所示:property Component detailScreen: ItemDetailScreen {}
,然后将推送更改为mainView.push(detailScreen)
,然后推送成功,我看到屏幕,但是我仍然无法通过任何属性,因为mainView.push({item: detailScreen, properties: {id: Id}})
也会因错误而失败。
所以我的问题是这样的:推送具有属性的ItemDetailScreen实例的正确方法是什么?
答案 0 :(得分:3)
您必须创建一个对象实例:
mainView.push(Qt.createComponent("qml/screens/ItemDetailScreen.qml").createObject())
id
不是常规属性,您不能按照您尝试的方式设置它,它必须在QML源中预定义,您只能设置常规属性:
Qt.createComponent("qml/screens/ItemDetailScreen.qml").createObject(parentItem, {"width" : 50, "height" : 50})
指定属性的另一种方法是使用Component
:
Component {
id: iComp
ItemDetailScreen { width: 50; height: 50 } // specify property bindings
}
...
iComp.createObject(parentItem) // create an instance of the component