QML教程(七) JavaScript

news2024/10/5 17:45:28

目录

一、对属性值使用 JavaScript 表达式

二、在 QML 中添加 JavaScript 函数

三、使用 JavaScript 文件

四、属性绑定中的 JavaScript

五、信号处理程序中的 JavaScript

六、将信号连接到 JavaScript 函数

七、启动执行 JavaScript


QML 提供的 JavaScript 主机环境可以运行有效的标准 JavaScript表达式,例如条件运算符、数组、变量设置和循环。除了标准的 JavaScript 属性之外,QML 全局对象还包括许多帮助程序方法,这些方法简化了构建 UI 和与 QML 环境的交互。

QML提供的JavaScript环境比Web浏览器中的环境更严格。例如,在 QML 中,您不能添加或修改 JavaScript 全局对象的成员。在常规 JavaScript 中,可以通过使用变量而不声明它来意外执行此操作。在 QML 中,这将引发异常,因此必须显式声明所有局部变量。请参阅 JavaScript 环境限制,了解从 QML 执行的 JavaScript 代码限制的完整描述。JavaScript 主机环境|Qt QML 6.4.1icon-default.png?t=MBR7https://doc.qt.io/qt-6/qtqml-javascript-hostenvironment.html#javascript-environment-restrictions

QML文档的各个部分可以包含JavaScript代码:

属性绑定的主体。这些 JavaScript 表达式描述了 QML 对象属性之间的关系。当属性的依赖项更改时,该属性也会根据指定的关系自动更新。
信号处理程序的主体。每当 QML 对象发出相关信号时,都会自动计算这些 JavaScript 语句。
自定义方法的定义。在 QML 对象主体中定义的 JavaScript 函数成为该对象的方法。
独立的 JavaScript 资源 (.js) 文件。这些文件实际上与 QML 文档是分开的,但它们可以导入到 QML 文档中。导入文件中定义的函数和变量可用于属性绑定、信号处理程序和自定义方法。

 

一、对属性值使用 JavaScript 表达式

Item {
    width: Math.random()
    height: width < 100 ? 100 : (width + 50) /  2
}

二、在 QML 中添加 JavaScript 函数

import QtQuick

Item {
    id: container
    width: 320
    height: 480

    function randomNumber() {
        return Math.random() * 360;
    }

    function getNumber() {
        return container.randomNumber();
    }

    TapHandler {
        // This line uses the JS function from the item
        onTapped: rectangle.rotation = container.getNumber();
    }

    Rectangle {
        color: "#272822"
        width: 320
        height: 480
    }

    Rectangle {
        id: rectangle
        anchors.centerIn: parent
        width: 160
        height: 160
        color: "green"
        Behavior on rotation { RotationAnimation { direction: RotationAnimation.Clockwise } }
    }

}

三、使用 JavaScript 文件

// myscript.js
function getRandom(previousValue) {
    return Math.floor(previousValue + Math.random() * 90) % 360;
}
import QtQuick
import "myscript.js" as Logic

Item {
    width: 320
    height: 480

    Rectangle {
        color: "#272822"
        width: 320
        height: 480
    }

    TapHandler {
        // This line uses the JS function from the separate JS file
        onTapped: rectangle.rotation = Logic.getRandom(rectangle.rotation);
    }

    Rectangle {
        id: rectangle
        anchors.centerIn: parent
        width: 160
        height: 160
        color: "green"
        Behavior on rotation { RotationAnimation { direction: RotationAnimation.Clockwise } }
    }

}

四、属性绑定中的 JavaScript

import QtQuick 2.12

Rectangle {
    id: colorbutton
    width: 200; height: 80;

    color: inputHandler.pressed ? "steelblue" : "lightsteelblue"

    TapHandler {
        id: inputHandler
    }
}

任何 JavaScript 表达式(无论多么复杂)都可以在属性绑定定义中使用,只要表达式的结果是其类型可以分配给属性的值。但是,不建议使用复杂的绑定和副作用,因为它们会降低代码的性能、可读性和可维护性。

有两种方法可以定义属性绑定:最常见的方法在前面的示例中的属性初始化中显示。第二种(也是更罕见的)方法是从命令式 JavaScript 代码中为属性分配一个从 Qt.binding() 函数返回的函数,如下所示:

import QtQuick 2.12

Rectangle {
    id: colorbutton
    width: 200; height: 80;

    color: "red"

    TapHandler {
        id: inputHandler
    }

    Component.onCompleted: {
        color = Qt.binding(function() { return inputHandler.pressed ? "steelblue" : "lightsteelblue" });
    }
}

五、信号处理程序中的 JavaScript

QML 对象类型可以发出信号以响应发生的某些事件。这些信号可以由信号处理程序函数处理,客户端可以定义这些函数以实现自定义程序逻辑。

