首页 文章

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

提问于
浏览
2

我在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/screens/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 回答

  • 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
    

相关问题