2012-02-29 83 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) 
     } 
    } 
    }