Как заставить видимое свойство работать сразу в QML? - PullRequest
0 голосов
/ 28 июня 2018

Демо-версия:

Window {
    visible: true
    width: 640
    height: 480

    Component.onCompleted: {
        test.visible = true // 1. Show rect
        for(var i = 0; i < 5000000000; i++){var t = i * i} // 2. Slow process, Sleep here
    }

    Rectangle {
        id: test
        color: "red"
        width: 100; height: 100
        visible: false
    }
}

Свойство visible работает после завершения функции. В демонстрационной версии прямоугольник test не может отображаться в данный момент после 1., необходимо дождаться завершения функции.

Я так понимаю, это должно вызывать рендеринг блоков процесса. Но есть ли уловка, чтобы решить эту проблему?

1 Ответ

0 голосов
/ 28 июня 2018

Тяжелые задачи должны выполняться не в потоке графического интерфейса, а в другом потоке, чтобы они не блокировались. QML предлагает WorkerScript, это позволяет вам выполнять задачи в другом потоке:

slow_process.js

WorkerScript.onMessage = function() {
    for(var i = 0; i < 5000000000; i++){
        var t = i * i
        console.log(t)
    }
}

main.qml

import QtQuick 2.9
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480

    Component.onCompleted: {
        test.visible = true // 1. Show rect
        ws.sendMessage()
    }

    WorkerScript {
        id: ws
        source: "slow_process.js"
    }

    Rectangle {
        id: test
        color: "red"
        width: 100; height: 100
        visible: false
    }
}
...