代码之家  ›  专栏  ›  技术社区  ›  JustWe

如何使可见属性在QML中立即工作?

  •  0
  • JustWe  · 技术社区  · 7 年前

    演示:

    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 回复  |  直到 7 年前
        1
  •  2
  •   eyllanesc Yonghwan Shin    7 年前

    重任务不应该在GUI线程中执行,而应该在另一个线程中执行,这样它们就不会被阻塞。qml提供给workerscript,这允许您在另一个线程中执行任务:

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

    主.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
        }
    }