QMLはどうやって動的コンポーネントを作成しますか?


QML動的コンポーネントとは、必要に応じて割り当てられ、必要に応じてカスタマイズされたコンポーネントを作成します.つまり、オブジェクト遅延の実例化とは、プログラムの開始時に作成されるのではなく、必要でない時にメモリを廃棄して保存します.ComponentとLoaderを使ってもいいです.JavaScriptの形式を使ってもいいです.
まずComponentを紹介します.
progress属性は、コンポーネントをロードするプロセスで、0.0から1.0まで変化します.
status属性は、それぞれComponent.Null/Ready/Loading/Errorであるコンポーネントをロードした状態である.
url属性、コンポーネントパス.
completted()付加信号は、オブジェクトの実装が完了したらトリガします.
destruction()に信号を付加し、対象が廃棄開始された時にトリガします.
object createObject関数は、オブジェクトを作成します.
string error String関数、エラー記述.
object incubateObject(Item parent、object properties、enumeration mode)関数は、modeパラメータによって非同期または同期によってオブジェクトを作成します.modeの値はQt.ASynchronous/Synchronousであり、デフォルトは非同期であり、戻り値の属性はstatus、oject、object、onStatus、onStatus Chatung、Compengchanged、Compect、Compect、Compect、Compect、
forceComplection()関数が強制的に同期してオブジェクトを作成します.
もう少しLoaderを見に来てください.
active属性はデフォルトでtrueです.falseに設定するとコンポーネントをロードできません.
asynchronous属性は、デフォルトではfalseで、trueに設定されています.
アイテム属性、読み取り専用属性、ロードに成功したコンポーネントを保存します.
progress属性は、読み取り専用属性で、0.0から1.0まで変化します.
sourceプロパティは、ロードされたコンポーネントは独立したQMLファイルです.
sourceComponentプロパティは、同じQMLファイルにコンポーネントをロードします.
status属性は、コンポーネントをロードした状態で、そのエニュメレーション値はそれぞれLoader.Null/Ready/Loading/Errである.
loaded()信号は、コンポーネントのロードに成功したときにトリガされます.
object setSource関数は、プリロードコンポーネントのパスを設定します.
同じQMLファイルにComponentとLoaderを使用します.
Componentは私達の欲しいものをカプセル化できます.外部には定義されたインターフェース、つまりID属性だけを提供します.その後、私達は繰り返し使用できます.あるQMLファイルが重複して使用しているComponentが比較的小さい場合、あるいはComponentが論理的にあるQMLファイルに属する場合、このComponentはこのQMLファイルに定義すべきであり、この時のLoaderはそのsourceComponent属性を使用しています.
import QtQuick 2.2

Rectangle {
    width: 360; height: 360
    color: "lightblue"

    MouseArea {
        anchors.fill: parent
        onClicked: {
            loader.sourceComponent = component
            loader2.sourceComponent = component
        }
    }

    Component {
        id: component
        Rectangle {
            width: 80; height: 80
            color: "red"
        }
    }

    Loader { id: loader }
    Loader {
        id: loader2;
        anchors.centerIn: parent
        onLoaded: item.color = "green"
    }
}
ComponentはItemから継承されていないので、アンチョスアンカーのレイアウトは無効ですが、Loaderは使えます.例ではマウスをクリックして二つのコンポーネントを作成し、マウスをダブルクリックして時又で二つのコンポーネントを破壊しました.破壊する時はsourceComponent属性値をundefinedに設定する必要があります.
コンポーネント分離――
QMLファイル自体もComponentであり、それを使ったQMLファイルとは分離されています.このようにする利点は、このComponentが複数のQMLファイルに使用され、コード構造もはっきりしています.この時のLoaderはそのsource属性を使用しています.
// comp.qml as a separated Component
import QtQuick 2.2

Item {
    Row {
        spacing: 5
        Rectangle {width: 80; height: 80; color: "red" }
        Rectangle {width: 80; height: 80; color: "yellow" }
        Rectangle {width: 80; height: 80; color: "green" }
    }
}

// main.qml
import QtQuick 2.2

Rectangle {
    width: 360; height: 360
    color: "lightblue"

    MouseArea {
        anchors.fill: parent
        onClicked: {
            loader.source = "comp.qml"
            loader2.source = "comp.qml"
        }
        onDoubleClicked: {
            loader.source = ""
            loader2.source = ""
        }
    }

    Loader { id: loader}
    Loader { id: loader2; y: 100}
}
例ではマウスをクリックした時に、外から二つのコンポーネントをロードして、マウスをダブルクリックして時又を破壊しました.破壊する時には、source属性値を「」として設定する必要があります.つまり、空の値です.
QMLファイルから作成します.
Qt.creat Componentを使用してQMLファイルからコンポーネントを作成し、必要に応じてComponent.status属性に基づいて作成状態を判断し、Component.creatObjectを使用して、ある父親の対象の下でオブジェクトを実例化し、最後にdestryを使用してオブジェクトを破壊し、関数パラメータは1つの時間を指定できます.デフォルトの例は以下の通りです.
import QtQuick 2.2

Rectangle {
    property var object
    property var component

    width: 360; height: 360
    color: "lightblue"

    MouseArea {
        anchors.fill: parent
        onPressed: {
            component = Qt.createComponent("comp.qml")
            if(Component.Ready === component.status) {
                object = component.createObject(parent)
            }
        }
        onReleased: {
            object.destroy(2000)
        }
    }
}
例ではマウスを押した時にQMLファイルからコンポーネントcomponentを作成し、オブジェクトのobjectを具体化し、マウスを放した時に2000ミリ秒後にオブジェクトをobjectで破壊しましたが、コンポーネントcomponentはまだ存在します.
QML文字列から作成します.
Qt.creat QmlObjectを使ってQML文字列から作成し、最初のパラメータはオブジェクトを作成するQML文字列であり、第二のパラメータはオブジェクトを作成する親オブジェクトを指定し、第三のパラメータはエラーを報告するために使用されます.例は以下の通りです.
import QtQuick 2.2

Rectangle {
    property var object

    width: 360; height: 360
    color: "lightblue"

    MouseArea {
        anchors.fill: parent
        onPressed: object = Qt.createQmlObject('import QtQuick 2.2; Rectangle { color: "red"; width: 100; 	height: 100; anchors.centerIn: parent }', parent, "dynamicSnippet")
        onReleased: object.destroy(1000)
    }
}
修正例のQt.creatQml Object()の最初のパラメータの「カラー」が「colo」であれば、プログラムの実行時にエラーが発生します.この時、第三のパラメータは役に立ちます.エラーメッセージは以下の通りです.
Error: Qt.createQmlObject(): failed to create object: 
qrc:///dynamicSnippet:1:33: Cannot assign to non-existent property "colo"
ここでは、動的コンポーネントの作成と廃棄の四つの方法が挙げられています.実際の使用過程では必要に応じて選択できます.