私は次のようにQQmlApplicationEngine
を使用しています:
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
app.exec();
しかし、今ではアプリのマルチサンプリングを有効にしたいのですが、QQmlApplicationEngine
にはマルチサンプリングを有効にするsetFormat
メソッドがないようです。
QQmlApplicationEngine
でそれを行う方法を見つけました フォーラムで :
QQuickWindow* window = (QQuickWindow*) engine.rootObjects().first();
QSurfaceFormat format;
format.setSamples(16);
window->setFormat(format)
ただし、エンジンの最初のルートオブジェクトがQQuickWindow
であることに依存しています。これはQtのドキュメントには記載されていません。だから私はそのテクニックを使いたくありません。
別の方法は、QQmlApplicationEngine
をスキップして、代わりにQQuickView
を作成することです。これにはsetFormat
メソッドがあり、マルチサンプリングを有効にできますが、QQmlApplicationEngine
からQQuickView
に切り替えると何かが失われますか?
つまり、これら2つのクラスの違いは何ですか?
私が見つけた1つの違いはこれです( here から):
QQuickViewとは異なり、QQmlApplicationEngineはルートウィンドウを自動的に作成しません。 Qt Quickのビジュアルアイテムを使用している場合は、それらをウィンドウ内に配置する必要があります。
この特定の違いは私には関係ありません。
他の違いはありますか?
見出し:QQmlApplicationEngineはQQuickViewよりも新しく強力です。
QQmlApplicationEngineは、いくつかの中央アプリケーション機能をQMLに公開します。これは、QQuickViewアプリケーションが通常C++から制御します。
- Qt.quit()をQCoreApplication :: quit()に接続する
- メインQMLファイルに隣接するi18nディレクトリから翻訳ファイルを自動的にロードします。
- シーンにQQuickWindowが含まれている場合、インキュベーションコントローラーを自動的に設定します。
- QQmlFileSelectorをURLインターセプターとして自動的に設定し、すべてのQMLファイルとアセットにファイルセレクターを適用します。
参照: Qt docs
QQmlApplicationEngineが導入された時点で、 Qt Blogはこれを言っていました :
Qt 5.0では、通常、C++でQQuickViewを宣言し、そのベースURLを設定することにより、Qt Quickアプリケーションを作成しました。このアプローチの欠点は、幅や高さなどのプロパティを設定するためにC++を使用する必要があることです。Qt5.1では、WindowまたはApplicationWindowをアプリケーションのルート項目として使用することをお勧めします。これにより、Qt Quickを完全に制御できます。 QQmlApplicationEngineを使用して、このユースケースをもう少しシンプルにします。 QmlApplicationEngineは、qtクイックウィンドウを設定し、適切な翻訳ファイルを選択するために必要なものすべてであり、アプリケーションのquit()シグナルを暗黙的にルートウィンドウに接続します。
Qt Quick Controls 2.0は、新しい項目 ApplicationWindow により、この追加のアプリケーションコントロールを利用できます。
そのため、MenuBarやPopupなどのQt Quick Controls機能を使用するには、次のことを行う必要があります。
最上位のアイテムをWindow
にしたくない場合は、両方を一緒に使用できます。
QQmlApplicationEngine engine;
QQuickView view(&engine, 0);
// your usual engine code
view.show();