QML StackView如何推送在单独文件中定义的组件?

时间:2017-09-04 09:29:28

标签: qt qml

我在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实例的正确方法是什么?

1 个答案:

答案 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