QML 信号与信号响应方法的总结

  • 时间:2019-01-09 18:56 作者:englyf 来源:englyf 阅读:790
  • 扫一扫,手机访问
摘要:以下内容为本人的学习笔记的一部分QML 中信号的定义分为 QtQuick 框架提供和自己设置两种。下面就详情一下信号的定义和响应方式。QtQuick 提供的信号:这些信号都是已经预约义好了,我们需要的是公告响应(方法)就可。比方 MouseArea 的 clicked 信号,要响应它,仅需要在 QML

以下内容为本人的学习笔记的一部分

QML 中信号的定义分为 QtQuick 框架提供和自己设置两种。
下面就详情一下信号的定义和响应方式。

  1. QtQuick 提供的信号:

这些信号都是已经预约义好了,我们需要的是公告响应(方法)就可。比方 MouseArea 的 clicked 信号,要响应它,仅需要在 QML 文件中增加以下形式的语句就可:

on<Signal>: {
?do something ....
}

这里注意一下,Signal 必需首字母大写。冒号后边假如仅是单语句,可以不用大括号{}。

  1. 属性变化发射的信号:

假设公告了一属性 property,可增加以下形式语句响应属性的变化:

on<Property>Changed: {
?do something ....
}

这里注意一下,Property 必需首字母大写。语句的形式和上面相似。

  1. 附加类型对象的信号:

举个栗子,QML 引擎会自动附加 Component 对象到 QML 文件里公告对象中,当对象加载完成时,会触发 Component 对象的 completed 信号,为了响应此信号,那么增加以下形式语句:

Component.onCompleted: {
?do something ....
}

  1. 自己设置信号:

用以下形式公告自己设置的信号,

signal <name>[([<type> <parameter name>[, ...]])]

调用自己设置信号,比方:

Rectangle {    id: root    signal mysignal(int x, int y)    MouseArea {        anchors.fill: parent        onPressed: root.mysignal(mouse.x, mouse.y)    }}

上面的 mouse 来自于对象 MouseArea 的信号 pressed 定义公告。

自己设置信号的解决形式和其它的预约义信号一致。

  1. 解决任意对象的信号:

QtQuick 框架提供了一个类型:Connections 用于解决任意对象的信号。参考以下形式:

Connections {
?target: object_id
?onSignal: {
??do something ....
?}
}

以上用于响应 id 为 object_id 的对象发出的信号 signal。

  1. QML 中的 connect 方法

和 C ++ 部分相似,QML 中也有 connect 方法,但是 QML 的 connect 更灵活。QML 的 connect 由信号提供,可以连接任意的(包括多个)信号和方法。参考以下形式:

signal.connect(signal / function name)

Rectangle {    id: root    signal mySignal()    \\ 信号响应解决    onMySignal: console.log("clicked connect mySignal")    \\ 普通方法    function slt_clicked() {      console.log("Clicked");    }    Component.onCompleted: {        mousearea.clicked.connect(slt_clicked);        mousearea.clicked.connect(mySignal);    }    MouseArea {        id: mousearea        anchors.fill: parent    }}

注意一下,连接的信号 ( clicked ) 假如带有参数,那么被连接的方法 ( slt_clicked ) 也应该有同样数目的参数。

当然,假如连接不再需要,那么 disconnect 也是不能缺少的。

Rectangle {    id: relay    \\ ... 省略    function removeSignal() {        mousearea.clicked.disconnect(slt_clicked);        mousearea.clicked.disconnect(mySignal);    }}
  • 全部评论(0)
最新发布的资讯信息
【系统环境|】【Azure API Management】实目前API Management服务中使用MI(管理标识 Managed Identity)访问启用防火墙的Storage Account(2025-10-16 23:53)
【系统环境|】【Azure 存储服务】App Service 访问开启防火墙的存储账号时遇见 403 (This request is not authorized to perform this opera...(2025-10-16 23:52)
【系统环境|】YouTube账号购买全攻略|点击查看原文购买|购买YouTube账号、油管号自动发货服务的优势与缺点 附:YouTube无法加载?可能是这个设置在作怪!(2025-10-16 23:52)
【系统环境|】【Azure Developer】Azure Automation 自动化账号生成的时候怎么生成连接 与证书 (Connection & Certificate)(2025-10-16 23:41)
【系统环境|】【Azure Redis 缓存】如何使得Azure Redis可以仅从内网访问? Config 及 Timeout参数配置(2025-10-16 23:40)
【系统环境|】近日,四川宜宾,某地下停车场内的监控拍到了一幕惊险的画面。危险!一汽车修理师傅正在修理一辆3吨重的悍马时,悍马车突然自己启动,眼看就要撞向前面的一辆灰色轿车了,一侧的修理师傅做出了一个令人始料不...(2025-10-16 23:38)
【系统环境|】iOS 能耗监控与电池优化实战:如何查看App耗电量、分析CPU、GPU内存使用、(uni-app iOS开发性能调试指南)(2025-10-16 23:37)
【系统环境|】《风流女管家》法国犯罪悬疑片--《风流女管家》法语高清全集免费在线无广告完整观看---《风流女管家》HD正版免费播放-手机电脑皆可看(2025-10-16 23:36)
【系统环境|】2025含金量排名前十计算机专业证书(2025-10-15 20:51)
【系统环境|】你有白帽众测 我有黑帽雇佣(2025-10-15 20:50)
手机二维码手机访问领取大礼包
返回顶部