C++ WorkerScript对控制器类的访问
我有一个BusyIndicator,它应该在繁重的计算发生时旋转,在计算完成时停止 我认为WorkerScript是正确的方法,但是,似乎.js文件中的次要线程(计算线程)没有访问主要.qml线程对象的权限 <>这是个问题,因为所有的计算都是通过一个由主线程实例化的控制器C++对象来执行的。 这是我的密码: main.qmlC++ WorkerScript对控制器类的访问,c++,qt,qml,qtquick2,qtquickcontrols2,C++,Qt,Qml,Qtquick2,Qtquickcontrols2,我有一个BusyIndicator,它应该在繁重的计算发生时旋转,在计算完成时停止 我认为WorkerScript是正确的方法,但是,似乎.js文件中的次要线程(计算线程)没有访问主要.qml线程对象的权限 这是个问题,因为所有的计算都是通过一个由主线程实例化的控制器C++对象来执行的。 这是我的密码: main.qml import QtQuick 2.7 import QtQuick.Layouts 1.3 import QtQuick.Window 2.2 import QtQuick.C
import QtQuick 2.7
import QtQuick.Layouts 1.3
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
import QtQuick.Controls.Material 2.0
import QtQuick.Controls.Styles 1.2
import QtQuick.Dialogs 1.2
import LcQml 1.0
ApplicationWindow
{
id: window
UiController
{
id: uiController
}
WorkerScript
{
id: importScanWorkerScript
source: "importScanWorkerScript.js"
onMessage:
{
busyIndicator.running = false;
}
}
FileDialog
{
id: importScanDialog
visible: false
title: "Import a [scan] file"
folder: "MyScannedScenesFolder"
nameFilters: [ "STL files (*stl)" ]
selectedNameFilter: "STL files (*stl)"
onAccepted:
{
importScanWorkerScript.sendMessage({'filepath': importScanDialog.fileUrl})
busyIndicator.running = true;
}
}
BusyIndicator
{
id: busyIndicator
running: false
anchors.centerIn: parent
}
}
importScanWorkerScript.js
WorkerScript.onMessage = function(message)
{
uiController.onImportScanDevMenuClicked(message.filepath);
WorkerScript.sendMessage()
}
Pb:importScanWorkerScript.js中未定义uiController
我应该理解WorkerScript只能处理简单的情况吗?正如您已经注意到的,
WorkerScript
无法访问UI控件。但是您的独立线程可以使用消息与主UI线程“对话”。对我来说,这与所有其他语言/框架的工作原理完全相同。只要在需要更新UI或对象时从线程发送消息即可。
例如:
WorkerScript.onMessage = function(message) {
WorkerScript.sendMessage({ 'action': 'start' })
// do some heavy task here
WorkerScript.sendMessage({ 'action': 'finish', 'data': somedata })
}
因此,您的主要qml可能如下所示:
WorkerScript {
id: myWorker
source: "func.js"
onMessage: {
switch(messageObject.action)
{
case 'start':
spinner.running = true;
uiController.doSomething();
break;
case 'finish':
spinner.running = false;
uiController.doSomethingAnother();
break;
}
}
}
根据您的建议,uiController.doSomething()和uiController.doSomethingAther()在UI线程中处理,不是吗?在我的例子中,uiController.doSomething()和uiController.doSomethingAnother()是实际的重功能,应该是后台线程中的计算机…啊,好的,现在我看到了。这里最好的方法是使用C++中的QToX来运行繁重的任务。用JavaScript代码运行C++任务是没有意义的,尽管不能将对象传递到WorkScript中。我不确定我理解到Word脚本是否有用。谁想在js中执行重减刑?无论如何,非常感谢你的帮助!