QML- 在QML定义JavaScript资源

news/2024/7/19 14:21:04 标签: qml, js, Qml js, qt, qt5

在QML定义JavaScript资源

  • 一、概述
  • 二、后台代码实现文件
  • 三、共享JavaScript资源(库)

一、概述

QML应用程序的一部分程序逻辑可以用 JavaScript 定义。JavaScript代码可以在QML文档中内联定义,也可以分离到单独的 JavaScript 文件中(在QML中称为JavaScript资源)。
QML支持两种不同类型的JavaScript资源:后台代码实现文件和共享(库)文件。这两种JavaScript资源都可以被其他JavaScript资源导入,或者包含在QML模块中。

二、后台代码实现文件

导入到QML文档中的大多数JavaScript文件都是导入它们的QML文档的有状态实现。在这些情况下,文档中定义的QML对象类型的每个实例都需要一个单独的JavaScript对象和状态副本,以便正确地执行操作。

导入JavaScript文件时的默认行为是为每个QML组件实例提供一个唯一的、独立的副本。如果JavaScript文件没有使用.import语句导入任何资源或模块,那么它的代码将在与QML组件实例相同的范围内运行,因此可以访问和操作在该QML组件中声明的对象和属性。否则,它将有自己唯一的作用域,如果需要,QML组件的对象和属性应该作为参数传递给JavaScript文件的函数。
代码隐藏实现资源的示例如下:

  // MyButton.qml
  import QtQuick 2.0
  import "my_button_impl.js" as Logic // A new instance of this JavaScript resource
                                      // is loaded for each instance of Button.qml.

  Rectangle {
      id: rect
      width: 200
      height: 100
      color: "red"

      MouseArea {
          id: mousearea
          anchors.fill: parent
          onClicked: Logic.onClicked(rect)
      }
  }


  // my_button_impl.js
  var clickCount = 0;   // this state is separate for each instance of MyButton
  function onClicked(button) {
      clickCount += 1;
      if ((clickCount % 5) == 0) {
          button.color = Qt.rgba(1,0,0,1);
      } else {
          button.color = Qt.rgba(0,1,0,1);
      }
  }

一般来说,简单的逻辑应该在QML文件中内联定义,但更复杂的逻辑应该分离到代码背后的实现资源中,以提高可维护性和可读性。

三、共享JavaScript资源(库)

默认情况下,从QML导入的JavaScript文件与QML组件共享它们的上下文。这意味着JavaScript文件可以访问相同的QML对象并可以修改它们。因此,每次导入都必须有这些文件的唯一副本。

前一节介绍了JavaScript文件的有状态导入。然而,有些JavaScript文件是无状态的,更像是可重用库,因为它们提供了一组helper函数,不需要从导入它们的地方获取任何东西。如果使用特殊的pragma标记此类库,可以节省大量内存并加速QML组件的实例化,如下面的示例所示。

// factorial.js
  .pragma library

  var factorialCount = 0;

  function factorial(a) {
      a = parseInt(a);

      // factorial recursion
      if (a > 0)
          return a * factorial(a - 1);

      // shared state
      factorialCount += 1;

      // recursion base-case.
      return 1;
  }

  function factorialCallCount() {
      return factorialCount;
  }

pragma声明必须出现在除注释之外的任何JavaScript代码之前。

注意,多个QML文档可以导入“factorial.js”并调用它提供的 factorial 和 factorialCallCount 函数。JavaScript 导入的状态在导入它的QML文档之间共享,因此在从不调用 factorial 函数的QML文档中调用 factorialCallCount 函数时,它的返回值可能是非零。

例如:

// Calculator.qml
  import QtQuick 2.0
  import "factorial.js" as FactorialCalculator // This JavaScript resource is only
                                               // ever loaded once by the engine,
                                               // even if multiple instances of
                                               // Calculator.qml are created.

  Text {
      width: 500
      height: 100
      property int input: 17
      text: "The factorial of " + input + " is: " + FactorialCalculator.factorial(input)
}

