一个项目中有多个窗口

9
我有一个项目的要求,需要在两个屏幕上分别显示两个QML窗口(一个发送方,一个接收方)。由于两个.qml文件都需要包含一些Cpp模型,因此我使用QQmlApplicationEngine来注册Cpp模型。
我发现使用QWidget::createWindowContainer()可以在单个项目中显示多个窗口。这对于第一个QML文件完全正常运行。代码片段如下:
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. 我需要注意哪个信号以捕获窗口关闭事件?当其中一个窗口关闭时,我似乎无法检测到该信号。因为我想要在其中一个被检测到时关闭两个窗口。
1个回答

18

可以更轻松地完成,例如:

main.qml

import QtQuick 2.3
import QtQuick.Window 2.2

Item {

    Window {
        objectName: "wnd1"
        visible: true
    }

    Window {
        objectName: "wnd2"
        visible: true
    }
}

所以您可以从 C++ 代码中访问这些窗口:

main.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事件。


太好了!解决方案非常有效。似乎我们一次只能使用一个引擎。至于将第二个窗口移动到第二个屏幕,我从qApplication :: desktop获取了availableGeometry,并使用wnd2->setX(..)和wnd2->setY(..)设置了window2的x(),y()以获得所需的位置。直接通过QQuickWindow设置x,y可以吗?还是必须使用QObject :: setProperty? - angelhalo
更新:从http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html得知,推荐使用setProperty设置X和Y。我将采用这种方法。 - angelhalo
你可以在QML中使用Screen元素来调整大小和位置。 - folibis
3
它对我不起作用。我在一个项目中放了一个窗口,但窗口从未显示出来。 - RnMss
1
在Windows中对我也不起作用。什么都没有显示出来。 - JustWe
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接