【问题标题】:How to make visible property work immediately in QML?如何使可见属性在 QML 中立即起作用?
【发布时间】:2018-06-28 00:14:19
【问题描述】:

演示:

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

可见属性在功能完成时起作用。在演示中,test 矩形在1. 之后暂时无法显示,必须等待功能完成。

我知道这应该是由进程块渲染引起的。但是有什么技巧可以解决这个问题吗?

【问题讨论】:

    标签: qt qml qt5


    【解决方案1】:

    繁重的任务不应在 GUI 线程中执行,而应在另一个线程中执行,以免被阻塞。 QML 提供给 WorkerScript,这允许您在另一个线程中执行任务:

    slow_process.js

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

    ma​​in.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
        }
    }
    

    【讨论】:

    • 还有一个小问题,我对 WorkerScript 不熟悉...可以访问主线程中的 const 数据吗?只读。在脚本处理过程中,我需要使用一些从 C++ 公开的配置数据。
    • @Jiu 和sendMessage(config1, config2, ..., confign) WorkerScript 复制值,也就是说,你可以向它传递数据。最好的了解方法是尝试阅读文档:)
    • 所以我必须复制值,直接读取配置对象的属性是个坏主意。
    • 不,我的意思是 WorkScript 会像普通 C++ 函数那样复制值。
    • 好的,WorkScript 将参数作为值传递。
    猜你喜欢
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 2018-05-29
    • 2013-01-18
    相关资源
    最近更新 更多