2012-10-24 17 views
8

Musimy opracować projekt QtQuick, w którym mamy około 100 ekranów.QML: Nawigacja między stronami qml od percepcji projektu

Próbowałem wykonać projekt demonstracyjny dla nawigacji, który ma trzy ekrany po kliknięciu przycisku. Użyłem pojęć "państwa" w nawigacji między stronami. Początkowo próbowałem tego samego używając "Loader", ale program ładujący nie był w stanie zachować poprzedniego stanu strony, był to ponowne ładowanie całej strony podczas nawigacji.

Poniżej znajduje się fragment kodu z 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; } 
     } 

    ] 

} 

To działa dobrze z małym PKOl z trzech ekranów, ale nie jest to możliwe, aby zdefiniować stany na 100 ekranach.

Od strony aspektu konstrukcyjnego doszliśmy do tego, aby stworzyć kontroler C++, który kontroluje stany, widoczność różnych stron.

Potrzebujesz sugestii, jak wdrożyć logikę "państwa" w C++.

+0

Jaka jest Twoja platforma docelowa? –

+0

Obecnie kierujemy reklamy na system Windows – DNamto

+0

Chodzi o to, że kierujemy reklamy na wersje dla komputerów stacjonarnych w systemie Windows. Obecnie jest to – DNamto

Odpowiedz

1

Proponuję użyć StackView z Qt Quick Components. Here jest jego dokumentacją.

+0

. Wiem, że strona PageStack jest przeznaczona specjalnie dla platformy Symbian. Czy będzie działać na platformie komputerowej w systemie Windows? – DNamto

+0

Jeśli twój wzór nawigacyjny wygląda w telefonie, myślę, że można go użyć. W pulpicie Qt Szybkie komponenty, które pobrałem teraz, widzę tylko jeden "View Manager" - TabBar. –

+0

Mogę powiedzieć z doświadczenia, że ​​PageStack może z pewnością być rozwiązaniem tutaj. Jednak nie jest to bardzo skomplikowana kontrola i zawsze możesz rozważyć wdrożenie własnego. Zasadniczo tworzysz obiekt nadrzędny, który ma tablicę jako stos stron i używasz dynamicznego tworzenia obiektów QML do tworzenia stron i przesyłania ich na stos w razie potrzeby. Sugeruję, aby zajrzeć do kodu PageStack w komponentach. Nie jest to wcale skomplikowane, a moje inspiracje. – Deadron

6

Oto najprostsze rozwiązanie w prostym QML, przy użyciu konfigurowalnej listy stron (jak model) + elementów typu Repeater + Loader, aby nie ładować wszystkiego podczas uruchamiania (leniwej instancji) i nie niszcz strony po jej ukryciu (aby nie przeładować, jeśli wrócimy):

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

Mam nadzieję, że pomoże!

+1

Aby pójść dalej, możesz zamienić użycie właściwości "visible" na niestandardową, powiedzmy "pokazaną", która będzie używana razem z 'scale' lub' opacity' oraz niektórym komponentem 'Behavior {}' do tworzenia ładnej strony Zmień przejście ... – TheBootroo

+1

A jeśli pliki QML strony nie znajdują się w tym samym folderze, musisz podać względną ścieżkę przed nazwą pliku strony w tablicy oraz w opcji 'currentPage' property: - jeśli znajduje się w podfolderze : "folderName/fileName" - jeśli w folderze nadrzędnym: "../folder/filename" - w końcu absolutna ścieżka, ale niezbyt dobry pomysł! – TheBootroo

+0

Odpowiedź Bootroo nie zostanie skompilowana w Quick 2. Oto zmiany: 'main_rectangle.currentPage' oraz' main_rectangle.pagesList', wygląda jak zmienne teraz zakres. Mam nadzieję, że to pomaga komuś. –