假设由矩形类型表示的按钮具有 TapHandler 和文本标签。当用户按下按钮时,点击处理程序会发出其点击信号。客户端可以使用 JavaScript 表达式对处理程序中的信号做出反应。QML 引擎根据需要执行处理程序中定义的这些 JavaScript 表达式。通常,信号处理程序绑定到 JavaScript 表达式以启动其他事件或分配属性值。

import QtQuick 2.12

Rectangle {
    id: button
    width: 200; height: 80; color: "lightsteelblue"

    TapHandler {
        id: inputHandler
        onTapped: {
            // arbitrary JavaScript expression
            console.log("Tapped!")
        }
    }

    Text {
        id: label
        anchors.centerIn: parent
        text: inputHandler.pressed ? "Pressed!" : "Press here!"
    }
}

六、将信号连接到 JavaScript 函数

发出信号的 QML 对象类型还为其信号提供默认信号处理程序。但是,有时客户端希望在另一个 QML 对象发出信号时触发在 QML 对象中定义的函数。这种情况可以通过信号连接来处理。QML 对象发出的信号可以通过调用信号的方法并将 JavaScript 函数作为参数传递来连接到 JavaScript 函数。例

// script.js

function jsFunction() {
    console.log("Called JavaScript function!")
}
import QtQuick 2.12
import "script.js" as MyScript

Item {
    id: item
    width: 200; height: 200

    TapHandler {
        id: inputHandler
    }

    Component.onCompleted: {
        inputHandler.tapped.connect(MyScript.jsFunction)
    }
}

七、启动执行 JavaScript

有时需要在应用程序(或组件实例)启动时运行一些命令性代码。虽然将启动脚本作为全局代码包含在外部脚本文件中很诱人,但由于 QML 环境可能尚未完全建立,这可能会有严重的限制。例如,某些对象可能尚未创建,或者某些属性绑定可能尚未建立。

QML 对象在其实例化完成时发出附加的信号。相应处理程序中的 JavaScript 代码在对象实例化后运行。因此,编写应用程序启动代码的最佳位置是顶级对象的处理程序,因为此对象在完全建立 QML 环境时发出。

import QtQuick 2.0

Rectangle {
    function startupFunction() {
        // ... startup code
    }

    Component.onCompleted: startupFunction();
}

QML 文件中的任何对象(包括嵌套对象和嵌套的 QML 组件实例)都可以使用此附加属性。如果在启动时要执行多个处理程序,则它们将按未定义的顺序顺序运行。onCompleted()

同样,每个在被摧毁之前都会发出一个 destruction() 信号

 

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

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

相关文章

算法学习-并查集(持续更新中)

本文参考&#xff1a; 最容易理解的并查集详解 详解&#xff1a;并查集&#xff08;Union-Find&#xff09; 「代码随想录」684. 冗余连接:【并查集基础题目】详解&#xff01; 并查集从入门到出门 并查集常常在做图相关的题目时冒出来&#xff0c;但是笔者经常去回避这样的解法…

Exynos_4412——轮询与中断

目录 一、CPU与硬件的交互方式 1.1轮询 1.2中断 1.3DMA 二、轮询方式的按键实验 三、GPIO中断相关寄存器 四、GPIO中断编程 五、小作业 一、CPU与硬件的交互方式 1.1轮询 CPU执行程序时不断地询问硬件是否需要其服务&#xff0c;若需要则给予其服务&#xff0c;若不需…

Android Jetpack Compose——一个简单的微信界面

一个简单的微信界面简述效果视频底部导航栏导航元素导航栏放入插槽绘制地图消息列表效果图实现聊天效果图实现气泡背景联系人界面效果图实现好友详情效果图实现发现效果图实现未读红点未读条数朋友圈效果图实现上拉加载个人设置效果图实现个人信息功能区钱包效果图实现切换主题…

【Vue】项目搭建规范

1. 集成editorconfig配置 EditorConfig 有助于为不同 IDE 编辑器上处理同一项目的多个开发人员维护一致的编码风格。 VSCode需要安装一个插件&#xff1a;EditorConfig for VS Code 创建 .editorconfig 文件&#xff1a; # http://editorconfig.orgroot true[*] # 表示所有文…

js Proxy 的使用

文章目录一、什么是Proxy二、语法三、Proxy 方法1、get() 方法2、set() 方法3、apply() 方法4、has() 方法5、construct() 方法6、deleteProperty() 方法一、什么是Proxy Proxy 可以理解成&#xff0c;在目标对象之前架设一层“拦截”&#xff0c;外界对该对象的访问&#xff…

[Vulnhub] DC-2

Vlunhub下DC系列靶机第二台&#xff0c;难度与DC-1 差不多&#xff0c;为简单。共有五个Flag 下载地址&#xff1a;Vulnhub:DC-2 目录 信息搜集 cewl爬行网站字典&hydra爆破wordpress用户密码 -rbash逃逸 git提权 信息搜集 nmap -sP 192.168.236.0/24 扫描一下靶机i…

