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

Qt 如何在QML中创建一些独立的窗口,qt,window,qml,Qt,Window,Qml,我想创建一个像Wolfram Mathematica中那样的开始窗口,在这个窗口被隐藏后,用户可以创建/打开文件,程序用文件编辑器创建一个新窗口,关闭编辑器后,编辑器窗口被关闭,程序再次显示开始窗口。如何在QML中创建一些独立的窗口?您可以执行以下操作: Start.qml import QtQuick 2.11 import QtQuick.Window 2.11 Window { visible: true width: 640 height: 480 ti

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

您可以执行以下操作:

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();
    }
}
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 {
    visible: true
    width: 640
    height: 480
    title: qsTr("Editor")
    onClosing: {
        var component = Qt.createComponent("qrc:/Start.qml");
        component.createObject();
    }
}
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
    }
}
关闭一个视图将显示另一个视图。因此,如果用户希望完全退出应用程序,您可能应该添加另一个按钮

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

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();
    }
}
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 {
    visible: true
    width: 640
    height: 480
    title: qsTr("Editor")
    onClosing: {
        var component = Qt.createComponent("qrc:/Start.qml");
        component.createObject();
    }
}
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
    }
}

您可以这样做:

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();
    }
}
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 {
    visible: true
    width: 640
    height: 480
    title: qsTr("Editor")
    onClosing: {
        var component = Qt.createComponent("qrc:/Start.qml");
        component.createObject();
    }
}
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
    }
}
关闭一个视图将显示另一个视图。因此,如果用户希望完全退出应用程序,您可能应该添加另一个按钮

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

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();
    }
}
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 {
    visible: true
    width: 640
    height: 480
    title: qsTr("Editor")
    onClosing: {
        var component = Qt.createComponent("qrc:/Start.qml");
        component.createObject();
    }
}
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
    }
}

既然你想让它们静态化,并且独立,那么从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();
}
intmain(intargc,char*argv[])
{
QGUI应用程序应用程序(argc、argv);
qqmlaplicationengine;
发动机负荷(QUrl(QUrl(“./主_0.qml”));
发动机负荷(QUrl(QUrl(“./main_1.qml”));
if(engine.rootObjects().isEmpty()){

因为你想让它们静态化,并且独立,所以从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();
}
intmain(intargc,char*argv[])
{
QGUI应用程序应用程序(argc、argv);
qqmlaplicationengine;
发动机负荷(QUrl(QUrl(“./主_0.qml”));
发动机负荷(QUrl(QUrl(“./main_1.qml”));
if(engine.rootObjects().isEmpty()){

qDebug()通过使用?我使用窗口QML类型。通过使用?我使用窗口QML类型。这些窗口是自动创建的,但我认为一对静态窗口将是更好的选择。如果使用
组件。createObject()
如果不指定父级,您永远不知道gc何时决定擦除您的屏幕。在较新的Qt版本中,这可能不是问题,但在Qt5.6中,它倾向于做出一些意外的决定…@L.V.a请参阅修改后的回答窗口是自动创建的,但a认为一对静态窗口将是更好的选择。如果您使用
component.createObject()
如果不指定父级,您永远不会知道gc何时决定擦除您的屏幕。在较新的Qt版本中,这可能不是问题,但在Qt5.6中,它有做出一些意外决定的倾向…@L.V.a请参阅修改后的回答这是一个理想的解决方案。您简化了我的主要功能:这是一个理想的解决方案。您简化了我的主要乐趣行动: