你如何将数据从 main.qml 传递到 main.py 然后将它发送到其他 qml 文件

How do you pass data from main.qml to main.py then send it to other qml files

我想将数据从文本字段发送到后端,即 main.py 文件。然后,一个函数将通过添加文本字段中的输入内容来连接字符串“Welcome”。然后,该字符串将显示在标签中,该标签可通过主页上的堆栈推送在第三个文件中找到。连接后端和前端后,我的程序只显示欢迎而不显示文本字段输入

main.qml

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15

Window {
    width: 640
    height: 480
    visible: true
    color: "#00000000"
    title: qsTr("Hello World")

    Rectangle {
        id: rectangle
        color: "#ffffff"
        anchors.fill: parent

        StackView {
            id: stackView
            anchors.left: parent.left
            anchors.right: parent.right
            anchors.top: parent.top
            anchors.bottom: button.top
            anchors.rightMargin: 10
            anchors.leftMargin: 10
            anchors.bottomMargin: 5
            anchors.topMargin: 5
        }

        Button {
            id: button
            x: 368
            y: 396
            text: qsTr("Button")
            anchors.right: parent.right
            anchors.bottom: parent.bottom
            anchors.rightMargin: 10
            anchors.bottomMargin: 5
            onClicked: stackView.push("home.qml")
            onPressed: {
                backend.welcomeText(txtName.text)
            }
        }

        TextField {
            id: txtName
            x: 92
            y: 436
            placeholderText: qsTr("Text Field")
        }
    }

    Connections {
        target: backend

        function onGetName(name){
            welcomeLabel.text = name
        }
    }
}

/*##^##
Designer {
    D{i:0;formeditorZoom:0.75}D{i:2}D{i:1}
}
##^##*/

home.qml

import QtQuick 2.0
import QtQuick.Controls 2.15

Item {
    Rectangle {
        id: rectangle
        color: "#262626"
        anchors.fill: parent

        Label {
            id: welcomeLabel
            x: 251
            y: 204
            width: 251
            height: 82
            color: "#e9eaeb"
            text: qsTr("Welcome")
            horizontalAlignment: Text.AlignHCenter
            verticalAlignment: Text.AlignVCenter
        }
    }

}

main.py

import sys
import os

from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine
from PySide2.QtCore import QObject, Slot, Signal

class MainWindow(QObject):
    def __init__(self):
        QObject.__init__(self)

    #getName
    getName = Signal(str)

    @Slot(str)
    def welcomeText(self, name):
        self.getName.emit("Welcome " + name)


if __name__ == "__main__":
    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine()

    main = MainWindow()
    engine.rootContext().setContextProperty("backend", main)
    engine.load(os.path.join(os.path.dirname(__file__), "main.qml"))

    if not engine.rootObjects():
        sys.exit(-1)
    sys.exit(app.exec_())

主要问题是welcomeLabel的作用域只有“home.qml”,所以在main.qml中没有定义。

由于“后端”是一个上下文属性,它具有全局范围(类似于全局变量),因此您必须在 home.qml 中连接“getName”信号。但问题是您在页面加载之前发出信号,因此连接无法正常工作,在这种情况下,解决方案是先加载然后调用插槽。

您实际案例的解决方案:

  1. 将“连接”代码从 main.qml 移动到 home.qml

  2. 并更改(删除pressed):

onClicked: {
    stackView.push("home.qml")
    backend.welcomeText(txtName.text)
}