【QT Quick】函数与信号处理:QML函数定义与调用

news2024/10/8 18:08:32

本节课讲解了如何在 QML 6 中定义和调用函数,探讨了函数与属性、JS 函数的关系,以及它们在不同场景中的使用方法。我们将按照以下内容展开详细教程:

QML 函数基本特征

  • QML 6 中函数作为属性的一部分存在,类似 C++ 的成员函数。
  • 函数可以包含参数和返回值,但这些都是可选的。
  • QML 6 和 JS 函数互相兼容,但 JS 函数不支持 QML 类型,因此当函数调用跨到 JS 层时,通常使用 var 类型或不指定类型。

QML 6 函数定义格式

  • 函数的名称必须以小写字母开头,符合语法格式要求。

  • 可以定义参数类型和返回值类型,格式如下:

    function 函数名(参数1: 参数类型, 参数2: 参数类型): 返回值类型 {
        // 函数体
        return 返回值;
    }
    

与 JS 函数的区别

  • JS 函数灵活,但没有强类型检查,而 QML 函数可以指定类型。
  • JS 函数与 QML 函数通过 import 模块互相调用。QML 通过 ID 来访问不同层次的函数,JS 则通过模块名访问。

函数调用的两种方式

  • 直接调用:通过 ID 或当前作用域直接调用。
  • 作为属性赋值:QML 属性可以赋值为一个函数,返回值将影响属性值。

函数指针与回调机制

  • QML 6 中函数也可作为变量传递,类似 C++ 中的函数指针。此特性允许实现回调机制,用于动态重构函数逻辑。

示例代码讲解

定义简单函数

我们首先在 QML 中定义一个简单函数:

import QtQuick
import QtQuick.Controls

Rectangle {
    width: 200
    height: 100
    id: root
    
    function testFunction(index: int, str: string): int {
        console.log("Called with index:", index, "and str:", str)
        return 1001
    }
    
    Button {
        text: "Call Function"
        anchors.centerIn: parent
        onClicked: {
            let result = root.testFunction(99, "Hello")
            console.log("Function returned:", result)
        }
    }
}

调用与返回值

  • 在按钮点击时调用函数 testFunction,并传递参数 99"Hello"
  • 输出函数返回的值 1001
Button {
    text: "Call Function"
    onClicked: {
        let result = root.testFunction(99, "Hello")
        console.log("Function returned:", result)
    }
}

使用 JS 文件定义函数

可以将函数定义在独立的 JS 文件中,并通过 QML 调用:

  1. 在 QML 中引入 JS 文件:

    import "myFunctions.js" as MyFunctions
    
  2. myFunctions.js 中定义函数:

    function externalFunction(arg) {
        console.log("External function called with arg:", arg)
        return arg.length
    }
    
  3. 调用方式:

    onClicked: {
        let length = MyFunctions.externalFunction("Hello from JS")
        console.log("Length returned:", length)
    }
    

通过属性调用函数

我们可以将属性赋值为一个函数,从而动态决定属性值:

Text {
    text: getTitle()
    
    function getTitle(): string {
        return "Dynamic Title"
    }
}

多层次与函数作用域

在复杂的组件层次中,使用 ID 来确保正确调用:

Item {
    id: parentItem
    
    Rectangle {
        id: childItem
        function childFunction() {
            console.log("Called child function")
        }
    }
    
    Button {
        text: "Call Child Function"
        onClicked: {
            childItem.childFunction()
        }
    }
}

动态函数重写

通过属性和函数指针实现函数重构:

Rectangle {
    width: 200
    height: 100
    id: root
    
    function defaultFunction() {
        console.log("Default function")
    }
    
    var currentFunction = defaultFunction
    
    Button {
        text: "Call Function"
        onClicked: {
            root.currentFunction()
        }
    }
    
    Component.onCompleted: {
        // 动态修改函数指针
        root.currentFunction = function() {
            console.log("New function called")
        }
    }
}

总结

  • 函数可以作为属性,具备灵活的参数和返回值类型。
  • 在复杂项目中,使用 ID 明确调用目标,保证函数的作用域正确。
  • QML 函数的语法与 JS 兼容,但在类型检查方面,QML 提供了更多的安全性。
  • 可以通过属性赋值将函数作为属性,利用其返回值动态设置属性值。

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

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

相关文章

(笔记)第三期书生·浦语大模型实战营(十一卷王场)–书生基础岛第6关---OpenCompass 评测 InternLM-1.8B 实践

学员闯关手册:https://aicarrier.feishu.cn/wiki/ZcgkwqteZi9s4ZkYr0Gcayg1n1g?open_in_browsertrue 课程视频:https://www.bilibili.com/video/BV1RM4m1279j/ 课程文档: https://github.com/InternLM/Tutorial/blob/camp3/docs/L1/OpenComp…

嵌入式设备硬件和软件安全设计

1. 引言 哪个领域的网络安全实施记录最差? 既不是 PKI/数字证书,也不是 密钥管理,也不是 OAuth。很可能是嵌入式设备和物联网 领域。 总的来说,这似乎是一个梦想,但如果可设计出“设计安全”的系统,而不…

转行大模型开发,能不能挽救职业生涯?

大模型算是当之无愧最火的一个方向了,算是新时代的风口。有小伙伴觉得,既然是新领域、新方向,那么,人才需求肯定比较大,相应的人才缺乏,竞争也会更少,那转行去做大模型是不是一个更好的选择呢&a…

硬盘数据恢复的方法有哪几种?9种妙招速览

在当今数字化时代,硬盘数据的安全至关重要。然而,数据丢失的情况时有发生,掌握硬盘数据恢复方法显得尤为重要。本文将详细介绍几种有效的硬盘数据恢复方法,帮助用户在遇到数据丢失问题时,能够迅速采取措施,…

