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属性を使用しています.
コンポーネント分離――
QMLファイル自体もComponentであり、それを使ったQMLファイルとは分離されています.このようにする利点は、このComponentが複数のQMLファイルに使用され、コード構造もはっきりしています.この時のLoaderはそのsource属性を使用しています.
QMLファイルから作成します.
Qt.creat Componentを使用してQMLファイルからコンポーネントを作成し、必要に応じてComponent.status属性に基づいて作成状態を判断し、Component.creatObjectを使用して、ある父親の対象の下でオブジェクトを実例化し、最後にdestryを使用してオブジェクトを破壊し、関数パラメータは1つの時間を指定できます.デフォルトの例は以下の通りです.
QML文字列から作成します.
Qt.creat QmlObjectを使ってQML文字列から作成し、最初のパラメータはオブジェクトを作成するQML文字列であり、第二のパラメータはオブジェクトを作成する親オブジェクトを指定し、第三のパラメータはエラーを報告するために使用されます.例は以下の通りです.
まず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"
ここでは、動的コンポーネントの作成と廃棄の四つの方法が挙げられています.実際の使用過程では必要に応じて選択できます.