3

私のアプリケーションでは、C++ コードから QML UI を使用して別のウィンドウを作成したいと考えています。

QML Window タイプを使用して別のウィンドウを作成できることはわかっていますが、C++ コードから同じことが必要です。

これまでのところ、追加の qml ファイルを QQmlComponent に読み込むことができました。

QQmlEngine engine;
QQmlComponent component(&engine);
component.loadUrl(QUrl(QStringLiteral("qrc:/testqml.qml")));
if ( component.isReady() )
    component.create();
else
    qWarning() << component.errorString();

別のウィンドウに表示するにはどうすればよいですか?

4

3 に答える 3

5

単一のQQmlEngine. コードに従って、次のようなことができます。

QQmlEngine engine;
QQmlComponent component(&engine);
component.loadUrl(QUrl(QStringLiteral("qrc:/main.qml")));

if ( component.isReady() )
    component.create();
else
    qWarning() << component.errorString();

component.loadUrl(QUrl(QStringLiteral("qrc:/main2.qml")));

if ( component.isReady() )
    component.create();
else
    qWarning() << component.errorString();

でも好きQQmlApplicationEngineです。このクラスはQQmlEngineとを組み合わせてQQmlComponent、単一の QML ファイルをロードする便利な方法を提供します。したがって、使用する機会があれば、コードの行数は少なくなりますQQmlApplicationEngine

例:

QGuiApplication app(argc, argv);

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
engine.load(QUrl(QStringLiteral("qrc:/main2.qml")));

return app.exec();

も使用できますQQuickViewQQuickViewから派生したルート オブジェクトのロードのみをサポートするQQuickItemため、この場合、ファイルは上記の例のようにqmlQML タイプで開始できませんでしたApplicationWindowWindowしたがって、この場合、次のmainようになります。

QGuiApplication app(argc, argv);

QQuickView view;
view.setSource(QUrl("qrc:/main.qml"));
view.show();

QQuickView view2;
view2.setSource(QUrl("qrc:/main2.qml"));
view2.show();

return app.exec();
于 2016-02-01T13:06:08.307 に答える
0

好奇心旺盛な人のために、私は少し異なるアプローチで問題を解決しました。

私のルート QML ドキュメントは次のようになります。

import QtQuick 2.4

Item {
    MyMainWindow {
        visible: true
    }

    MyAuxiliaryWindow {
        visible: true
    }
}

は root 要素を持つQMLMainWindowコンポーネントであり、 は root 要素ApplicationWindowAuxiliaryWindow持つコンポーネントWindowです。

問題なく動作し、2 つの個別の QML ファイルをロードすることを心配する必要はありません。

于 2016-02-03T07:57:46.857 に答える