加载程序进度仅需0或1个值

时间:2015-12-06 10:13:35

标签: qml qt5 qtquick2

我使用Game.qml加载Loader组件,它运行正常。但是,onProgressChanged广告位只会被调用一次 - 在流程结束时(progress取值1时)。

GameWindow {

    ...

    Loader {
        id: loader
        onLoaded: if(item) splashScene.state = "hidden"
        onProgressChanged: splashScene.progress = progress
    }

    SplashScene {
        id: splashScene
        state: "shown"
    }

    Timer {
        id: lateInitializer
        interval: 1000
        onTriggered: loader.source = "Game.qml"
    }

    Component.onCompleted: lateInitializer.start()
}

有没有办法与LoaderGameWindow组件中的Game合作?

编辑:这是我的飞溅场景:

MyScene {
    id:scene

    property alias progress: progressBar.progress

    ...

    MyProgressBar {
        id: progressBar

        anchors {
            horizontalCenter: parent.horizontalCenter
            bottom: parent.bottom
            bottomMargin: parent.height/3 - height/2
        }
    }
}

我没有使用任何特别的东西。我只想动画我的进度条。

2 个答案:

答案 0 :(得分:1)

来自documentation

  

此属性保存从网络加载QML数据的进度,从0.0(未加载)到1.0(已完成)。大多数QML文件非常小,因此该值将从0快速变为1。

我补充说,如果文件是从本地磁盘加载的话,它的速度非常快,因此步调为0到1是完全正常的。

答案 1 :(得分:1)

您必须将asynchronous: true属性添加到Loader组件。这个属性允许你"听"关于状态变化。

http://doc.qt.io/qt-5/qml-qtquick-loader.html#asynchronous-prop

修改 您可以对状态更改做出如下反应:

Loader {
   visible: status == Loader.Ready
}

因此,对于您的情况,您可以创建以下内容:

Loader {
    id: loader
    onStatusChanged: splashScene.progress = status
}

SplashScene {
    id: splashScene
    state: loader.status === Loader.Ready ? "shown" : undefined
}