как передавать сигналы и создавать соединение в QML

Я хочу передать сигнал из одного файла 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 
         ^ 

Может ли кто-нибудь предложить мне, как передать сигнал из одного файла и как внести изменения, когда я получу этот сигнал?


person geek    schedule 04.01.2013    source источник


Ответы (3)


я получил ответ на свой вопрос. я не знаю, правильно ли это, но, делая это, мой код работает, я просто переместил onsigLogin внутри блока приветствия, что-то вроде этого

Welcome{id:welcomePage
    width:parent.width
    height:parent.height
    visible:true
    onSigLogin: {
        visible=false
        login.visible=true
    }
} 
person geek    schedule 04.01.2013
comment
То, что вы делаете здесь, правильно. Вы можете обработать сигнал в экземпляре компонента Welcome. С другой стороны, если вы используете элемент Connections, вам нужно будет указать цель этого соединения. Что в данном случае было бы welcomePage. - person Ajith; 04.01.2013

Не вызывайте другие объекты, не подавайте сигналы и не привязывайтесь

Декларативные языки, такие как 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, и приветствие может автоматически отреагировать. Это делает компоненты повторно используемыми и позволяет избежать присвоения свойств спагетти повсюду. QML опасно слишком прост.

Можно использовать и другие шаблоны, например States, но в основном избегайте императивного кода в QML.

person Ariel M.    schedule 09.12.2015

Простой ответ заключается в том, что вы используете Connections неправильно. Из документации:

цель : Объект

Это свойство содержит объект, который отправляет сигнал.

Если это свойство не задано, целевой объект по умолчанию является родителем соединения.

Если установлено значение 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 генерирует сигнал.

person Jon McClung    schedule 03.05.2017