2012-02-29 13 views
10

¿Cómo puedo enviar la señal de un componente qml a otro?Cómo capturar una señal en QML?

A continuación se muestra un ejemplo:

Rectangle { 
    id: main 
    width: 360; height: 360 
    signal clicked() 

    Text { 
     id: testStr 
     anchors.centerIn: parent 
     text: "Hello World" 
    } 
    MouseArea { 
     id: mouseArea 
     anchors.fill: parent 
     onClicked: { Qt.quit(); } 
    } 

    Component.onCompleted: clicked() 
    onClicked: testStr.text = "Demo" 
} 

¿Cómo capturo la señal en otro componente?

Respuesta

13

Debe utilizar el método connect() de las señales de los componentes (las mismas señales son objetos).

function clickHandler() { 
    console.log('main clicked') 
} 
Component.onCompleted: { 
    main.clicked.connect(clickHandler) 
} 

Ver http://developer.qt.nokia.com/doc/qt-4.8/qmlevents.html

+1

Gracias. ¿Puede explicar que la señal (enXXXXX) solo se usa en sí misma, si quiere ser capturada en otra, use Connecet? –

+0

Sí, si declara una instancia de un componente en su archivo qml, puede asignar el código predefinido en la ranura Xxx de ese componente. Ya está conectado, solo le une una expresión. Si desea conectar una señal con la ranura de otra instancia o función, debe usar el método 'connect'. – sergk

+0

Ya veo, gracias por su ayuda .. –

9

En el otro objeto, simplemente agrega una palabra on seguida del nombre de la señal. EG:

Rectangle { 
    YourQmlObject { 
    onClicked: { ... } 
    } 
} 

(clic es un tanto un nombre de señal confusa porque es común, pero si hubiera llamado su señal orange, que haría que la unión onOrange:.)

+0

gracias por su ayuda. Si hay muchos 'YourQmlObject', ¿escribiré onClicked: {...} en cada componente? Hay otra manera? –

+0

Las señales se activarán, por lo que podría poner sus "porciones" en un único contenedor 'AllMyQmlObjects', que es una larga lista de objetos, y colocar el manejador' onClicked: 'en cualquier archivo que finalmente contenga' AllMyQmlObjects'. –

+0

¿Qué tal Connect? –

5

puede utilizar QML elemento de conexión

Connections { 
target: yourQmlObject 
onClicked: foo(...) 
} 
0

QML

Button{ 
    id: btn_add_pq 
    text: "Add" 
    onClicked: { 
    var component = Qt.createComponent("add_pq.qml") 
    var dialog = component.createObject(root) 
    dialog.open() 

    dialog.accepted.connect(function(){ 
     console.log("ID  :" + window.in_id) 
     console.log("Name :" + window.in_name) 
     console.log("Comment:" + window.in_comment) 
    }) 
    } 
} 

add_pq.qml

Dialog { 
    id:dialog 
    ... 
    property alias in_id: txtID.text 
    property alias in_comment: txtComment.text 
    property alias in_name: txtName.text 
    ... 
    contentItem: GridLayout{ 
    ... 
    TextField{ 
     id: txtComment 
     Layout.alignment: Qt.AlignRight 
    } 
    Button{ 
     Layout.columnSpan: 2 
     text: "Add" 
     Layout.alignment: Qt.AlignRight 
     onClicked: { 
     dialog.click(StandardButton.Save) 
     } 
    } 
    }