
以下内容为本人的学习笔记的一部分
QML 中信号的定义分为 QtQuick 框架提供和自己设置两种。
下面就详情一下信号的定义和响应方式。
这些信号都是已经预约义好了,我们需要的是公告响应(方法)就可。比方 MouseArea 的 clicked 信号,要响应它,仅需要在 QML 文件中增加以下形式的语句就可:
on<Signal>: {
?do something ....
}
这里注意一下,Signal 必需首字母大写。冒号后边假如仅是单语句,可以不用大括号{}。
假设公告了一属性 property,可增加以下形式语句响应属性的变化:
on<Property>Changed: {
?do something ....
}
这里注意一下,Property 必需首字母大写。语句的形式和上面相似。
举个栗子,QML 引擎会自动附加 Component 对象到 QML 文件里公告对象中,当对象加载完成时,会触发 Component 对象的 completed 信号,为了响应此信号,那么增加以下形式语句:
Component.onCompleted: {
?do something ....
}
用以下形式公告自己设置的信号,
signal <name>[([<type> <parameter name>[, ...]])]
调用自己设置信号,比方:
Rectangle { id: root signal mysignal(int x, int y) MouseArea { anchors.fill: parent onPressed: root.mysignal(mouse.x, mouse.y) }}上面的 mouse 来自于对象 MouseArea 的信号 pressed 定义公告。
自己设置信号的解决形式和其它的预约义信号一致。
QtQuick 框架提供了一个类型:Connections 用于解决任意对象的信号。参考以下形式:
Connections {
?target: object_id
?onSignal: {
??do something ....
?}
}
以上用于响应 id 为 object_id 的对象发出的信号 signal。
和 C ++ 部分相似,QML 中也有 connect 方法,但是 QML 的 connect 更灵活。QML 的 connect 由信号提供,可以连接任意的(包括多个)信号和方法。参考以下形式:
signal.connect(signal / function name)
Rectangle { id: root signal mySignal() \\ 信号响应解决 onMySignal: console.log("clicked connect mySignal") \\ 普通方法 function slt_clicked() { console.log("Clicked"); } Component.onCompleted: { mousearea.clicked.connect(slt_clicked); mousearea.clicked.connect(mySignal); } MouseArea { id: mousearea anchors.fill: parent }}注意一下,连接的信号 ( clicked ) 假如带有参数,那么被连接的方法 ( slt_clicked ) 也应该有同样数目的参数。
当然,假如连接不再需要,那么 disconnect 也是不能缺少的。
Rectangle { id: relay \\ ... 省略 function removeSignal() { mousearea.clicked.disconnect(slt_clicked); mousearea.clicked.disconnect(mySignal); }}