2012-10-24 4 views
8

약 100 개의 화면이있는 QtQuick 프로젝트를 개발해야합니다.QML : 디자인 인식에서 qml 페이지 간 이동

버튼 클릭시 3 개의 화면이있는 탐색을위한 데모 프로젝트를 만들려고했습니다. 나는 페이지들 사이의 네비게이션에서 'States'의 개념을 사용했다. 처음에는 'Loader'를 사용하여 동일하게 시도했지만 로더는 이전 페이지 상태를 유지할 수 없었으며 탐색 중에 전체 페이지를 다시로드했습니다.

다음은 100 화면에 대한 상태를 정의하기는 가능하지이 세 가지 스크린이 작은 POC 잘 실행 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; } 
     } 

    ] 

} 

의 코드이지만.

디자인 측면에서 우리는 C++ 컨트롤러를 만들기 위해 다양한 페이지의 상태, 가시성을 제어합니다.

C++에서 '상태'논리를 구현하는 방법에 대한 제안이 필요합니다.

+0

대상 플랫폼이 무엇입니까? –

+0

현재 우리는 Windows를 목표로하고 있습니다 – DNamto

+0

저는 현재 Windows에서 데스크톱 버전을 목표로 삼고 있습니다. – DNamto

답변

1

Qt 빠른 구성 요소에서 StackView를 사용하는 것이 좋습니다. Here은 해당 설명서입니다.

+0

제가 알고있는 것은 PageStack은 특히 Symbian 플랫폼 용입니다. Windows OS의 데스크탑 플랫폼에서도 작동합니까? – DNamto

+0

휴대 전화에서 내비게이션 패턴이 보이는 경우 사용할 수 있다고 생각합니다. 지금 다운로드 한 데스크톱 Qt 빠른 구성 요소에서 TabBar라는 하나의 "보기 관리자"만 보았습니다. –

+0

PageStack이 분명히 해결책이 될 수 있다는 것을 경험으로 말할 수 있습니다. 그러나, 이것은 매우 복잡한 제어가 아니며 언제나 자신의 구현을 고려할 수 있습니다. 기본적으로 배열을 페이지 스택으로 사용하는 부모 개체를 만들고 QML 동적 개체 만들기를 사용하여 페이지를 만들고 필요에 따라 스택에 밀어 넣습니다. 나는 컴포넌트에서 PageStack의 코드를 살펴볼 것을 강력하게 권고한다. 그것은 전혀 복잡하지 않으며 내 영감을 얻습니다. – Deadron

6

구성 가능한 페이지 목록 (모델과 같은) + 리피터 + 로더 항목을 사용하여 시작시 모든 것을로드하지 않고 (지연 인스턴스화) 숨기고 페이지를 파기하지 않는 간단한 QML 솔루션 다시 방문하면 다시로드해야합니다.) :

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

희망이 있습니다.

+1

더 나아가서는'visible' 속성의 사용을 커스텀 속성으로 대체 할 수 있습니다. 'scale' 또는'opacity'와 함께 사용되는'shown'과 멋진 페이지를 수행하기위한'Behavior { 변경 전 환 ... – TheBootroo

+1

페이지의 QML 파일이 같은 폴더에 없다면 배열과 'currentPage' 속성에 페이지 파일 이름 앞에 상대 경로를 제공해야합니다 : - 하위 폴더에있는 경우 : "folderName/fileName" - 상위 폴더 인 경우 : "../folder/filename" - 결국 절대 경로이지만 아주 좋은 아이디어는 아닙니다! – TheBootroo

+0

Bootroo의 대답은 Quick 2에서 컴파일되지 않습니다. 여기에는 변경 사항이 있습니다 :'main_rectangle.currentPage'와'main_rectangle.pagesList'는 변수의 범위와 같습니다. 희망이 사람을 도움이됩니다. –