9

私のプロジェクトWindowでは、画面の 1 つ (1 つの送信者、1 つの受信者) にそれぞれ 2 つの QML を表示する必要があります。両方とも、.qml内部にいくつかの Cpp モデルを含める必要があるため、QQmlApplicationEngineCpp モデルを登録するために使用しています。

を使用すると、1 つのプロジェクトに対してQWidget::createWindowContainer()複数の を表示できることがわかりました。Windowこれは、最初の 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同様の方法で2 つ目のアプリケーション エンジンを作成することにしました。receive.qmlがあっても が開かないことにすぐに気付きましたcontainer2->show()。現在、空のページが表示されています。

私の質問は次のとおりです。

  1. 私のアプローチは正しいですか、それともより良い解決策がありますか?
  2. ウィンドウを閉じるイベントをキャッチするには、どのシグナルに注意する必要がありますか? ウィンドウの1つが閉じられているときに信号を検出できないようです。どちらかが検出されたときに両方を閉じたかったので。
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++ コードからこれらのウィンドウにアクセスできます。

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イベントを使用する必要があります

于 2015-07-09T03:08:24.003 に答える