qt - 通过 GUI 线程进行的更改不会反映在 workerscript 中
问题描述
在下面的代码中,listmodel 在线程之间共享,并且设置了一个计时器来更新模型的值,这些更改应该在 workerscript ( docs ) 中反映(期望的行为)。但在 workerscript 中,它始终是初始值,因为它不知道数据已更改。
// 主文件
Window {
id: window
visible: true
width: 150
height: 200
title: qsTr("Hello Testing")
DataModel {
id: model
}
Timer {
interval: 1000
running: true
repeat: true
onTriggered: {
model.setProperty(0, 'datum', new Date().toLocaleString())
}
}
WorkerScript {
id: bgScript
source: "script.js"
}
Timer {
interval: 1000
running: true
repeat: true
onTriggered: {
bgScript.sendMessage({'model': model})
}
}
Text {
id: datum
text: qsTr(model.get(0).datum)
}
}
// 工人脚本
WorkerScript.onMessage = function (arg) {
console.log(arg.model.get(0).datum) // value is "Date Time" on every call
}
// 模型
ListModel {
ListElement {
datum: "Date Time"
}
}
解决方案
您将模型复制到 JS 对象中,并将该对象传递给 JS 函数。您将永远不会从 JS 函数中收到类似对象的更新通知。绑定仅适用于 QML 属性,不适用于 JS 值。
但即使这在一般情况下确实有效,它仍然无法在WorkerScript
. 根据文档,WorkerScript js 文件无权访问调用 QML 的属性。
由于 WorkerScript.onMessage() 函数在单独的线程中运行,因此 JavaScript 文件在与主 QML 引擎不同的上下文中进行评估。这意味着与导入QML的普通JavaScript文件不同,上例中的script.mjs不能访问QML项的属性、方法或其他属性,也不能通过QQmlContext访问QML对象上设置的任何上下文属性.
推荐阅读
- powershell - 我在 Azure Powershell(发布管道)中运行的这个 powershell 脚本中是否有一些我从根本上缺少的东西?
- bash - Bash字符串比较不断返回错误的结果
- pandas - 标签编码时保留顺序
- ios - 什么是处理“打盹”功能的好方法?
- javascript - 传单:使用移动设备在地图上获取 touchstart 或 touchmove 事件
- c++ - 为什么除了最后一帧反汇编的每一帧都没有调用命令
- c# - 将 json 嵌套数组解析为 c# 对象
- javascript - 打字稿:使用特殊字符访问接口键的嵌套对象值
- rabbitmq - Rabbitmq beam.smp 进程无缘无故地利用了大部分内存大小
- android - 抛出异常“打开失败:EROFS(只读文件系统)”