qml的信号槽机制

qml的信号槽机制和qtwidget差不多,但是使用方法不一样,qtwidget一般直接用connect函数把信号和槽一绑定就完事了,qml分为自动绑定和手动绑定。

信号自动绑定

在一个组件里面定义一个信号,用signal定义,当事件触发,比如button的onclick,发送信号,连接信号槽,就是这个信号发出后对他进行一个处理,边看例子边讲吧

//测试qml的信号槽机制
import QtQuick
import QtQuick.ControlsWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")//文本框Flickable {id: flickableanchors.centerIn: parentwidth: 200height: 200contentWidth: textEdit.widthcontentHeight: textEdit.heightclip: true
//滑动条部份,需要用flickable或者scrollbar包装起来ScrollBar.vertical: ScrollBar {id: vbarwidth: 20policy: ScrollBar.AsNeededanchors {right: parent.righttop: parent.topbottom: parent.bottom}}TextEdit {id: textEditwidth: flickable.widthheight: Math.max(flickable.height, implicitHeight)wrapMode: TextEdit.Wrapcolor: "red"}}//测试信号按钮Button{x:10y:10width: 40height: 20text: "btn1"signal haveClick()onClicked: {haveClick()}onHaveClick: {textEdit.append("btn1被点击")}}}

上面这段代码,我定义了一个文本框和一个按钮,文本框有一个滑动条模块,注意下,滑动条需要用scrollview或者flickable包装一下,button中定义了一个信号haveclick(),当按钮被点击onclick的时候就会被触发发送,发送出去自动绑定就是在信号名前面加上on并把信号名首字母大写,后面跟上处理函数,如上onHaveClick: {textEdit.append("btn1被点击")},textedit是我给文本框定义的id,我希望信号发出后,文本框能加上一行某某被点击,上面的代码可以直接复制到qml文件中区跑着看看,这个就是自动绑定信号槽。上面是信号槽绑定的一种方法,还有一种是类似JavaScript的箭头函数或者c++的lamda函数表达式的。

信号槽的手动绑定

我们在发送者的内部定义信号,在接收者内部定义接收槽函数。信号发出时进行信号槽的绑定

下面是无参和有参的实例

import QtQuick
import QtQuick.ControlsWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")// Component.onCompleted: { print("窗口被创建")}// Component.onDestruction: {print("窗口被销毁")}//接收者,接收信号后打印Rectangle{id:rec// Component.onCompleted: { print("矩形被创建")}// Component.onDestruction: {print("矩形被销毁")}function ptr(){print("接收到按钮信号")}function ptr2(a, b){print(a+b)}}//发送者,触发后发送信号Button{width: 200height: 40x:50y:50text: "发送信号"signal testsignalsignal test2(int a,int b)onClicked: {testsignal()test2(1,2)}onTestsignal: ()=>{rec.ptr()}onTest2: (a,b)=>{rec.ptr2(a,b)}//有参信号连接的第二种方法亲测无效,避雷//onTest2: rec.ptr2}}

还有一种连接方式

onClicked: {parent.testsignal.connect(rec.ptr)parent.test2.connect(rec.ptr2)}

 一般不会这么用,只是理解下用法,这里可能有重复链接的问题,qml5的用法,在qml6中已经废除,qml6中改用connections,这里需要注意

QML5中的connections基本用法

import QtQuick 2.15
import QtQuick.Controls 2.15Item {signal mySignal()Button {text: "触发信号"onClicked: mySignal()}Text {id: statusTexttext: "未收到信号"}// QML5 风格的 ConnectionsConnections {target: parent // 连接到此对象发出的信号onMySignal: {console.log("信号已接收")statusText.text = "已接收信号!"}}
}

QML5的connections没有enable属性 

QML6的基本用法

Connections {target: sourceObject // 发出信号的对象enabled: true // 可选,控制连接是否激活// 信号处理器 - 方式1:函数声明function onSignalName(param1, param2) {// 处理逻辑}// 信号处理器 - 方式2:Lambda表达式onAnotherSignal: (param) => {// 处理逻辑}
}

