2012-02-29 61 views
10

如何將s信號從一個qml組件發送到另一個qml組件?如何捕捉QML中的信號?

下面是一個例子:

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" 
} 

如何捕捉其他組件的信號?

回答

13

您應該使用connect()組件信號的方法(信號本身就是對象)。

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

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

+1

謝謝。它可以解釋信號(onXXXXX)僅用於本身,如果想在其他情況下捕獲,請使用Connecet? – 2012-02-29 23:39:03

+0

是的,如果您在qml文件中聲明組件的實例,則可以將代碼分配給該組件的預定義onXxx插槽。它已經連接,你只需要綁定一個表達式。如果你想連接另一個實例或函數的插槽信號,你必須使用'connect'方法。 – sergk 2012-03-01 09:13:47

+0

我明白了,謝謝你的幫助.. – 2012-03-01 09:41:40

9

在另一個對象中,您只需添加一個on字,後跟信號名稱。 EG:

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

(點擊是有點令人困惑的信號名字,因爲它很常見但是如果你叫你的信號orange,你會做綁定onOrange:

+0

感謝您的幫助。如果有很多'YourQmlObject',那麼我會在每個組件中寫入onClicked:{...}嗎?還有其他方法嗎? – 2012-02-29 04:15:14

+0

這些信號會自動產生,所以你可以把你的「批次」放到一個單獨的容器中,這個容器是一個很長的對象列表,並且把'onClicked:'處理器放在任何最終包含'AllMyQmlObjects'的文件中。 – 2012-02-29 05:07:33

+0

連接如何? – 2012-02-29 23:39:47

5

可以使用QML連接元件

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) 
     } 
    } 
    }