WorkerScript访问Controller类

时间:2017-08-18 08:49:18

标签: c++ qt qml qtquick2 qtquickcontrols2

我有一个BusyIndi​​cator,它应该在重大计算发生时旋转,并在计算完成时停止。

我认为WorkerScript是正确的方法但是from here,似乎.js文件中的辅助(计算线程)无法访问主.qml线程的对象。

这是有问题的,因为我的所有计算都是通过由主线程实例化的Controller C ++定义的QObject执行的。

这是我的代码:

main.qml

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: uiController未在 importScanWorkerScript.js 中定义。

我应该理解WorkerScript只能处理简单的情况吗?

1 个答案:

答案 0 :(得分:1)

正如您已经注意到的,UITableViewDelegate无法访问UI控件。但是你的单独线程可以使用消息与主UI线程“对话”。至于我,其工作与所有其他语言/框架完全一样。只要您想要更新UI或对象,就可以从线程发送消息。 例如:

WorkerScript

所以您的主要qml可能如下所示:

WorkerScript.onMessage = function(message) {
    WorkerScript.sendMessage({ 'action': 'start' })
    // do some heavy task here
    WorkerScript.sendMessage({ 'action': 'finish', 'data': somedata })
}
相关问题