2017-08-30 53 views
2

私たちはQTクロスプラットフォームアプリケーションを開発しています。アプリケーションには多くの機能的な画面とナビゲーションがあります。スクリーンの取り扱いを簡単にするため、QT QML StackViewを使用しています。 StackViewにプッシュされた各アイテムはPageです。私は次の機能を使って画面をプッシュしポップしています。QT StackViewにコンポーネントを配置する

stackview.push(someurl); //push new url 

stackview.pop(); //pop current URL or page 

私の質問は、既にスタックにプッシュされているコンポーネント/ページを再利用する方法ですか?

例:次の画面A、B、C、Dがあります。スタックはA-> B-> C-> Dのように見えます。ここで画面Dから私は画面Aにナビゲートしたい。アプリケーションの統一されたアーキテクチャのため、私は3回0,をやりたいとは思っていない。代わりに、アプリケーションは既にスクリーンAを押して、それを一番上に持ってくるべきである。

画面AをStackView(A-> B-> C-> D-> A)にプッシュするだけで、各画面に異なる信号/スロットを接続しています。画面がプッシュされるたびに接続し、またアプリケーションを成長させたくないStackViewサイズ。

この場合、どのような方法を使用するのが最適でしょうか?他のQTコンポーネント/コントロールは、私がこのページでインデックスに基づいてページをレンダリングできるように使用できますか?

コンポーネントを事前にqml Propertyとして作成してURLに応じてプッシュしました。サンプルアプリケーションでうまくいくと便利です。私たちのアプリケーションでは、QMLコンポーネントのデータはC++データ(または実行時のいくつかの計算)に密接に依存しています。事前にコンポーネントを作成すると、アプリケーションがクラッシュする原因となります。だから私たちはそのアプローチを使用するつもりはありません。

property Page page1: Screen1{} //Screen1.qml 
property Page page2: Screen2{} //Screen2.qml 
property Page page3: Screen3{} //Screen3.qml 
property Page page4: Screen4{} //Screen4.qml 

Indexに基づいてStackviewコンポーネントを実行することは可能ですか?ドキュメントに関連するものは何も見つかりません。

+1

'StackView'はスタックで、スタック上に、あなたは常に岩下ものをプッシュすると、あなたがしたい場合はダウンあなたの自己を働きます下位層で何かを見つける。この振る舞いを望まないなら、 'StackView'を使うべきではありません。そのための独自のコンテナを簡単に構築することができます。たとえば、作成したアイテムを 'ObjectModel'にプッシュし、正しいインデックスを持つものだけを表示します。 – derM

+1

最初は@derMが正しい。読み込まれたページを切り替える場合は、StackViewが最適な選択肢ではありません。しかし、ページをロードしてアンロードする必要がある場合は、 pop()を3回以上呼び出すのではなく、pop - > pop(ScreenA)の引数としてポップする項目を指定するだけで、すべての項目が削除されます。 – Xplatforms

答えて

3

私は3回pop()をしたくありません。代わりに、アプリケーションは、すでにプッシュされたスクリーンAを再利用して上に持っていく必要があります。 [...]

(=項目項目未定義)

アイテムのポップ:

あなたはdocumentationによるAに戻って取得するポップ()を3回呼び出す必要はありません。

アイテム:指定されている場合、アイテムまでのすべてのアイテムがポップオフされます。 itemがnullの場合、最初の項目までのすべての項目がポップされます。指定しない場合、現在のアイテムだけがポップされます。

スタックを最初のAプッシュに移動させる場合は、pop(null)を一度呼び出してください。

他の方法として、StackLayoutを使用して、インデックスに基づいてQMLコンポーネントを表示することができます。

StackLayout { 
    id: layout 

    Screen1 {} 
    Screen2 {} 
    Screen3 {} 
    Screen4 {} 
} 

次にあなたがcurrentIndexプロパティを変更することにより、表示される画面で選択することができます。layout.currentIndex = 1 // display Screen2

関連する問題