c++语法欠缺地方(持续更新)

sizeof是用来计算变量占多大内存的&#xff0c;单位是字节&#xff08;byte&#xff09;&#xff1b;sizeof 后面跟类型时&#xff0c;必须加上括号&#xff0c;例如sizeof(double);后面跟变量可以不用加括号&#xff0c;例如&#xff1a;sizeof d %d是以十进制形式输出有符号…

hadoop之kerberos权限配置(ranger基础上)(三)

文章目录一、kerberos服务端二、kerberos客户端三、hadoop集群安装HTTPS服务四、kerberos整合zk五、kerberos整合ranger六、kerberos整合hdfs七、kerberos整合yarn八、kerberos整合hive九、kerberos整合hbase十、遇到的问题一、kerberos服务端 上传kerberos安装包到/opt/rpm 安…

数据库,计算机网络、操作系统刷题笔记22

数据库&#xff0c;计算机网络、操作系统刷题笔记22 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

最值得推荐的3个免费PDF 转换器

当您需要将 PDF 转换为另一种格式&#xff08;如 Microsoft Word、图像&#xff08;如 JPG&#xff09;、Excel、电子书、PowerPoint 等&#xff0c;反之亦然&#xff09;时&#xff0c;最好的 PDF 转换器非常重要。 但是找到一个可靠的 PDF 转换软件来使用是具有挑战性的。因…

JAVA设计模式--行为型模式--策略模式

1.策略模式&#xff08;Strategy Pattern&#xff09; 1.1介绍 一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中&#xff0c;我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对…

【C++】网络编程(TCPUDP)

网络编程是C API操作中很重要的一部分&#xff0c;包含TCP和UDP。 网络传输模型可以抽象为7个层&#xff1a;物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。 但在使用TCP/IP协议时&#xff0c;可以简化为这4层&#xff1a;网络接口、网络层、传输层、应用层。…

物理层基本概念

目录物理层的基本概念物理层传输方式串行传输并行传输同步传输异步传输单向通信&#xff08;单工&#xff09;双向交替通信&#xff08;半双工&#xff09;双向同时通信&#xff08;全双工&#xff09;编码与调制常用编码基本调制方法信道极限容量物理层的基本概念 物理层考虑的…

路由 OSPF常见4种网络类型MA、P2P、NBMA、P2MP、OSPF报头字段信息简介。

4.2.1 路由 OSPF&#xff08;OSPF常见4种网络类型、OSPF报头信息&#xff09; 目录OSPF常见的4种网络类型广播类型&#xff08;Broadcast 或 MA&#xff09;P2PNBMAP2MPOSPF报文发送形式对于不同OSPF网络类型的组网OSPF报头信息实际抓包分析OSPF常见的4种网络类型 OSPF应用于不…

Kali最强渗透工具- metasploit

数据来源 本文仅用于信息安全学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 metasploit是什么&#xff1f; msf是一款开源安全漏洞利用和测试工具&#xff0c;集成了…

C++GUI之wxWidgets(9)-编写应用涉及的类和方法(4)-事件处理(3)

目录动态事件处理如何处理事件事件如何向上传播事件处理程序链动态事件处理 void MyFrameHandler::OnFrameExit(wxCommandEvent&) {// Do something useful. }MyFrameHandler myFrameHandler;MyFrame::MyFrame() {Bind(wxEVT_MENU, &MyFrameHandler::OnFrameExit,&…

Java数组的定义与使用

Java数组的定义与使用 文章目录Java数组的定义与使用数组的基本概念什么是数组数组的创建数组的初始化数组的使用数组中元素访问遍历数组数组是引用类型初始JVM的内存分布基本类型变量与引用类型变量的区别引用变量几道例题认识null数组的应用场景保存数据作为函数的参数参数传…

TypeScript中的泛型

泛型&#xff08;Generics&#xff09;是指在定义函数、接口或类的时候&#xff0c;不预先指定具体的类型&#xff0c;而在使用的时候再指定类型的一种特性。 通常用T来指代任意输入的类型&#xff0c;除了T之外&#xff0c;以下是常见泛型变量代表的意思&#xff1a; K(Key…

信息安全技术 可信计算规范 可信平台控制模块 学习笔记(一)

声明 本文是学习信息安全技术 可信计算规范 可信平台控制模块. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 可信计算规范 缩略语 下列缩略语适用于本文件。 I/O&#xff1a;输入输出&#xff08;Input/Output&#xff09; IP&#xff1…

第三十八章 贪心算法——区间问题及证明(上)

第三十八章 贪心策略——区间相关问题一、什么贪心策略&#xff1f;二、区间问题合集1、思路&#xff1a;2、问题1&#xff1a; 区间选点&#xff08;1&#xff09;问题&#xff08;2&#xff09;思路和证明a.思路b.证明&#xff08;3&#xff09;代码3、问题2&#xff1a;&…