QML 具有信号和处理程序机制。当发出信号时,会调用相应的信号处理程序。
QML 信号和处理程序事件系统是 QML 中非常重要的概念。信号是一种用于通知其他对象发生了某些事件的机制,而处理程序则是接收并处理这些事件的函数或方法。
在 QML 中,每个对象都可以定义自己的信号和处理程序。当对象发生特定事件时,它会向其注册的所有处理程序发送相应的信号。其他对象可以监听这些信号,并执行相应的操作来响应该事件。
(相关资料图)
要在为特定对象发出特定信号时接收通知,对象定义应声明一个名为 on
例如,来自 Qt Quick Controls 模块的 Button 类型有一个 clicked 信号,只要单击按钮就会发出该信号。在这种情况下,用于接收此信号的信号处理程序应为 onClicked:
import QtQuickimport {id: rectwidth: 250; height: 250Button{: : : "Change color!"onClicked:{ = ((), (), (), 1);}}}
【领 QT开发教程 学习资料, 点击下方链接莬费领取↓↓ ,先码住不迷路~】
点击这里:
、属性更改信号处理程序
当 QML 属性的值发生变化时,会自动发出信号。 这种类型的信号是属性更改信号,这些信号的信号处理程序以 on
例如,TapHandler 类型的 pressed 属性:
import QtQuickRectangle{id: rectwidth: 100; height: 100TapHandler{onPressedChanged: ("taphandler pressed?", pressed)}}
、信号参数
信号可能有参数。要访问这些,应该为处理程序分配一个函数。可以使用箭头函数和匿名函数。
示例:
// QtQuickItem{id: myitemsignal errorOccurred(message: string, line: int, column: int)}Status{onErrorOccurred: (mgs, line, col) =>(`${line}:${col}: ${msg}`)}
注意:函数中形式参数的名称不必与信号中的名称匹配。
如果不需要处理所有参数,则可以省略尾随参数:
Status{onErrorOccurred: function (message) { (message) }}
不能遗漏前导参数,但是可以使用一些占位符名称来向读者表明它们并不重要:
Status{onErrorOccurred: (_, _, col) =>(`Error happened at column ${col}`)}
可以使用纯代码块代替函数,但不鼓励使用。在这种情况下,所有信号参数都被注入到块的作用域中。但是,这会使代码难以阅读,因为不清楚参数的来源,并导致 QML 引擎中的查找速度变慢。 不推荐以这种方式注入参数,如果实际使用该参数会导致运行时警告。
、使用连接类型
在某些情况下,可能需要访问发出它的对象之外的信号。为了这些目的,QtQuick 模块提供了 Connections 类型来连接到任意对象的信号。Connections 对象可以接收来自其指定目标的任何信号。
示例:
import QtQuickimport {id: rectwidth: 250; height: 250Button{id: : : : "Change color!"}Connections{target: buttonfunction onClicked(){ = ((), (), (), 1);}}}
、附加的信号处理程序
附加信号处理程序从附加类型而不是在其中声明处理程序的对象接收信号。
例如, 是一个附加的信号处理程序。它通常用于在其创建过程完成时执行一些 JavaScript 代码。下面是一个例子:
import QtQuickRectangle{width: 200; height: 200color: ((), (), (), 1):{("The rectangle"s color is", color)}}
QML 引擎自动将具有完成信号的 Component 附加类型的对象附加到 Rectangle 对象。创建 Rectangle 对象时,引擎会发出此信号,从而触发 信号处理程序。
可以通过 signal 关键字将信号添加到自定义 QML 类型。
定义新信号的语法是:
signal [([[, ...]])]
、通过将信号作为方法调用来发出信号。
示例:
// QtQuickRectangle{id: rootsignal activated(real xPosition, real yPosition) //定义信号property point mouseXYproperty int side: 100width: side; height: sideTapHandler{id: handleronTapped: (, ) //发出信号onPressedChanged: = }}
现在 SquareButton 的任何对象都可以使用 onActivated 信号处理程序连接到激活的信号:
// {onActivated: (xPosition, yPosition)=>("Activated at " + xPosition + "," + yPosition)}
信号对象有一个 connect() 方法来将信号连接到一个方法或另一个信号。当信号连接到方法时,只要发出信号,就会自动调用该方法。 这种机制使信号能够由方法而不是信号处理程序接收。
下面,使用 connect() 方法将 messageReceived 信号连接到三个方法:
import QtQuickRectangle{id: relaysignal messageReceived(string person, string notice):{(sendToPost)(sendToTelegraph)(sendToEmail)("Tom", "Happy Birthday")}function sendToPost(person, notice){("Sending to post: " + person + ", " + notice)}function sendToTelegraph(person, notice){("Sending to telegraph: " + person + ", " + notice)}function sendToEmail(person, notice){("Sending to email: " + person + ", " + notice)}}
使用 connect() 允许多个方法接收信号。此外,connect() 在将信号连接到动态创建的对象时很有用。
有一个对应的 disconnect() 方法用于移除连接的信号:
Rectangle{id: relay//...function removeTelegraphSignal(){(sendToTelegraph)}}
、信号到信号连接
通过将信号连接到其他信号,connect() 方法可以形成不同的信号链。
import QtQuickRectangle{id: forwarderwidth: 100; height: 100signal send()onSend: ("Send clicked")TapHandler{id: : parentonTapped: ("Mouse clicked")}:{(send) // 信号连接到信号}}
每当 TapHandler 的 tapped 信号发出时,send() 信号也将自动发出。输出:
MouseArea clicked
Send clicked
【领 QT开发教程 学习资料, 点击下方链接莬费领取↓↓ ,先码住不迷路~】
点击这里:
标签:
仓储物流“成渝圈”如何乘势而上? 12月3日,连接昆明和万象的中老铁路全线开通运营,被惠及的显...
两件西周青铜簋时隔三千年成功配对 考古工作者介绍,这个铜簋的盖、身分别时隔40余年出土,纹饰...
“医保砍价”不是一个人在战斗 晁星 “我眼泪都快掉下来了”“每一个小群体都不该被放弃”…...
“购物成瘾”真的是一种病 刘艳 牛雅娟 本周日即将迎来“双十二”促销季,很多人又开始摩拳...
因迷恋山间风景,一男子在甘孜州稻城县海拔4000多米的无人区迷失方向,随后与同伴失联。12月的稻城...
嫌疑人DNA信息比中后,成都市公安局刑侦支队技术处DNA实验室民警白小刚一下坐在凳子上,恍惚迟疑间...
一批反映南京大屠杀历史的新书发布 新华社南京12月7日电(记者邱冰清、蒋芳)“以史为鉴,开创未来...
我在现场·照片背后的故事|电影《亲爱的》里面没有的结局,在我眼前“上映” 12月6日,在深圳市...
冥想?泡脚?不如听听助眠音乐 晚上睡不着,白天睡不醒,成为最贴合都市人群的“睡眠画像”。随...
养老话题 老年教育面临缺口 “终身教育”潜力无限 【现实挑战】“新老年”群体愿意在培养兴...
孙海洋被拐14年儿子如何找到的? 警方侦办另一宗拐骗儿童案时发现线索,通过人像比对、DNA确认找...
北京天文馆、圆明园将对未成年人免费开放 12月6日,北京天文馆发布通知称,12月8日起试行对未成...
今年全国粮食总产量再创新高 连续7年保持在1 3万亿斤以上 根据对全国31个省(区、市)的抽样调...
斑块软的很危险 硬的就无碍? 血管里的“垃圾”分类 赶快学起来! 一项最新研究显示:中国...
诺西那生钠注射液大幅降价 聚焦医保谈判背后脊髓性肌萎缩症家庭 医保目录公布那天 好多家长都...
抖音“窗花剪剪”遭抄袭 被判获赔20万元 法院认为“窗花剪剪”的这种表达方式理应受到《著作权...
公安机关近日侦破3起拐卖儿童案件 失散十几年 3组家庭终于团圆了 北京青年报记者12月6日从公...
2021年度十大网络用语发布 本报讯(记者 路艳霞)作为年度“汉语盘点”活动最具网络特色的组成部...
北京天文馆向未成年人免费开放 本报讯(记者 牛伟坤)北京天文馆对票价免费及优惠政策作出调整:1...
2021北京百个网红打卡地发布 本报讯(记者 李洋)2021北京网红打卡地推荐榜单昨晚正式发布。自然...