社区新版论坛已上线,点击立即前往!使用 openKylin 账户授权登录,解锁更多体验!

openKylin论坛

 找回密码

QML signal与signal handler系统 [复制链接]

QML 的signal 和 signal handler机制的存在,是为了应用能够和UI组件之间相互交互。signal就是button clicked、mouse area pressed这些event,signal handler则就是这些事件的响应。
当一个signal emitted,相应的signal handler就会被调用,在signal handler中执行一些scripts或是其他操作,已完成event的响应。


signal和signal handler的定义
signal 的定义

[url=]复制代码[/url]
1
signal <signalName>[([<type> <parametername>[, ...]])]



signal handler 的定义
on<SignaleName>
可以参考另一篇文章 Qt QML入门– QML 语法 (2)
Property Change Signal Handler
当Property的值改变了,就会自动emitted一个signal,这种property changed signal,有property Signal handler与之对应。你只需要实现signal handler即可。

[url=]复制代码[/url]
1
on<PropertyName>Changed



使用Connections Type
很多人都知道Qt一个很好的东西,就是signalslot机制。你可以很方便的connect的signal和slot。QML中的Connections,它能够让你接收指定object的任意signal,从而能够在signal声明的那个Object之外接收到声明的signal,从而实现自己想要logic。

[url=]复制代码[/url]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import QtQuick 2.0
      
Rectangle {
    id: rect
    width: 100; height: 100
      
    MouseArea {
        id: mouseArea
        anchors.fill: parent
    }
      
    Connections {
        target: mouseArea
        onClicked: {
            rect.color = Qt.rgba(Math.random(), Math.random(), Math.random(), 1);
        }
    }
}



上面的代码中,Connections中的target绑定的是ouseArea,从而在rect中能够接收到mouseArea的signal,如clicked、pressed、released等等signal。
附带的signal handler
附带的signal handler是附带组件的signal与之对应的signal handler,并不是使用附带组件本身Object的signal的signal handler。
可以参看另一篇文章 Qt QML入门– QML 语法 (2)
signal与signal的连接,signal与method的连接
signal 都有一个connect()方法,可以连接method或者signal。
可以看下面两段代码
signal connect signal

[url=]复制代码[/url]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Rectangle {
    id: forwarder
    width: 100; height: 100
      
    signal send()
    onSend: console.log("Send clicked")
      
    MouseArea {
        id: mousearea
        anchors.fill: parent
        onClicked: console.log("MouseArea clicked")
    }
      
    Component.onCompleted: {
        mousearea.clicked.connect(send)
    }
}



注意:mousearea.clicked.connect(send),这里send是signal但是却没有加或括号。emitted signal的时候则不论是否signal声明的时候有无括号,都须要加上括号。
signal connect method

[url=]复制代码[/url]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Rectangle {
    id: relay
      
    signal messageReceived(string person, string notice)
      
    Component.onCompleted: {
        relay.messageReceived.connect(sendToPost)
        relay.messageReceived.connect(sendToTelegraph)
        relay.messageReceived.connect(sendToEmail)
    }
      
    function sendToPost(person, notice) {
        console.log("Sending to post: " + person + ", " + notice)
    }
    function sendToTelegraph(person, notice) {
        console.log("Sending to telegraph: " + person + ", " + notice)
    }
    function sendToEmail(person, notice) {
        console.log("Sending to email: " + person + ", " + notice)
    }
}



注意:这里使用connect连接是的method,同样没有加上括号。
既然能够connect,那有没有disconnect呢?当然有。
有时候,你不使用disconnect,你某些动态create的对象都无法distroy。

[url=]复制代码[/url]
1
2
3
4
5
6
7
8
Rectangle {
    id: relay
    //...
      
    function removeTelegraphSignal() {
        relay.messageReceived.disconnect(sendToTelegraph)
    }
}



disconnect跟connect就只是一个单词差别而已,没有其他特别不同的地方

楼主
发表于 2013-7-10 08:26:48
回复

使用道具 举报

openKylin

GMT+8, 2024-6-13 18:15 , Processed in 0.019995 second(s), 17 queries , Gzip On.

Copyright ©2022 openKylin. All Rights Reserved .

ICP No. 15002470-12 Tianjin

快速回复 返回顶部 返回列表