【发布时间】:2014-11-06 11:35:07
【问题描述】:
在使用 QtQuick 控件的 QtQuick 2 中,您可以创建复杂的桌面应用程序。但是在我看来,整个 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,然后隐藏大部分?
注意:this page 提供了有关使用 Loaders 解决此问题的信息,但正如您所见,这不是一个很好的解决方案。
编辑 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
}
}
这显然方式更简单。我显然想要的是某种方式来加载ComplexTask 并在componentLoaded 设置为true 时激活其所有声明性关系,然后在componentLoaded 设置为false 时断开关系并卸载组件。我很确定目前在 Qt 中没有办法制作这样的东西。
【问题讨论】:
-
为什么Loader解决方案不好?为什么丑?如果您的应用程序在将 active 设置为 false 时崩溃,这可能是您的应用程序或 Qt 代码中的错误,而不是反对使用 Loader 的论据。为什么在大型应用程序中将事物的可见性设置为 false 很疯狂?
-
这听起来有点像我在审问你,但这只是一系列真正好奇的问题。 :)
-
查看更新。在大型应用程序中将可见性设置为 false 很疯狂,因为组件仍在加载并使用资源。这就像那些预加载所有内容的“单页网站”。如果您只有几页,它们没问题,但如果您正在制作 eBay 或亚马逊,则不能使用该技术。
标签: qt qml qt5 qtquick2 qtquickcontrols