QtQuick 2 では、QtQuick コントロールを使用して複雑なデスクトップ アプリを作成できます。ただし、アプリの開始時にUI全体を宣言して一度に作成する必要があるようです。まだ使用したくない部分 (たとえば、[ファイル] -> [開く] ダイアログ) は作成する必要がありますが、次のように非表示になっています。
ApplicationWindow {
FileDialog {
id: fileOpenDialog
visible: false
// ...
}
FileDialog {
id: fileSaveDialog
visible: false
// ...
}
// And so on for every window in your app and every piece of UI.
さて、これは単純なアプリでは問題ないかもしれませんが、複雑なアプリや多くのダイアログを持つアプリでは、これは確かにクレイジーなことですか? 従来の QtWidgets モデルでは、必要に応じて動的にダイアログを作成していました。
これにはいくつかの回避策があることを知っています。たとえばLoader
、JavaScript で直接 QML オブジェクトを使用したり、動的に作成したりすることもできますが、それらは非常に醜く、優れた QML 構文の利点をすべて失います。また、コンポーネントを実際に「アンロード」することはできません。できるとよくLoader
言っていますが、試してみたらアプリがクラッシュしました。
この問題に対するエレガントな解決策はありますか? それとも、単に弾丸をかじって、アプリのすべての潜在的な UI を一度に作成してから、そのほとんどを非表示にする必要がありますか?
注:このページには、これを回避するための s の使用に関する情報がありますが、ご覧のとおり、これLoader
はあまり良い解決策ではありません。
編集 1 - Loader が最適ではないのはなぜですか?
わかりました、なぜLoader
それほど楽しくないのかを示すために、複雑なタスクを開始して結果を待つこの例を考えてみてください。人々が通常与える些細な例とは異なり、タスクには多くの入力といくつかの出力があるとします。
これがLoader
解決策です:
Window {
Loader {
id: task
source: "ComplexTask.qml"
active: false
}
TextField {
id: input1
}
TextField {
id: output1
}
Button {
text: "Begin complex task"
onClicked: {
// Show the task.
if (task.active === false)
{
task.active = true;
// Connect completed signal if it hasn't been already.
task.item.taskCompleted.connect(onTaskCompleted)
}
view.item.input1 = input1.text;
// And several more lines of that...
}
}
}
function onTaskCompleted()
{
output1.text = view.item.output1
// And several more lines...
// This actually causes a crash in my code:
// view.active = false;
}
}
なしでそれを行っていた場合Loader
、次のようなものになる可能性があります。
Window {
ComplexTask {
id: task
taskInput1: input1.text
componentLoaded: false
onCompleted: componentLoaded = false
}
TextField {
id: input1
}
TextField {
id: output1
text: task.taskOutput1
}
Button {
text: "Begin complex task"
onClicked: task.componentLoaded = true
}
}
それは明らかにずっと簡単です。私が明確に望んでいるのは、が true に設定されているComplexTask
ときに をロードして宣言的な関係をすべてアクティブにし、が false に設定されてcomponentLoaded
いるときに関係を切断してコンポーネントをアンロードするcomponentLoaded
方法です。現在、Qt でこのようなものを作成する方法はないと確信しています。