2016-11-08 3 views
0

Ich habe versucht, einen BusyIndicator (http://doc.qt.io/qt-5/qml-qtquick-controls-busyindicator.html) auszuführen, während ich eine qml-Datei (http://doc.qt.io/qt-5/qml-qtquick-loader.html) lade, aber der BusyIndicator erscheint nicht.QML BusyIndicator beim Laden einer schweren qml-Datei

Was ich versuche zu tun ist: 1- Der Benutzer gibt eine "HandlerLoader (Name)", wobei "Name" die URL der nächsten Qml-Seite ist. 2- In "onHandlerLoader" führe ich den busyIndicator aus. 3- Dann ändere ich die Loader-Quelle.

Das Problem ist, dass unabhängig von der Zeit, die ich zwischen den Schritten 2 und 3 verbrachte, der BusyIndicator nicht angezeigt wird.

Außerdem, wenn ich Schritt 3 kommentieren, wird der busyIndicator korrekt angezeigt.

Was mache ich falsch?

Danke !!

Dies ist der Code:

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

Antwort

3

Der Grund dafür ist, dass Ihr Schwer Laden Loader den Faden blockiert. In den asynchronen Modus versetzen, damit der Rest des Programms ausgeführt werden kann. Außerdem würde ich empfehlen, deklarative Bindungen zu Imperativ-Zuordnungen in Handlern vorzuziehen. Siehe mein Beispiel:

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

Da die asynchrone Loader könnte für einige Zeit unvollständigen Dateien angezeigt werden, habe ich es nur sichtbar zu sein, wenn seine status ändert sich zu ready.

Verwandte Themen