WorkerScript QML Type
在Qt Quick 应用程序中启用线程。更多
Import Statement: | import QtQml.WorkerScript |
属性
信号
- message(jsobject msg)
方法
- sendMessage(jsobject message)
详细说明
使用 WorkerScript 在新线程中运行操作。这有助于在后台运行操作,从而避免阻塞图形用户界面主线程。
可以使用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 }) } }
上述 Worker 脚本指定了一个 JavaScript 文件 "script.mjs",用于处理新线程中要执行的操作。下面是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 "扩展名。它可以使用导入语句访问其他模块的功能,并在 JavaScript 严格模式下运行。
如果 Worker 脚本的扩展名为".js",那么它将被视为包含纯 JavaScript 语句,并以非严格模式运行。
注意: 每个 WorkerScript 元素都将实例化一个单独的 JavaScript 引擎,以确保完美隔离和线程安全。如果这会导致内存消耗过大,不适合您的环境,那么请考虑共享一个 WorkerScript 元素。
限制条件
由于WorkerScript.onMessage()
函数是在独立线程中运行的,因此 JavaScript 文件是在独立于主 QML 引擎的上下文中进行评估的。这意味着,与导入 QML 的普通 JavaScript 文件不同,上例中的script.mjs
不能访问 QML 项目的属性、方法或其他属性,也不能访问通过QQmlContext 设置在 QML 对象上的任何上下文属性。
此外,可传入和传出 Worker 脚本的值类型也有限制。详情请查看sendMessage() 文档。
纯 JavaScript 源的 Worker 脚本不能使用.import语法。而作为 ECMAScript 模块的脚本则可以自由使用导入和导出语句。
属性文档
ready : bool |
此属性表示WorkerScript 是否已初始化,是否已准备好通过WorkerScript.sendMessage()
接收消息。
source : url |
该属性包含实现线程操作WorkerScript.onMessage()
处理程序的 JavaScript 文件的 URL。
如果 url 的文件名部分以".mjs "结尾,则脚本会被解析为 ECMAScript 模块并在严格模式下运行。否则,该脚本将被视为纯脚本。
信号文档
message(jsobject msg) |
当调用sendMessage() 从另一个线程中的 Worker 脚本接收到消息msg 时,会发出该信号。
注: 相应的处理程序是onMessage
。
方法文档
sendMessage(jsobject message) |
将给定的message 发送给另一个线程中的 Worker 脚本处理程序。另一个 Worker 脚本处理程序可通过 onMessage() 处理程序接收此消息。
message
对象只能包含以下类型的值:
- 布尔、数字、字符串
- JavaScript 对象和数组
- ListModel 对象(不允许使用QObject* 的任何其他类型)
所有对象和数组都会复制到message
。除 ListModel 对象外,其他线程对message
中传递的对象所做的任何修改都不会反映在原始对象中。
© 2025 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.