【问题标题】:how to pass signals and creating connection in QML如何在 QML 中传递信号和创建连接
【发布时间】:2013-01-04 06:41:01
【问题描述】:

我想将信号从一个 qml 文件传递​​到另一个 qml 文件。这样当它收到信号时,我可以使另一个文件可见 这是我的 main.qml

import QtQuick 1.1

Rectangle{
    id:main
    width:480
    height:272
    gradient: Gradient {
        GradientStop { position: 0.0; color: "light blue" }
        GradientStop { position: 1.0; color: "blue" }
    }
    Welcome{
        id:welcomePage
        width:parent.width
        height:parent.height
        visible:true
    }
    LoginPage{
        id:login
        width:parent.width
        height:parent.height
        visible:false
    }
    Connections{
        ignoreUnknownSignals: true
        onsigLogin:{welcomePage.visible=false
            login.visible=true
        }

    }

}

这里是我的welcome.qml

import QtQuick 1.1

Rectangle{
    id:welcome
    width:480
    height:272
    signal sigLogin()

    gradient: Gradient {
        GradientStop { position: 0.0; color: "light blue" }
        GradientStop { position: 1.0; color: "blue" }
    }
    Text{
        text:"\n\t\tPRESS ENTER"
        font.bold:true
        font.pointSize: 17
    }
    Button {
        id: wel
        height:30;
        x:parent.width/2-30
        y:parent.height/2-30
        focus:true
        border.color:"black"
        opacity: activeFocus ? 1.0 : 0.5
        Text{
        text:"WELCOME"
            anchors.horizontalCenter:wel.horizontalCenter;
            anchors.verticalCenter:wel.verticalCenter;
        }
        Keys.onReturnPressed: {
            wel.focus=false
            welcome.sigLogin()
        }
    }
}

当我运行它时,我得到以下错误

file:///home/sakshi/try1/main.qml:24:9: Cannot assign to non-existent property    "onsigLogin" 
         onsigLogin:{welcomePage.visible=false 
         ^ 

谁能建议我如何从一个文件传递信号以及如何进行更改 我什么时候收到信号?

【问题讨论】:

    标签: qt qml


    【解决方案1】:

    我得到了我的问题的答案。我不知道这是否正确,但通过这样做我的代码正在工作 我刚刚将 onsigLogin 移到了欢迎块内 像这样的

    Welcome{id:welcomePage
        width:parent.width
        height:parent.height
        visible:true
        onSigLogin: {
            visible=false
            login.visible=true
        }
    } 
    

    【讨论】:

    • 你在这里做的是正确的。您可以在 Welcome 组件的实例中处理信号。另一方面,如果您使用 Connections 元素,则需要指定该连接的目标。在这种情况下应该是welcomePage。
    【解决方案2】:

    简单的答案是您使用 Connections 错误。来自the documentation

    目标:对象

    此属性保存发送信号的对象。

    如果未设置此属性,目标默认为 连接。

    如果设置为 null,则不建立任何连接,并且任何信号处理程序都会 在目标不为空之前被忽略。

    因此,在您的情况下,目标默认为 main,因为它是 Connections 对象的父级。只需像这样修改您的代码:

    Connections {
        target: welcomePage  // this is the critical part!
        ignoreUnknownSignals: true
        onSigLogin: {  // note capitalization of on*S*igLogin
            welcomePage.visible = false
            login.visible = true
        }
    }
    

    足以让它按预期工作,因为welcomePage 是产生信号的那个。

    【讨论】:

      【解决方案3】:

      不要调用其他对象、发出信号或绑定

      当您忘记命令式代码时,像 QML 这样的声明性语言非常有用。将此模式用于您需要的任何元素:

      ElementOne{
          id: first
          width:parent.width
          height:parent.height
          visible: !second.loggedIn // <- Beautiful binding
      }
      ElementTwo{
          id: second
          width:parent.width
          height:parent.height
          property bool loggedIn: false // Internal to the ElementTwo.qml
          visible: true
      }
      

      然后你的第二个元素可以改变它自己的loggedIn 属性,Welcome 可以自动做出反应。 这使得组件可重用,并避免到处分配 spagetti 属性。 QML 太简单了。

      您可以使用其他模式,例如States,但主要避免使用 QML 中的命令式代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多