首页 > 编程知识 正文

异步消息处理机制,QBR报告

时间:2023-05-06 09:43:36 阅读:54958 作者:751

文章列表1、序言2、基于信号处理程序信号接收3、属性变更信号处理程序4、信号参数4-1、信号定义4-2、信号处理函数接收信号参数定义5、基于连接qml类型的信号连接6、信号处理函数连接7、-

一、引言

QML有信号和处理程序机制,信号是事件,通过信号处理程序响应信号。 发出信号后,将调用相应的信号处理程序。 通过将逻辑(如脚本和其他操作)放入处理程序中,组件可以响应事件。

二.要在特定信号发送到要通过信号处理程序接收信号的特定对象时接收通知,对象定义必须声明名为Signal的信号处理程序。 其中Signal是信号的名称(注意:第一个字符必须大写)。 信号处理程序必须包含调用信号处理程序时执行的JavaScript代码。

三、属性变更信号处理程序在QML属性的值发生变化时自动发出信号。 这种类型的信号是属性更改信号,这些信号的信号处理程序以on Property Changed的形式编写。 其中Property是属性的名称,第一个字符必须大写。

四.信号参数信号中可能有参数。 要访问这些函数,必须将函数分配给处理程序。

4-1、信号定义中,必须定义信号。 格式如下。

signal name [ ([ type parameter name [, ] ) ] c使用emit关键字发送信号。 在qml中,通过将信号作为方法调用来发出信号。

注:尝试在同一类型的块中声明同名的两个信号或方法是错误的。 但是,新信号可能会在该类型中重用现有信号的名称。

下面的代码是定义信号的示例

//ReturnBtn.qml文件

//在此定义sting类型的参数name和带有int类型参数agesignalmsgchange (name 3360 string )的msgchange信号。 单击age : int (MouseArea (anchors.fill : return icon _ 128 on clicked : ) mouse area对象类型可调用msgChange函数“iriczhao”和999两个参数msgchange(iriczhao ),999 ) }onpressed: ) glow.visible=trueglow.color=) lightskyblue

window { id : window width :640 height :480 visible :真彩色3360 ' # 4c 79 ef ' title 3360 qstr (hello world ' ) return BTN { id : returnbtnx 3360245 y :204 width :100 height 336047 anchors.vertical center : parent.vertical center ranana 在alcenter//其中,msgChange信号处理程序中,使用function ()将msgChange信号引入的两个参数onmsgchange3360function(name,Agang ) )

1、函数中形式参数的名称不必与信号中的名称一致。

2、如果不需要处理所有参数,可以省略后面的参数。 例如,如果只在onMsgChange信号处理程序中接收name参数,而不接受age参数,则可以写为:

对于不需要的参数(onmsgchange:function(name ) console.log ) (“recv''name ) 3,function ) (下划线) _ )

使用onmsgchange:function(_,age ) console.log ) ' recv''age )、Connections qml类型创建信号连接时,可能会发出信号在这种情况下,可以使用QtQuick模块提供的

连接到任意对象信号的Connections类型。而且,连接对象可以接收来自其指定目标的任何信号。这样就不必将信号处理函数写在对应的对象类型块中啦【这一点较为重要】

六、连接信号处理函数

​ 附加的信号处理程序从附加类型接收信号,而不是从声明处理程序的对象接收信号。

​ 例如,Component.onCompleted是一个附加的信号处理程序。它通常用于在创建过程完成时执行一些JavaScript代码。例如下面代码:

import QtQuick 2.0import QtQuick.Window 2.15import "Components"Window { id: window width: 640 height: 480 visible: true color: "#4c79ef" title: qsTr("Hello World") ReturnBtn { id: returnBtn x: 245 y: 204 width: 100 height: 47 anchors.verticalCenter: parent.verticalCenter anchors.horizontalCenter: parent.horizontalCenter onMsgChange: function(name){console.log("recv " + " " + name)}//附加的信号处理函数 Component.onCompleted: { console.log("ReturnBtn") } }//附加的信号处理函数 Component.onCompleted: { console.log("Window") }}

​ 这里将打印出:

​qml: Window​qml: ReturnBtn

​ (注,这里怎么先打印出Window,然后再打印出ReturnBtn呢,哈哈。与qml对象树相关)

七、使用connect将信号连接到方法和信号 7-1、连接到方法

​ 信号对象有一个connect()方法来将一个信号连接到一个方法或另一个信号。当一个信号连接到一个方法时,只要发出信号,该方法就会被自动调用。这种机制使信号可以由方法而不是信号处理程序接收。

​ 那么,这里来重新修改一下ReturnBtn.qml 文件。如下代码:

···Window { id: window width: 640 height: 480 visible: true color: "#4c79ef" title: qsTr("Hello World") ReturnBtn { id: returnBtn x: 245 y: 204 width: 100 height: 47 anchors.verticalCenter: parent.verticalCenter anchors.horizontalCenter: parent.horizontalCenter } Component.onCompleted: { //在该组件加载完成信号处理函数中创建:returnBtn对象的msgChange信号与masChangeHandler JavaScript的 //函数连接 returnBtn.msgChange.connect(msgChangeHandler) }//定义msgChangeHandler函数 function msgChangeHandler(messae,value) { console.log("recv param :" + messae +" " + value); }}

​ 在许多情况下,通过信号处理程序接收信号就足够了,而不必使用connect()函数。但是,使用connect方法允许多个方法接收信号,如前面所示,这对于信号处理程序是不可能的,因为它们必须唯一命名。

​ 此外,connect方法在将信号连接到动态创建的对象时也很有用。

​ 注意:可以使用disconnect()函数断开信号与方法的连接。如下代码:

function removeMsgChangeSignal(){ returnBtn.msgChange.connect(msgChangeHandler) }

​ 经实践,发现如果一个信号同时关联信号处理函数和使用connect()函数关联的方法时,会有问题,【哈哈】

7-2、连接到信号

​ 通过将信号连接到其他信号,connect()方法可以形成不同的信号链。同样的,还是修改ReturnBtn.qml文件,如下代码:

Window { id: window width: 640 height: 480 visible: true color: "#4c79ef" title: qsTr("Hello World") signal returnBtnClicked() ReturnBtn { id: returnBtn x: 245 y: 204 width: 100 height: 47 anchors.verticalCenter: parent.verticalCenter anchors.horizontalCenter: parent.horizontalCenter onMsgChange: console.log("ReturnBtn") } Component.onCompleted: { returnBtn.msgChange.connect(returnBtnClicked) } onReturnBtnClicked: { console.log("this is Window signal : returnBtnClicked handler") }}

这样点击按钮后,会打印:

ReturnBtnthis is Window signal : returnBtnClicked handler

但是如果omMsgChange信号处理函数这样写:

onMsgChange: function (name,age){console.log("recv " << name + " " + age)}

||||||||||||||||||||||||||||||||||||||||||||||||||||||| 似乎就输出:

0this is Window signal : returnBtnClicked handler

!!【啧啧啧】

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

【好啦,文本完啦】

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。