Visual studio2019+PCL1.11.1+win10

目录 一.软件下载1.visual studio2019下载2.PCL下载二.安装步骤1.安装PCL1.11.0步骤2.解压pcl-1.11.0-pdb-msvc2019-win64.zip3.安装OpenNI-Windows-x64-2.2.msi4. 设置环境变量5.visual studio2019配置6.双击新添加的属性表—VC++目录—包含目录,添加7个include路径7.测试代码…

幸运7游戏模拟 python

题目: 幸运"7"游戏,用计算机模拟掷骰子的过程,测算两个骰子点数之和为7的概率。 游戏规则是你丢两个骰子,如果其点数之和为7你就赢4元,不是7你就输1元。 假设你刚开始有10元,当全部输掉为0元的时候游戏结…

阿里云云虚拟主机SSL证书安装指南

在安装SSL证书的过程中,您需要确保已经正确获取了SSL证书文件,并且能够访问阿里云云虚拟主机的管理页面。以下是详细的步骤说明: 第一步:准备SSL证书 申请SSL证书:访问华测ctimall网站(https://www.ctimal…

Cloud-Edge-Terminal Collaborative AIGC for Autonomous Driving

摘要 在动态自动驾驶环境中,人工智能生成内容(AIGC)技术可以通过利用模型的生成和预测能力来补充车辆感知和决策,并有可能增强运动规划,轨迹预测和交通模拟。本文提出了一种云-边缘-终端协同架构,以支持AI…

【SQL】Windows MySQL 服务查询启动停止自启动(保姆级)

MySQL是一种开放源代码的轻量级关系型数据库管理系统,使用最常用的结构化查询语言(SQL)对数据库进行管理。由于MySQL具有体积小、速度快、成本低、开放源码等优点,现已被广泛应用于互联网上的中小型网站中,并且大型网站…

sqlserver-合理化CTFP(cost threshold for parallelism)

文章目录 About CTFPCTFP 默认值的意义合理化CTFP值1.查看高使用次数的执行计划2.调整CTFP值 About CTFP CTFP (Cost Threshold for Parallelism) 是 SQL Server 中的一项配置,用于控制查询执行计划何时使用并行处理。具体来说,它表示执行计划的“子树成…

Python系统教程005(字符串的格式化输出)

知识回顾 1、默认情况下,input函数接收的数据是字符串类型。 2、字符串类型的关键词是str。 3、\n和\t都是转义字符,\n用来换行,\t用来留出一段固定长度的空白。 4、type函数能够用来查看变量的数据类型 5、数据类型的转换,举…

MySQL从0到1基础语法笔记(上)

博客主页:誓则盟约系列专栏:Java Web关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 目录 MySQL笔记: 一、注释: 二、SQL四大类&#xff…

鸿蒙开发(NEXT/API 12)【应用加密】程序访问控制

能力简介 为了保护应用代码安全,保护开发者的核心资产,HarmonyOS提供了端到端的应用代码保护机制,该机制以系统安全为基础,构建内核级应用生命周期内的代码安全保护能力。 开发者向应用市场提交上架申请,上传应用包后…

<Rust>iced库(0.13.1)学习之番外:如何为窗口添加初始值?

前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 注:新版本已更新为0.13 概述 这是本专栏的番外篇,主要介绍一下新…

国产测径仪的发展历史

关键字:国产测径仪,进口测径仪,蓝鹏测控,测径仪厂家,测径仪品牌 国产测径仪的发展史是一段从引进技术到自主创新、从依赖进口到逐步国产替代的历程。以下是国产测径仪发展史上的几个关键阶段和里程碑: 起步与引进阶段 在早期,国内测径仪技术相对落后&a…

AI Agent现状:为何企业落地AI应用这么难

本文旨在探讨一个关键问题:为何在企业AI应用场景中,大模型应用在用户眼中显得乏善可陈,以至于未能激发出足够的实施意愿。简要来说,当前大多数文本相关应用所提供的智能增值不足,用户需要至少100次以96%准确率进行的LL…

虚拟化数据恢复—互斥不当导致vmfs卷损坏的数据恢复案例

虚拟化数据恢复环境: 某企业信息管理平台, 几台VMware ESX Server主机共享一台存储设备,大约有几十台虚拟机。 虚拟化故障&原因: Vcenter报告虚拟磁盘丢失。管理员通过ssh远程到ESX中执行fdisk -l命令查看磁盘,发…

第二十天|二叉搜索树的公共祖先,修改与构造| 235. 二叉搜索树的最近公共祖先, 701. 二叉搜索树中的插入操作,450. 删除二叉搜索树中的节点

关于二叉搜索树的题目,貌似普遍用迭代法比递归法简单。目前做到的除了98验证二叉搜索树都是如此。 701其实很简单,只是之前自己想不到直接添加到叶子节点这个方法。 注意一个问题:判断需要返回 root 还是 newRoot 返回 root:当操…

超好用的数据库连接工具-DBeaver连接ClickHouse后找不到系统表?

一、前言 公司内部禁止使用Navicat,又不想装JetBrains的DataGrip。找了半天找到这款完全开源的数据库连接工具,几乎可以连接市面上所有的数据库,功能非常强大 二、工具简介 对关系数据库的基本支持:MySQL、SQL Server、PostgreS…

双十一好物清单!这5款高端又实用的双十一好物千万别错过!

随着双十一购物狂欢节的临近,空气中开始弥漫着一股热烈而兴奋的购物气氛。在这个日子里,商品的折扣与优惠的都比较大,很多人都想挑选一款产品,但是,面对琳琅满目的好物,如何选择变成了一个难题,…