【问题标题】:How to create some independent windows in QML如何在 QML 中创建一些独立的窗口
【发布时间】:2018-10-08 06:11:54
【问题描述】:

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

【问题讨论】:

标签: qt window qml


【解决方案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();
}

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

【讨论】:

【解决方案2】:

你可以这样做:

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 中它倾向于做出一些意想不到的决定......
  • @L.V.A 查看修改后的答案
猜你喜欢
  • 1970-01-01
  • 2012-03-27
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
相关资源
最近更新 更多