Qt Quick也就是QML最大的一个特点就是与Qt元对象系统的结合,所以QML也能使用信号与槽机制。下面是几种信号与槽的使用方式
一、信号处理器
信号处理器怎么说呢,可以看作Qt里面的一个匿名槽函数,是一个代码块,除了定义它的地方,没人能调用它,也就是私有的。下面是一段简单的信号处理器的使用方式
Button{
text: "Button"
onClicked: {
console.log("click")
}
}
上述代码定义了一个button,button点击的时候会发出一个clicked信号,这个onClicked:{}就是捕捉这个信号的信号处理器,{}内就是处理这个信号的代码。
信号处理器的定义格式: on+<信号名(首字母大写)>:{}
二、附加信号处理器
QML中有附加属性和附加信号处理器的概念,这些属性是由附加类型实现和提供,他们可能被附加到另一种类型的对象,其区别在于普通属性是由对象本身或者其基类提供的。下面也有一个例子:
Button{
text: "Button"
onClicked: {
console.log("click")
}
Component.onCompleted: {
console.log("Button Created")
}
}
上述代码附加类型信号处理器是Component.onCompleted也就是在普通信号处理器定义的方式前面加上附加类型,
其通用格式为:<附加类型名>.on+<信号名(首字母大写)>:{}
三、Connections
一个Connections对象能够集中处理来自同一个对象的所有信号,其具体使用方法如下:
Button{
id:id_button
text: "Button"
}
Connections{
target: id_button
function onClicked()
{
console.log("click")
}
}
Button{
id:id_button
text: "Button"
}
Connections{
target: id_button
onClicked:{
console.log("click")
}
}
target是信号的来源对象,代码就表示处理button的clicked信号,在信号处理这块,两种书写方式都是可行的,不过在connections对象内部还是更推荐第二种写法,无它,只是单纯 的好看。
四、信号的产生
信号的产生主要运用到的就两种:
一种是属性改变所发出的信号:
Button{
id:id_button
text: "Button"
onTextChanged: {
}
}
这种属性改变发出的信号一般是 属性名+Changed()
另一种是编写者自定义的信号在触发某种条件时发送:
Button{
id:id_button
text: "Button"
signal sgl_click()
onClicked: {
sgl_click()
}
}
这种就是定义了一个信号,当点击时就发送这个信号