QML学习笔记(十六)QML的信号参数
前言
本小节中,我们将学习处理信号参数。
什么是信号参数?我们打开帮助文档,可以看到许多信号都带有参数。
这里的mouse和wheel就是我们要了解的东西,我们可以通过它来获取更多的信息。
先自行创建新的工程QmlSignalParameters。
一、了解MouseEvent
查阅帮助文档,MouseEvent其实也是一种QML类型,自带有一系列属性。
这里最常用的就是通过mouse来获取x、y值,用来判断当前触发鼠标事件的坐标值是什么,当然这个坐标值通常是相对于MouseArea而言的。
我们简单打印一下:
Window {visible: truewidth: 640height: 480title: qsTr("QML Signal Parameters")Rectangle{id: rectIdwidth: 150height: 150color: "red"MouseArea{anchors.fill: parentonClicked: {console.log("Position x:" + mouse.x + " ,y: " + mouse.y)}}}
}
1.直接引用mouse
这里我们直接使用了mouse,就跟引用对象一样。但事实上这种引用方式不太安全,在新版Qt中正在被逐步淘汰。
为什么会是mouse?这个名字其实是这个信号的默认名,你如果不查阅接口文档其实是不确定这个名字的。
所以,一般更推荐别的方式。
2.function写法
onClicked: function(mouse){console.log("Position x:" + mouse.x + " ,y: " + mouse.y)
}
这种写法提供了更多的灵活性,我们甚至可以把mouse自行改为其他的名字,例如mouse_param:
onClicked: function(mouse_param){console.log("Position x:" + mouse_param.x + " ,y: " + mouse_param.y)
}
运行都是正常的:
3.箭头写法
我们还可以直接用自定义名字加箭头,来实现写法变体。
onClicked: mouse_param=>{console.log("Position x:" + mouse_param.x + " ,y: " + mouse_param.y)}
二、MouseEvent的accepted属性
MouseEvent的accepted属性实际上是一个十分常用的属性。
accepted 是接收的意思,如果设置为true,意味着这个鼠标事件已经被当前组件所接收,将不传递到父容器中的鼠标事件中。
当然,我们还要先设置一下:
propagateComposedEvents: true
这个属性代表MouseArea允许事件向下传递。
如果你希望对一些动作进行放行,让它传递到下层窗口去触发它们的事件,你可以这样做:
propagateComposedEvents: true
onPressed : mouse.accepted = false
onReleased : mouse.accepted = false
onClicked : mouse.accepted = false
MouseEvent还有其他的一些属性,但我觉得不怎么常用,所以也就不啰嗦了。
三、总结
本节内容比较简单,主要讲述了三种处理信号参数的方式,我们使用信号的时候不仅要学会实现信号处理器,还要知道如何引用信号参数来实现更复杂的业务需求。