5

main.qml次のようにファイル システムからファイルをロードする QML ベースのアプリがあります。

myEngine->load("main.qml");

これで問題なく動作しますが、main.qml が新しいバージョンに置き換えられた場合に備えて、エンジンを「リロード」したいと思います。

load()これまで試したのは、エンジンが他の Qt クラスのように自動的にリセットされると仮定して、もう一度呼び出すことでした。

残念ながら、そうではありません。メソッドを再度呼び出すと、更新された qml ファイルの内容を含む別のウィンドウが表示されますが、元のウィンドウは開いたままになり、古い qml ファイルが表示され続けます。

これを修正するために、 を呼び出しload(QUrl())、続いclearComponentCache()て新しいファイルの最終ロード呼び出しを試みました。これにより、同じ効果が得られます。

アプリケーションの実行中にQMLエンジンを「適切に」リロードする方法はありますか?

4

2 に答える 2

5

これを見たばかりですが、まだこれを理解しようとしている場合は、3 つのステップのプロセスであり、その一部を持っています。

  1. 最初に作成されたウィンドウを閉じる必要がありますQQmlApplicationEngine。私の場合、最初のルート オブジェクトを から取り出してQQmlApplicationEngineにキャストしQQuickWindow、次に を呼び出しclose()ました。

  2. clearComponentCacheこれで、を呼び出すことができますQQmlApplicationEngine

これは、ウィンドウを閉じるコードが行うことです (メイン ウィンドウに を付けたことに注意してくださいobjectName) 。

QObject* pRootObject = in_pQmlApplicationEngine->rootObjects().first();
Q_ASSERT( pRootObject != NULL );
Q_ASSERT( pRootObject->objectName() == "mainWindow" );

QQuickWindow* pMainWindow = qobject_cast<QQuickWindow*>(pRootObject);
Q_ASSERT( pMainWindow );
pMainWindow->close();

3 番目のステップはもちろん、QML をロードすることです。

その後、 のQQuickView代わりにウィンドウを作成するQQmlApplicationEngineようになりました。これにより、呼び出すだけで済みclearComponentCacheますsetSource(UI ウィンドウが消えてから再び表示されるのをユーザーが見るのが気に入らなかったためです)。

于 2016-03-15T00:43:50.770 に答える