9

我的项目需要Window在一个屏幕上显示两个 QML (一个发送者,一个接收者)。这两个都.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我决定用类似的方法为我创建第二个应用程序引擎。我很快意识到,receive.qml即使使用container2->show(). 现在,它显示一个空白页面。

我的问题是:

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

1 回答 1

17

这可以更容易地完成,例如:

main.qml

import QtQuick 2.3
import QtQuick.Window 2.2

Item {

    Window {
        objectName: "wnd1"
        visible: true
    }

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

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

主文件

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::closure事件

于 2015-07-09T03:08:24.003 回答