本页内容

WorkerScript QML Type

允许在Qt Quick 应用程序中使用线程。更多内容...

Import Statement: import QtQml.WorkerScript

属性

信号

方法

详细说明

使用 WorkerScript 在新线程中执行操作。这有助于在后台执行操作,从而避免阻塞主 GUI 线程。

可通过sendMessage()方法和onMessage() 处理程序在新线程与父线程之间传递消息。

示例:

import QtQuick

Rectangle {
    width: 300; height: 300

    Text {
        id: myText
        text: 'Click anywhere'
    }

    WorkerScript {
        id: myWorker
        source: "script.mjs"

        onMessage: (messageObject)=> myText.text = messageObject.reply
    }

    MouseArea {
        anchors.fill: parent
        onClicked: (mouse)=> myWorker.sendMessage({ 'x': mouse.x, 'y': mouse.y })
    }
}

上述工作脚本指定了一个名为“script.mjs”的 JavaScript 文件,该文件负责处理将在新线程中执行的操作。以下是 `script.mjs` 的实现:

WorkerScript.onMessage = function(message) {
    // ... long-running operations and calculations are done here
    WorkerScript.sendMessage({ 'reply': 'Mouse is at ' + message.x + ',' + message.y })
}

当用户点击矩形内的任意位置时,会调用sendMessage() ,从而触发script.mjs 中的WorkerScript.onMessage() 处理程序。该处理程序随后会发送一条回复消息,该消息随后会被myWorker 中的onMessage() 处理程序接收。

该示例使用了一个作为 ECMAScript 模块的脚本,因为它具有 ".mjs" 扩展名。它可以使用 import 语句访问其他模块的功能,并且在 JavaScript 严格模式下运行。

如果 worker 脚本的扩展名是 ".js",则会被视为包含普通 JavaScript 语句,并在非严格模式下运行。

注意:每个 WorkerScript 元素都会实例化一个独立的 JavaScript 引擎,以确保完全隔离和线程安全。如果由此导致的内存消耗超过了您环境的承受范围,请考虑共享一个 WorkerScript 元素。

限制

由于 `WorkerScript.onMessage() ` 函数在单独的线程中运行,因此该 JavaScript 文件是在与主 QML 引擎分离的上下文中执行的。 这意味着,与导入到 QML 中的普通 JavaScript 文件不同,上述示例中的 `script.mjs ` 无法访问 QML 项的属性、方法或其他特征,也无法通过 `QQmlContext` 访问设置在 QML 对象上的任何上下文属性。

此外,对工作线程脚本可传递的值类型存在限制。详情请参阅sendMessage() 的文档。

纯 JavaScript 源代码形式的 worker 脚本无法使用.import语法。而 ECMAScript 模块形式的脚本则可以自由使用 import 和 export 语句。

属性文档

ready : bool [read-only]

无论WorkerScript 是否已初始化,是否已准备好通过WorkerScript.sendMessage() 接收消息,此规则均适用。

source : url

此处存储了实现线程化操作的WorkerScript.onMessage() 处理程序的JavaScript文件的URL。

如果 URL 中文件名的后缀为 ".mjs",则该脚本将被解析为 ECMAScript 模块并在严格模式下运行。否则,它将被视为普通脚本。

Signal 文档

message(jsobject msg)

当通过调用sendMessage() 从另一个线程中的工作脚本接收到消息msg 时,会发出此信号。

注意: 相应的处理程序 为onMessage 。

方法文档

void sendMessage(jsobject message)

将给定的message 发送到另一个线程中的工作脚本处理程序。该工作脚本处理程序可通过onMessage()处理程序接收此消息。

message 对象只能包含以下类型的值:

  • boolean、number、string
  • JavaScript 对象和数组
  • ListModel 对象(不允许使用任何其他类型的QObject*)

所有对象和数组都会被复制到 `message` 中。除 ListModel 对象外,另一个线程对 `message ` 中传递的对象所做的任何修改都不会反映到原始对象上。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.