加载重qml文件时QML BusyIndi​​cator

时间:2016-11-08 10:01:40

标签: qt qml loader busyindicator

在我加载qml文件(http://doc.qt.io/qt-5/qml-qtquick-controls-busyindicator.html)时,我一直在尝试运行BusyIndi​​cator(http://doc.qt.io/qt-5/qml-qtquick-loader.html),但BusyIndi​​cator没有出现。

我想做的是: 1-用户发出“handlerLoader(name)”,其中“name”是下一个qml页面的url。 2-在“onHandlerLoader”中我运行busyIndi​​cator。 3-然后,我更改了Loader源。

问题在于,无论我在第2步和第3步之间花费的时间,BusyIndi​​cator都不会出现。

此外,当我评论第3步时,busyIndi​​cator正确显示。

我做错了什么?

谢谢!

这是代码:

Rectangle {

    visible: true
    width: 800
    height: 480
    signal handlerLoader (string name)
    Loader {
        id: pageLoader;
        source: "init.qml";
    }

    BusyIndicator {
        id: busyIndicator_inicio
        width: 100
        height: 100
        anchors.centerIn: parent
        running: false
    }

    Connections {
        target: pageLoader.item
        onHandlerLoader: {
             busyIndicator_inicio.running = true
             pageLoader.source = name;
        }
    }
}

1 个答案:

答案 0 :(得分:4)

原因是,你的重负载Loader阻塞了线程。 将其设置为异步模式,以允许程序的其余部分运行。 此外,我建议更喜欢声明性绑定到处理程序中的命令式赋值。看我的例子:

main.qml:

import QtQuick 2.4
import QtQuick.Window 2.2
import QtQuick.Controls 2.0

Window {
    width: 1000
    height: 800
    visible: true

    Button {
        text: 'load'
        onClicked: {
            loader.source = "TestObj.qml"
        }
    }

    Loader {
        anchors.fill: parent
        id: loader
        active: true
        asynchronous: true
        visible: status == Loader.Ready
    }

    BusyIndicator {
        id: ind
        anchors.fill: parent
        running: loader.status == Loader.Loading
    }
}

TestObj.qml:

import QtQuick 2.0

Item {
    Grid {
        anchors.fill: parent
        columns: width
        rows: height
        Repeater {
            model: 100
            Rectangle {
                width: { for (var i = 0; i < 10000; i++) console.log(i); return 1 }
                height: 1
                color: 'green'
            }
        }
    }
}

由于异步Loader可能会在一段时间内显示不完整的文件,因此我将其设置为仅在status更改为ready时才可见。