组件的创建和销毁

每个组件其实都有两个信号,类似c++中类的构造函数和析构函数

Component.onCompleted:{}//组件的构造
Component.onDestruction: {}//组件的析构

在他们初始化和销毁的时候就会发生

import QtQuick
import QtQuick.ControlsWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")Component.onCompleted: { print("窗口被创建")}Component.onDestruction: {print("窗口被销毁")}Rectangle{Component.onCompleted: { print("矩形被创建")}Component.onDestruction: {print("矩形被销毁")}}
}

运行效果:

按钮点击后控制台输出:

 

 在一个窗口里面创建一个矩形,窗口就是矩形的父对象,看看运行结果

初始化的时候是父节点先创建,在创建子节点,程序销毁的时候是子节点先被销毁,再是父节点被销毁,和qtwidget的对象树一样

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90589.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity国际版下载链接分享(非c1国内版)

转载Unity国际版下载链接分享(非c1国内版) - 哔哩哔哩 大家平时使用Unity注意一下会发现,现在我们下载的Unity版本号后面都一个c1,但是大家在B站学习时大神UP主们使用的Unity版本号大都是没有c1的。 例如:我在用的是…

第4章唯一ID生成器——4.1 分布式唯一ID

在复杂的系统中,每个业务实体都需要使用ID做唯一标识,以方便进行数据操作。例如,每个用户都有唯一的用户ID,每条内容都有唯一的内容ID,甚至每条内容下的每条评论都有唯一的评论ID。 4.1.1 全局唯一与UUID 在互联网还未…

图论水题日记

cf1805D 题意 给定一棵树,规定dis(u,v)≥kdis(u,v) \geq kdis(u,v)≥k时(u,v)(u,v)(u,v)之间存在一条无向边,求k(1,2,...n)k(1,2,...n)k(1,2,...n)时图中的连通块个数 思路 前置知识:树上一点到其最远的点一定是树直径的两个端点之一若一个点…

自定义线程

每个程序至少有一个线程 —— 主线程 主线程是程序的起点,你可以从它开始创建新的线程来执行任务。为此,你需要创建自定义线程,编写在线程中执行的代码,并启动它。 通过继承创建自定义线程 创建新线程有两种主要方式:继…

2025真实面试试题分析-安卓客户端开发

