8

約 100 画面の QtQuick プロジェクトを開発する必要があります。

ボタンをクリックすると 3 つの画面が表示されるナビゲーションのデモ プロジェクトを作成しようとしました。ページ間のナビゲーションで「状態」の概念を使用していました。最初に「ローダー」を使用して同じことを試みましたが、ローダーはページの以前の状態を保持できず、ナビゲーション中にページ全体を再読み込みしていました。

以下は、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; }
        }

    ]

}

これは、3 つの画面を持つ小さな POC ではうまく機能しますが、100 画面の状態を定義することは現実的ではありません。

設計の観点から、さまざまなページの状態、可視性を制御する C++ コントローラーを作成することにしました。

C++ で「状態」ロジックを実装する方法の提案が必要です。

4

2 に答える 2

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

それが役に立てば幸い !

于 2013-03-27T09:04:31.507 に答える
1

Qt Quick Components の StackView を使用することをお勧めします。ここにそのドキュメントがあります。

于 2012-10-24T14:04:02.917 に答える