Question 5: C++版本的signal 和 slot 变成了怎么写?
Answer: 这部分变化不大
先说C++,信号用signals 表述符(不是C++的关键字,而是给Qt的MOC编译器用的。Qt的C++版本编译器分为三个部分,即MOC、UIC和RCC,分别是Meta-Object Compiler;User Interfaces Compiler和Resource Compiler,其中MOC为元对象编译器,主要用于实现反射机制和跨平台的能力;UIC用于将.ui 的xml文件翻译为C++文件;RCC即资源编译器,用于将多个资源z整合为带有检索功能的二进制的rcc文件)。
C++ 槽函数(slots)则从QT5开始就不再必须支持反射机制了,即改变了Qt4之前用函数名进行函数访问的办法,而是可以直接用函数指针本身了。只是写上slots毕竟还是好习惯。注意如果采用on_obejct_signal(...)进行自动connect时候,还是需要明确写上slots的。
在QML中 , 信号使用signal 关键字,slots关键字就不需要了,因为qml中所有的function都是天然支持反射系统的。例子如下:
import QtQuick
Window {
width: 640
height: 480
visible: true
title: qsTr("Hello World")
Rectangle{
id: rect
width: 100
height: 100
color: "red"
signal dblClicked()
//注意,信号中的参数类型需要显示说明,和Js function不同
signal clicked(MouseEvent mmouse)
//funciton 天生就是slot ,因为都支持了反射机制
function btnReleasedProcess(){
console.log("button released.");
}
MouseArea{
anchors.fill: parent
//注意这里添加中键,默认是不响应中键的
acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
onReleased: rect.btnReleasedProcess() //function作槽函数。注意这里的()需要写上
onDoubleClicked: {
rect.dblClicked();//发射信号,不需要emit指示符了。注意这里显示引用rect
}
onClicked: function (mouse){
rect.clicked(mouse)//注意这里显示引用rect
}
}
}
Connections{
target: rect
function onDblClicked(){
console.log("button double clicked.")
}
function onClicked(m_mouse){
if( m_mouse.button === Qt.MiddleButton){
console.log("middle clicked.")
}
else {
console.log("NOT middle clicked.")
}
}
}
}
从上面的例子可以看出,QML采用了Connects这个类型,替代了QObject::connect函数,当然了底层是一样的,都是归结为QObject的C++实现。
当然了,也可以在MouseArea里面直接进行所有的自己的信号的处理,这里暴露出来并采用Connections是功能最强大(即最为灵活)的写法。
题外话,如果想通过代码动态 添加slot,则采用代码
<object>.<signal>.connect(slot函数)这里的slot函数可以用JS的function,或者是箭头函数,即C++的lambda表达式)
上面的例子 rect.clicked.connect(function (mouse){....})
341

被折叠的 条评论
为什么被折叠?



