3

我想将信号从一个 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 
         ^ 

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

4

3 回答 3

3

我得到了我的问题的答案。我不知道这是否正确,但是通过这样做,我的代码正在运行,我只是将 onsigLogin 移到了欢迎块中,如下所示

Welcome{id:welcomePage
    width:parent.width
    height:parent.height
    visible:true
    onSigLogin: {
        visible=false
        login.visible=true
    }
} 
于 2013-01-04T06:56:19.733 回答
2

简单的答案是您使用Connections错误。从文档中

目标:对象

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

如果未设置此属性,则目标默认为 Connection 的父级。

如果设置为 null,则不建立连接并且忽略任何信号处理程序,直到目标不为 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是产生信号的那个。

于 2017-05-03T23:39:54.557 回答
1

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

当您忘记命令式代码时,像 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 可以自动做出反应。这使得组件可重用并避免到处乱分配sagetti 属性。QML 危险地太简单了。

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

于 2015-12-09T02:29:35.100 回答