【问题标题】:Why does QML engine instantiate the same script multiple times?为什么 QML 引擎多次实例化同一个脚本?
【发布时间】:2017-02-27 20:47:36
【问题描述】:

假设我们有以下JS文件:

logic.js

function Car(){}

还有这些 QML 文件:

comp1.qml

import 'qrc:/js/logic.js' as Logic

Item{
    property var item: Logic
}

comp2.qml

import 'qrc:/js/logic.js' as Logic

Item{
    property var item: Logic
}

如果您运行和评估,您会发现那些 item 属性不相等。为什么?

在我的应用程序中,在一个 QML 文件中,我 new 一个对象并想检查它是否是 instanceof 构造函数,但由于这些构造函数不相等(因为那些 Logics 't), instanceof 运算符总是返回 false

【问题讨论】:

  • 限定符和 JavaScript 文件之间总是存在一对一的映射关系。我认为这就是为什么Logics 是不同的。
  • 您可能会尝试使用 QML-Singleton-File,在其中导入 js 文件并拥有您的属性。然后你导入这个单例。

标签: javascript qt qml


【解决方案1】:

Code-Behind Implementation Resource 文档解释了这种行为:

大多数导入 QML 文档的 JavaScript 文件是导入它们的 QML 文档的有状态实现。在这些情况下,文档中定义的 QML 对象类型的每个实例都需要 JavaScript 对象和状态的单独副本才能正常运行。

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

解决方案是将.pragma library 放在 JavaScript 文件的顶部。这将允许它被多个 QML 文件共享。

下一节,Shared JavaScript Resources (Libraries) 将对此进行更详细的介绍。

【讨论】:

  • 当前有一个Bug (Qt5.13),所以“.pragma library”经常不起作用,尤其是与Qt Quick Compiler一起使用
  • 如果有错误报告,你应该把它放在这里,这样人们可以检查它什么时候修复。
  • 好点,给你:bugreports.qt.io/browse/QTBUG-42102 它说 Qt5.4,但我用 Qt5.13 体验过。请注意,单例以相同的方式受到影响(尚未发现错误)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-30
  • 2010-12-14
  • 2017-01-10
  • 2016-01-08
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多