Доступ WorkerScript к классу Controller

У меня есть BusyIndicator, который должен вращаться, когда происходят тяжелые вычисления, и останавливаться, когда вычисления сделаны.

Я думал, что WorkerScript — верный путь, но отсюда, кажется, что вторичный (вычислительный поток) в файле .js не имеет доступа к объектам первичного потока .qml.

Это проблематично, поскольку все мои вычисления выполняются через QObject, определенный в C ++ контроллера, инстанцируемый основным потоком.

Вот мой код:

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 может обрабатывать только простые ситуации?

0

Решение

Как вы уже заметили, WorkerScript не может получить доступ к элементам управления пользовательского интерфейса. Но ваш отдельный поток может «общаться» с основным потоком пользовательского интерфейса, используя сообщения. Что касается меня, это работает точно так же, как и во всех других языках / фреймворках. Просто отправьте сообщение из цепочки всякий раз, когда вы хотите обновить пользовательский интерфейс или ваш объект.
Например:

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;
}
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]