【发布时间】:2018-10-08 06:11:54
【问题描述】:
我想在 Wolfram Mathematica 中创建一个启动窗口,用户可以在其中创建/打开文件,在此窗口隐藏后,程序使用文件编辑器创建一个新窗口,关闭编辑器后,编辑器窗口关闭,程序再次显示启动窗口。 QML中如何制作一些独立的窗口?
【问题讨论】:
-
通过使用
ApplicationWindow? -
我使用的是Window QML类型。
我想在 Wolfram Mathematica 中创建一个启动窗口,用户可以在其中创建/打开文件,在此窗口隐藏后,程序使用文件编辑器创建一个新窗口,关闭编辑器后,编辑器窗口关闭,程序再次显示启动窗口。 QML中如何制作一些独立的窗口?
【问题讨论】:
ApplicationWindow?
由于您想让它们保持静态且独立,因此从 C++ 创建多个窗口可能是一种想法。
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QUrl("./main_0.qml")));
engine.load(QUrl(QUrl("./main_1.qml")));
if (engine.rootObjects().isEmpty()) {
qDebug() << "crap";
}
return app.exec();
}
然后使用任何类型的通用数据模型(例如上下文属性、单例...)将它们设置为可见。
【讨论】:
你可以这样做:
Start.qml
import QtQuick 2.11
import QtQuick.Window 2.11
Window {
visible: true
width: 640
height: 480
title: qsTr("Start Window")
onClosing: {
var component = Qt.createComponent("qrc:/Editor.qml");
component.createObject();
}
}
Editor.qml
import QtQuick 2.11
import QtQuick.Window 2.11
Window {
visible: true
width: 640
height: 480
title: qsTr("Editor")
onClosing: {
var component = Qt.createComponent("qrc:/Start.qml");
component.createObject();
}
}
关闭一个视图将使另一个视图出现。因此,您可能应该为用户想要完全退出应用程序的情况添加另一个按钮。
如果您希望只创建一次视图,则可以忽略关闭事件并改为设置可见性。例如,您可以执行以下操作:
Start.qml
import QtQuick 2.11
import QtQuick.Window 2.11
Window {
id: mainStartView
visible: true
width: 640
height: 480
title: qsTr("Start Window")
property var editorView
Component.onCompleted: {
editorView = editorComponent.createObject(mainStartView);
}
onClosing: {
close.accepted = false
editorView.visible = true
mainStartView.visible = false
}
Component {
id: editorComponent
Editor {
visible: false
}
}
}
Editor.qml
import QtQuick 2.11
import QtQuick.Window 2.11
Window {
width: 640
height: 480
title: qsTr("Editor")
onClosing: {
close.accepted = false
mainStartView.visible = true
visible = false
}
}
【讨论】:
component.createObject() 而不指定父级,您永远不知道 gc 何时决定擦除您的屏幕。也许这在较新的 Qt 版本中不是问题,但在 Qt5.6 中它倾向于做出一些意想不到的决定......