如何在QML中创建一些独立的窗口

时间:2018-10-08 06:11:55

标签: qt window qml

我想像Wolfram Mathematica中那样创建一个开始窗口,在该窗口被隐藏后,用户可以创建/打开文件,然后程序使用文件编辑器创建一个新窗口,在关闭编辑器后,该编辑器窗口关闭并再次显示启动窗口。如何在QML中制作一些独立的窗口?

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

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();
    }
}

关闭一个视图将使另一个视图出现。因此,对于用户要完全退出应用程序的情况,您可能应该添加另一个按钮。

如果只希望创建视图一次,则可以忽略close事件并设置可见性。例如,您可以执行以下操作:

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
    }
}

答案 1 :(得分:1)

由于您希望它们是静态且独立的,因此从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();
}

然后使用任何类型的通用数据模型(例如,上下文属性,单例...)将它们设置为可见。