signal [([ [, ...]])]
一般来说,可视化自定义QML对象会基于Item进行扩展,包括添加自定义信号和其他必要的功能。 其实这个过程就相当于推导原始类型(参考C++的习惯)。
Rectangle {
id: root
signal mysignal(int x, int y)
MouseArea {
anchors.fill: parent
onPressed: root.mysignal(mouse.x, mouse.y)
}
}
在上面的代码中,对象定义了信号,带有整数参数 x 和 y。 然后添加一个为鼠标区域定义的组件,其中通过信号槽触发父对象的自定义信号。
信号属于预定义类型,有自己的参数mouse。 更多信息可以参考以下链接:
#-
自定义信号的处理形式与预定义信号的处理形式相同,参见上面预定义信号的响应方法。
5. 通过信号的方法指定响应
about,简单地说,就是用来指定对特定信号或下一个触发的信号的响应的方法。 更详细地说,如果触发了一个信号,它可以指定响应的方式,或者指定触发下一个信号形成信号的连锁反应。 这个过程是通过pass指定的。
如果你熟悉Qt,你应该熟悉C++的::方法。 与C++部分类似,QML中也有方法,可以连接任意(包括多个)信号和方法,但QML更加灵活,调用方式也不同。 不同之处在于,在 C++ 中 :: 是静态方法,而在 QML 中它由信号提供。 参考以下表格:
signal.connect(signal / function_name)
请注意,QML 对象的信号必须通过对象引用。
看一个例子:
【获取QT开发教程学习资料,点击下方链接领取费用↓↓,首码直播不迷路~】
点击→接收“链接”
Rectangle {
id: root
signal mySignal()
// 信号响应处理
onMySignal: console.log("clicked connect mySignal")
// 普通方法
function slt_clicked() {
console.log("clicked connect slt_clicked");
}
Component.onCompleted: {
mousearea.clicked.connect(slt_clicked);
mousearea.clicked.connect(mySignal);
}
MouseArea {
id: mousearea
anchors.fill: parent
}
}
从上面的代码可以看出,在响应被引用组件的信号时,通过另一个组件的()来调用连接到父组件的函数和信号。
如果信号有参数,那么连接的方法 ( ) 和信号 ( ) 也应该有相同数量的参数。
当组件的信号被触发时,您可以看到以下输出:
clicked connect slt_clicked
clicked connect mySignal
当然,如果不再需要连接,也是必不可少的。 该函数则相反,它专门用于解除现有连接的绑定,并且它也是由信号调用的。
Rectangle {
id: relay
// ... 省略
function removeSignal() {
mousearea.clicked.disconnect(slt_clicked);
mousearea.clicked.disconnect(mySignal);
}
}
6.处理任意对象的信号:
该框架提供了一个超级方便的类型: ,它可以用来响应来自任意对象的信号(官方)。
大多数情况下,用于连接到其他 QML 文件中定义的对象的信号需要指定信号所属对象的 id。 参考以下表格:
import QtQml
Connections {
target: object_id
onSignal: {
// do something ....
}
}
该属性用于指定响应信号所属对象的id。