单个项目中的多个窗口



我的项目需要在一个屏幕上显示两个QML Window(一个发送方,一个接收方)。这两个.qml都要求我在里面包括一些Cpp模型,因此,我使用QQmlApplicationEngine来注册Cpp模型。

我发现,使用QWidget::createWindowContainer(),我能够显示多个Window s为一个项目。这对于第一个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. 我需要注意什么信号才能赶上窗户关闭事件吗?我似乎无法检测到其中一个的信号窗户关着。因为我想在其中一个结束的时候关闭这两个检测到。

这可以做得更简单,例如:

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 event

相关内容

  • 没有找到相关文章

最新更新