【问题标题】:Multiple windows in a single project单个项目中的多个窗口
【发布时间】:2015-09-26 17:25:39
【问题描述】:

我的项目需要在一个屏幕上显示两个 QML Windows(一个发送者,一个接收者)。 .qml 都要求我在其中包含一些 Cpp 模型,因此我使用 QQmlApplicationEngine 来注册 Cpp 模型。

我发现使用QWidget::createWindowContainer() 可以为单个项目显示多个Windows。这对于第一个 QML 文件非常有效。代码 sn-ps 如下所示:

QQmlApplicationEngine* engine = new QQmlApplicationEngine(Qurl("main.qml"));
QmlContext* context = engine.getContextProperty();

//do some Cpp models registering...

QQuickview *view = new QQuickview(engine,0);
QWidget* container = widget::createWindowContainer(view);  
//I realized I dont need to do container->show(); for the main.qml to appear..

//use desktop widget to move the 2nd container to the 2nd screen...

我决定用类似的方法为我的receive.qml 创建第二个应用程序引擎。我很快意识到即使使用container2->show()receive.qml 也永远不会打开。现在,它显示的是一个空白页面。

我的问题是:

  1. 我的方法是正确的还是有更好的解决方案?
  2. 我需要注意什么信号才能赶上窗户关闭 事件?当其中一个时,我似乎无法检测到信号 窗口关闭。因为我想在一个已经关闭时关闭两者 检测到。

【问题讨论】:

    标签: qt qml qwidget qtquick2 qquickview


    【解决方案1】:

    这可以更简单,例如:

    ma​​in.qml

    import QtQuick 2.3
    import QtQuick.Window 2.2
    
    Item {
    
        Window {
            objectName: "wnd1"
            visible: true
        }
    
        Window {
            objectName: "wnd2"
            visible: true
        }
    }
    

    因此您可以从 C++ 代码访问这些窗口:

    ma​​in.cpp

    QQmlApplicationEngine engine;
        engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    
        QQuickWindow *wnd1 = engine.rootObjects()[0]->findChild<QQuickWindow *>("wnd1");
        if(wnd1)
            wnd1->setTitle("Server");
        QQuickWindow *wnd2 = engine.rootObjects()[0]->findChild<QQuickWindow *>("wnd2");
        if(wnd2)
            wnd2->setTitle("Client");
    

    要捕捉结束事件,您应该使用 QQuickWindow::closing 事件

    【讨论】:

    • 不错!该解决方案就像一个魅力。似乎我们在任何时候都只能有 1 个引擎。关于将第二个窗口转移到第二个屏幕,我从 qApplication::desktop 获得了 availableGeometry 并使用 wnd2->setX(. .) & wnd2->setY(..) 以获得所需的位置。可以直接通过 QQuickWindow 设置 x, y 吗?还是我必须使用 QObject::setProperty ?
    • 更新:从doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html看来还是推荐使用setProperty来设置X和Y,我就采用这个方法。
    • 您可以使用Screen item 在 QML 中调整大小和位置
    • 这对我不起作用。我在一个项目中放了一个窗口,但窗口永远不会出现。
    • 它在 Windows 中也不适用于我。什么都没有显示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2014-11-01
    相关资源
    最近更新 更多