2012-10-24 3 views
8

Abbiamo bisogno di sviluppare un progetto QtQuick, in cui abbiamo circa 100 schermi.QML: navigazione tra le pagine qml dalla percezione del progetto

Avevo provato a creare un progetto dimostrativo per la navigazione che ha tre schermate sul clic del pulsante. Avevo usato i concetti di "Stati" nella navigazione tra le pagine. Inizialmente ho provato lo stesso utilizzando 'Loader' ma il caricatore non era in grado di conservare lo stato precedente della pagina, stava ricaricando l'intera pagina durante la navigazione.

seguito è il frammento di codice di main.qml

// import QtQuick 1.0 // to target S60 5th Edition or Maemo 5 
import QtQuick 1.1 

Rectangle { 
    id:main_rectangle 
    width: 360 
    height: 640 

    Page1{ 
     id:page1 
    } 

    Page2{ 
     id:page2 
    } 

    Page3{ 
     id:page3 
    } 

    states: [ 
     State { 

      name: "page2" 

      PropertyChanges { target: page3; visible:false; } 
      PropertyChanges { target: page1; visible:false; } 
      PropertyChanges { target: page2; visible:true; } 
     }, 
     State { 
      name: "page1" 
      PropertyChanges { target: page3; visible:false; } 
      PropertyChanges { target: page2; visible:false; } 
      PropertyChanges { target: page1; visible:true; } 
     }, 

     State { 
      name: "page3" 
      PropertyChanges { target: page1; visible:false; } 
      PropertyChanges { target: page2; visible:false; } 
      PropertyChanges { target: page3; visible:true; } 
     } 

    ] 

} 

Questo funziona bene con il piccolo POC con tre schermi, ma non è possibile definire stati per 100 schermi.

Dal punto di vista della progettazione, abbiamo concluso di creare un controller C++ controllando gli stati, la visibilità di varie pagine.

Hai bisogno di suggerimenti su come implementare la logica "Stato" in C++.

+0

Qual è la piattaforma di destinazione? –

+0

Attualmente stiamo prendendo di mira Windows – DNamto

+0

Intendevo puntare attualmente alle versioni desktop su Windows – DNamto

risposta

1

Suggerisco di utilizzare StackView da Qt Quick Components. Here è la sua documentazione.

+0

Quello che so che PageStack è specifico per la piattaforma Symbian. Funzionerà su piattaforma desktop su sistema operativo Windows? – DNamto

+0

Se il tuo modello di navigazione è simile al telefono, penso che sia possibile utilizzarlo. Nei componenti desktop Qt Quick, che ho scaricato ora, vedo solo un "View Manager" - TabBar. –

+0

Posso dire per esperienza che il PageStack può essere sicuramente una soluzione qui. Tuttavia, non è un controllo molto complicato e puoi sempre considerare di implementare il tuo. Fondamentalmente si crea un oggetto genitore che ha una matrice come stack di pagine e si utilizza la creazione di oggetti dinamici QML per creare pagine e inserirle nello stack secondo necessità. Consiglio vivamente di esaminare il codice di PageStack nei componenti. Non è affatto complicato e io ti ispiro. – Deadron

6

Ecco la soluzione più semplice in QML semplice, utilizzando un elenco di pagine configurabili (come un modello) + elementi Repeater + Loader per non caricare tutto all'avvio (lazy instanciation) e non distruggere una pagina dopo averla nascosta (a non devo ricaricarlo se torniamo ad esso):

import QtQuick 1.1 

Rectangle { 
    id: main_rectangle; 
    width: 360; 
    height: 640; 

    // Put the name of the QML files containing your pages (without the '.qml') 
    property variant pagesList : [ 
     "Page1", 
     "Page2", 
     "Page3", 
     "Page4", 
     "Page5" 
    ]; 

    // Set this property to another file name to change page 
    property string currentPage : "Page1"; 

    Repeater { 
     model: pagesList; 
     delegate: Loader { 
      active: false; 
      asynchronous: true; 
      anchors.fill: parent; 
      visible: (currentPage === modelData); 
      source: "%1.qml".arg(modelData) 
      onVisibleChanged:  { loadIfNotLoaded(); } 
      Component.onCompleted: { loadIfNotLoaded(); } 

      function loadIfNotLoaded() { 
       // to load the file at first show 
       if (visible && !active) { 
        active = true; 
       } 
      } 
     } 
    } 
} 

Spero che aiuti!

+1

Per andare oltre, è possibile sostituire l'uso della proprietà 'visible' con una personalizzata, diciamo' shown' che verrà usata insieme a 'scale' o' opacity' e alcuni 'Comportamento {}' per fare una bella pagina cambia transizione ... – TheBootroo

+1

E se i file QML della tua pagina non si trovano nella stessa cartella, dovrai fornire il percorso relativo prima del nome del file di pagina nell'array e nella proprietà 'currentPage': - se in una sottocartella : "folderName/fileName" - se in una cartella padre: "../folder/filename" - eventualmente un percorso assoluto, ma non un'idea molto buona! – TheBootroo

+0

La risposta di Bootroo non verrà compilata in Quick 2. Ecco le modifiche: 'main_rectangle.currentPage' e' main_rectangle.pagesList', assomigliano alle variabili ora scope. Spero che questo aiuti qualcuno. –