以下是对安卓客户端开发工程师面试问题的分类整理、领域占比分析及高频问题精选(基于​​85道问题,总出现次数118次​​)。按技术领域整合为​​7大核心类别​​,按占比排序并精选高频问题标注优先级(1-5🌟…

算法学习笔记:29.拓扑排序——从原理到实战,涵盖 LeetCode 与考研 408 例题

拓扑排序(Topological Sorting)是一种针对有向无环图(DAG)的线性排序算法,它将图中的顶点按照一定规则排列,使得对于图中的任意一条有向边 u→v,顶点 u 都排在顶点 v 之前。拓扑排序在任务调度、…

利用Web3加密技术保障您的在线数据安全

在这个信息爆炸的数字化时代,保护个人和企业数据安全变得尤为重要。Web3技术以其去中心化和加密特性,为在线数据安全提供了新的解决方案。本文将探讨Web3技术如何通过加密技术保障您的在线数据安全,并介绍如何有效利用这些技术。 什么是Web3技…

Vue实现el-checkbox单选并回显选中

先说需求 我要在页面进行checkbox单选并回显 第一步先把基本的页面写好噢&#xff1a;vue代码&#xff1a;别忘了写change啊<el-form-item label"按钮颜色:" prop"menuColor"><el-checkbox-group v-model"buttonColor" change"bin…

动态规划--序列找优问题【1】

一、说明 动态规划似乎针对问题很多&#xff0c;五花八门&#xff0c;似乎每一个问题都有一套具体算法。其实不是的&#xff0c;动态规划只有两类&#xff1a;1&#xff09;针对图的路径问题 2&#xff09;针对一个序列的问题。本篇讲动态规划针对序列的算法范例。 二、动态规划…

独家|百度副总裁尚国斌即将离职,此前统筹百度地图;行业搜索及智能体业务总经理谢天转岗IDG

百度人事再变动。作者|文昌龙编辑|杨舟据「市象」了解&#xff0c;近期&#xff0c;百度副总裁尚国斌即将离职。公开资料显示&#xff0c;尚国斌2010年毕业于南开大学&#xff0c;2012年加入百度&#xff0c;先后在商业分析部、集团战略办、智能驾驶事业群工作。尚国斌同样也在…

Qt 网络编程进阶:HTTP 客户端实现

在 Qt 应用程序中&#xff0c;实现高性能、可靠的 HTTP 客户端是常见需求。Qt 提供了丰富的网络模块&#xff0c;包括 QNetworkAccessManager、QNetworkRequest 和 QNetworkReply 等类&#xff0c;用于简化 HTTP 通信。本文将深入探讨 Qt 网络编程中 HTTP 客户端的进阶实现&…

Python Requests-HTML库详解:从入门到实战

一、库简介 Requests-HTML是Python中集网络请求与HTML解析于一体的全能型库&#xff0c;由知名开发者Kenneth Reitz团队维护。它完美结合了Requests的易用性和Parsel的选择器功能&#xff0c;并内置JavaScript渲染引擎&#xff0c;特别适合现代动态网页抓取。最新版本&#xf…

基于springboot的小区车位租售管理系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…

Kafka 如何优雅实现 Varint 和 ZigZag 编码

ByteUtils 是 Kafka 中一个非常基础且核心的工具类。从包名 common.utils 就可以看出&#xff0c;它被广泛用于 Kafka 的各个模块中。它的主要职责是提供一套高效、底层的静态方法&#xff0c;用于在字节缓冲区 (ByteBuffer)、字节数组 (byte[]) 以及输入/输出流 (InputStream/…

局域网 IP地址

很多童鞋搞不清楚局域网ip是什么? 什么是局域网 IP 地址? 局域网 IP 地址,也称为 私有 IP 地址(Private IP Address),是用于在局域网内部标识设备的地址。这些地址不能直接在互联网上被访问,通常由路由器自动分配,用于设备之间的内部通信。 局域网 IP 地址的分类 根…

k8s的service、deployment、探针详解

1.k8s组成图2.service和deployment的流量转发图# Deployment 定义容器端口 apiVersion: apps/v1 kind: Deployment metadata:name: myapp spec:template:spec:containers:- name: nginximage: nginxports:- containerPort: 80 # 容器监听 80name: http # 端口命名&…

【PostgreSQL教程】PostgreSQL中json类型与jsonb类型的区别

博主介绍:✌全网粉丝23W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…

牛客刷题记录01

除2&#xff01; 目录 除2&#xff01; 题目描述&#xff1a; ​编辑 题目解析&#xff1a; 代码实现&#xff1a; 数组中两个字符串的最小距离__牛客网 题目描述&#xff1a; 题目解析&#xff1a; 代码实现&#xff1a; 除2&#xff01; 题目描述&#xff1a; 给一个…

Docker Compose UI远程访问教程:结合贝锐花生壳实现内网穿透

对于很多刚接触Docker的用户来说&#xff0c;命令行操作总带着一丝“劝退感”。尤其是要在Windows上部署服务、开放端口、配置参数时&#xff0c;稍有不慎就容易出错。有没有办法像网页后台一样&#xff0c;用图形界面来管理Docker项目呢&#xff1f;答案是&#xff1a;有&…

HF83311_VB1/HF83311Q_VB1:高性能USB HiFi音频解码器固件技术解析

引言随着高品质音频体验需求的不断增长&#xff0c;音频解码器固件的性能和功能成为决定音频设备品质的关键因素。本文将介绍一款基于XMOS XU316技术的高性能USB HiFi音频解码器固件——HF83311_VB1/HF83311Q_VB1&#xff0c;这是一款专为USB HiFi音频应用设计的软件解决方案。…