由于它们是共享的,.pragma库文件不能直接访问QML组件实例对象或属性,尽管QML值可以作为函数参数传递。


http://www.niftyadmin.cn/n/147755.html

相关文章

【CSS】CSS 特性 ③ ( CSS 优先级 | 优先级引入 | 选择器基本权重 )

文章目录一、CSS 优先级1、优先级引入2、选择器基本权重3、完整代码示例一、CSS 优先级 1、优先级引入 定义 CSS 样式时 , 可能出现 多个 类型相同的 规则 定义在 同一个元素上 , 如果 CSS 选择器 相同 , 执行 CSS 层叠性 , 根据 就近原则 选择执行的样式 , 如 : 出现两个 div…

西米支付报告:2023年五大支付趋势,重点关注支付失败率

早前2月,律商联讯风险信息发布《支付失败的实际影响报告》,分析全球跨境付款的表现,剖释共400名付款行业行政主管的见解。受访者来自亚太地区、欧洲、中东、非洲、拉丁美洲和北美地区,并代表市场领先的企业和金融机构。 该报告显…

你是否有潜质成为谷歌开发者专家?加入 GDE 成长计划,释放潜力!

谷歌开发者专家 (Google Developer Experts,GDE),又称谷歌开发者专家项目,是由一群经验丰富的技术专家、具有社交影响力的开发者和思想领袖组成的全球性社区。通过在各项活动演讲以及各个平台上发布优质内容来积极助力开发者、企业和技术社区…

华为OD机试 -租车骑绿岛(Java) | 机试题+算法思路+考点+代码解析 【2023】

租车骑绿岛 题目 部门组织绿岛骑行团建活动。租用公共双人自行车骑行,每辆自行车最多坐两人、做大载重M。 给出部门每个人的体重,请问最多需要租用多少双人自行车。 输入 第一行两个数字m、n,自行车限重m,代表部门总人数n。 第二行,n个数字,代表每个人的体重。体重都…

华为OD机试 -斗地主(Java) | 机试题+算法思路+考点+代码解析 【2023】

斗地主 题目 斗地主起源于湖北十堰房县, 据传是一位叫吴修全的年轻人根据当地流行的扑克玩法“跑得快”改编的, 如今已风靡整个中国,并流行于互联网上 牌型: 单顺,又称顺子,最少5张牌,最多12张牌(3...A),不能有2, 也不能有大小王,不计花色 例如:3-4-5-7-8,7-8-9-1…

华为OD机试 -考古学家(Java) | 机试题+算法思路+考点+代码解析 【2023】

考古学家 题目 有一个考古学家发现一个石碑 但是很可惜 发现时其已经断成多段 原地发现N个断口整齐的石碑碎片 为了破解石碑内容 考古学家希望有程序能帮忙计算复原后的石碑文字组合数 你能帮忙吗 备注: 如果存在石碑碎片内容完全相同,则由于碎片间的顺序不影响复原后的碑…

华为OD机试 -字符串加密(Java) | 机试题+算法思路+考点+代码解析 【2023】

字符串加密 题目 给你一串未加密的字符串str, 通过对字符串的每一个字母进行改变来实现加密, 加密方式是在每一个字母str[i]偏移特定数组元素a[i]的量, 数组a前三位已经赋值:a[0]=1,a[1]=2,a[2]=4。 当i>=3时,数组元素a[i]=a[i-1]+a[i-2]+a[i-3], 例如:原文 abcde …

华为OD机试 -用连续自然数之和来表达整数(Java) | 机试题+算法思路+考点+代码解析 【2023】

用连续自然数之和来表达整数 题目 一个整数可以由连续的自然数之和来表示。给定一个整数,计算该整数有几种连续自然数之和的表达式,且打印出每种表达式。 输入描述: 一个目标整数T (1 <=T<= 1000) 输出描述: 该整数的所有表达式和表达式的个数。如果有多种表达式…