2017-07-25 52 views
0

私はQMLでは、私がstackViewを使用して混乱していますし、コード、次の書かれているQMLでの初心者ですと++ QT CにStackWidgetの詳細を働いています。QML StackViewの使い方は?

以下
Window { 
    visible: true 
    width: 640 
    height: 480 
    title: qsTr("Stack view") 

    MainForm { 
     StackView { 
      id: stackView 
      x: 0 
      y: 0 
      width: 360 
      height: 360 

      initialItem: page1 

      Rectangle { 
       id: page1 

       //anchors.fill: parent 
       color: "lightgreen" 
       Button { 
        id: buttonPage1 
        text: "back to 2" 
        anchors.centerIn: parent 
        onClicked: { 
         stackView.pop() //**Is THIS CORRECT** 
         stackView.push(page2) //**Is THIS CORRECT** 

        } 
       } 
       TextEdit { 
        id: te1 
        width: 105 
        height: 40 
        text: "enter" 
       } 
      } 
      Rectangle { 
       id: page2 

       //anchors.fill: parent 
       color: "lightblue" 
       Button { 
        id: buttonPage2 
        text: "back to 1" 
        anchors.centerIn: parent 
        onClicked: { 
         stackView.pop() //**Is THIS CORRECT** 
        } 
       } 
       TextEdit { 
        id: te2 
        width: 109 
        height: 29 
        text: "enter" 
       } 
      } 
     } 
    } 
} 

が質問です:

  1. StackWidgetではsetCurrentIndexを使用して目的のページを設定していましたが、QMLではpushとpopを使用する必要があります。その場合、何らかの選択に基づいてページ1ページ2の間を移動するためにプッシュとポップを使用する方法。 ?

  2. 最初に、すべてのページをstackViewにロードできますか?

  3. stackViewから項目をポップすると、ページの内容を保存するにはどうすればいいですか?私はあなたがあなたの説明以下StackViewを持ってしたくないと思うので

+0

StackViewではなく、[StackLayout](https://doc.qt.io/qt-5/qml-qtquick-layouts-stacklayout.html)のように聞こえます。 – jpnurmi

答えて

2

私は正確にStackViewの使用方法に関するご質問にお答えしていないことがわかっているが、それはです。

StackViewのユースケースは、名前が示すように、スタック上にページがある場合です。ページを切り替える場合は、どちらのページが論理的に下にあるのかはわかりませんが、StackViewは必要なものではなく、SwipeViewと考えてください。

SwipeViewには、ページが並んで共存しています。 Qt 5.9以降ではinteractiveというプロパティがあり、スワイプの動作を無効にする可能性があります。 currentIndexを設定すると、表示するページを選択できます。

ただし、SwipeViewは、メモリとCPUの負荷を軽減するために、必要に応じてページを作成します(実際にはアンロードされたページのバインドを無効にします)。これは、データがページ外のmodelに格納されていないと、データが失われる可能性があります。

あなたが同時にロードされたすべてのページを持ちたい、とあなただけの目に見えるものを切り替えたい場合は、単純なカスタム・コンポーネントで行くかもしれない:

Item { 
    property int currentIndex 
    Page1 { visible: parent.currentIndex === 0 } 
    Page2 { visible: parent.currentIndex === 1 } 
    Page3 { visible: parent.currentIndex === 2 } 
    ... 
} 

それとも、のように行く:

MyView.qml

Item { 
    id: root 
    property int currentIndex: 0 
    default property Item newContent 

    onNewContentChanged: { 
     newContent.parent = root 
     newContent.visible = Qt.binding(bindingsClosure(root.children.length - 1)) 
    } 

    function bindingsClosure(index) { return function() { return root.currentIndex === index } } 
} 

main.qml

MyView { 
    Page1 { } 
    Page2 { } 
    Page3 { } 
} 
+0

あなたの上記の答えは私の要件とほぼ一致し、私はswipeViewを試してみて、それに答えがあるとマークします。 – pra7

関連する問題