页面之间的信号

Signals between pages

我正在尝试在 2 个 QML 页面之间进行通信。 在我的页面 Main.qml 中,我收到了来自我的 C++ 代码的信号。收到此信号后,我希望 InputPage.qml 上的文字发生变化。此页面使用 LoaderMain.qml 中显示。到目前为止我能找到的唯一方法是在两页之间设置另一个信号。但是,我认为有一种更简单的方法可以做到这一点。我已经尝试过这种方式,但无法正常工作。所以在我继续之前,我想知道这是否是正确的方法。

关于如何执行此操作的任何想法,以及上述方法是否正确?

我的代码:

Main.qml

Item {
    id: screen_InputPage
    width: 1920
    height: 930
    anchors.left: parent.left
    anchors.leftMargin: 0
    anchors.top: parent.top
    anchors.topMargin: 100
    visible: false
    opacity: 1
    Loader {//Loads the pages
        id: pageLoader_ID2
        source: "inputPage.qml"
    }
}

我想访问 inputPage.qml

上的文本(可能还有函数)
Text {
    id: text_volume_perc_ID1
    height: 48
    text: qsTr("50")
    anchors.right: parent.right
    anchors.rightMargin: 0
    verticalAlignment: Text.AlignVCenter
    horizontalAlignment: Text.AlignHCenter
    anchors.top: parent.top
    anchors.topMargin: 126
    anchors.left: parent.left
    anchors.leftMargin: 0
    font.pixelSize: 42
}

要访问创建的对象,可以使用

idLoader.item.idInputpage.idText.text

我建议您动态加载对象以提高性能。为此,您可以创建自己的 CustomLoader.qml:

CustomLoader.qml

import QtQuick 2.0

Item {
    id: idRoot
    width: childrenRect.width
    height: childrenRect.height

    property Item createdObject
    property string source

    function fnSourceChange() {
        if (""!== source){
            var component
            // create component
            component = Qt.createComponent(source)
            if (Component.Ready === component.status) {
                createdObject= component.createObject(idRoot)
                if(!createdObject)
                    console.log("Loader::Could not create the object ")
            }
            else {
                console.log("Loader::Could not create panel", component.errorString(), "component has errors")
            }
        }
        else {
            createdObject.destroy();
            createdObject = null
            // unComment this line if you want to force the garbage collector
            //gc()
        }
    }

    onSourceChanged: {
        fnSourceChange()
    }
    // even without that it should detect the source change and create it
    // you can unComment this line if you want, but like that it will parse the function
    // two times one on the sourceChanged signal and on on in this handler
    // print the source or somthing in the function and you'll see
    // Component.onCompleted: fnSourceChange()

}

main.qml

import QtQuick 2.0

Item {
    id: screen_InputPage
    width: 1920
    height: 930
    anchors.left: parent.left
    anchors.leftMargin: 0
    anchors.top: parent.top
    anchors.topMargin: 100
    visible: false
    opacity: 1

    CustomLoader{
        id: pageLoader_ID2
        source: "inputPage.qml"
    }
}

InputPage.qml

import QtQuick 2.0

Item {
    width: 800
    height: 480
    property alias text: idText.text
    property alias label: idText
    property alias rect: idRect
    Text{
        id: idText
    }

    Rectangle{
        id: idRect
        width: 100
        height: 200
    }
}

在你的主要添加:

//or another scope like click button
Component.onCompleted: {

    pageLoader_ID2.createdObject.text = "hello"
    pageLoader_ID2.createdObject.rect.color = "red"
}