Qt Quick の変更点

Qt 6 は、フレームワークをより効率的で使いやすくするための意識的な努力の結果です。

私たちは各リリースにおいて、すべてのパブリックAPIのバイナリとソースの互換性を維持しようと努めています。しかし、Qt をより良いフレームワークにするために避けられない変更もあります。

このトピックでは、Qt Quick におけるそれらの変更点を要約し、それらを扱うためのガイダンスを提供します。

Qt Quick の QML タイプの変更点

font.weight の型の変更

font.weight の型がint に変更されました。定義済みのウェイトクラスはまだ存在しますが、これらのウェイトクラスのどれにも当てはまらないフォントを選択するために、任意の整数を使用することが可能になりました。こ れに よ り 、 フ ォ ン ト の太 さ を任意の整数で表す こ と がで き ていた C++ API と の整合性が保たれます。

文字列から列挙値への暗黙の変換が使われていた場合を除き、ほとんどのコードはこの変更の影響を受けません。

font.weight: "Bold"

このコードは正しくパースされなくなり、以下に示すように、等価なenum値で置き換える必要があります。

font.weight: Font.Bold

FontLoader.nameは読み取り専用プロパティになりました。

Qt 5 では、FontLoadername プロパティは書き込み可能で、設定されるとアイテムの source プロパティを上書きしていました。これは、その目的に関していくつかの混乱を引き起こし、競合するプロパティのセッター間で競合状態が発生した場合、不確定な動作を引き起こす可能性がありました。

つまり、以下のようなコードは動作しなくなります。

FontLoader {
    id: fontLoader
    name: "Helvetica"
}

Text {
    font.family: fontLoader.name
    text: "Foobar"
}

代わりに、カスタムプロパティを使ってフォントファミリ名を保存してください。

property string fontName: "Helvetica"

Text {
    font.family: fontName
    text: "Foobar"
}

OpenGLInfo QML タイプの削除

Qt 5.8 で、OpenGLInfo は非推奨となり、Qt 6 では削除されました。代わりにGraphicsInfo を使用してください。

ShaderEffect がインライン GLSL シェーダ文字列をサポートしなくなりました。

custom materials と同様に、エフェクトは GLSL シェーダー文字列の形で指定されなくなりました。むしろ、シェーダーは、qsb コマンドラインツールのようなQt Shader Toolsモジュールのツールによって前処理されることが期待されます。したがって、シェーダー資産は、実行時にどのグラフィックス API (Vulkan、Metal、OpenGL、または Direct 3D) が使用されているかに関係なく使用できることが保証されます。ShaderEffect アイテムは、結果の.qsb ファイルを参照することが期待されます。

ShaderEffect ソース プロパティが URL になりました。

ShaderEffect プロパティであるvertexShaderfragmentShader は、どちらも型がQByteArray ではなくQUrl になりました。 したがって、これらの動作はImage.source などの他の類似プロパティと同じです。file またはqrc スキームでファイルを参照する既存のコードは、そのまま引き続き動作します。また、この変更により、コンポーネント(.qmlファイル)の場所からの相対パスでファイルを参照できるようになりました。そのため、file: スキームの指定はオプションになりました。

Qt Quick C++ API の変更

QQuickItem

QQuickItemの geometryChanged() 関数の名前がgeometryChange() に変更されました。

QQuickWidget

QQuickWidget は、シーングラフが OpenGL でレンダリングされている場合にのみ機能します。VulkanやMetalなどの他のグラフィックスAPIを使用している場合は機能しません。 に依存するアプリケーションは、main()関数内で を呼び出すことで、OpenGL の使用を強制する必要があります。QQuickWidget QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGL)

QQuick* APIへの変更

  • 独自の Vulkan、Metal、または Direct3D レンダリングコマンドのセットを統合したいアプリケーションは、QQuickWindow::beforeRendering() と afterRendering() に加えて、新しいQQuickWindow シグナルに注意する必要があります。既存のQt 5のパターンであるbeforeRenderingやafterRenderingへの接続だけでは不十分な場合が多く、beforeRenderPassRecording()やafterRenderPassRecording()などの追加シグナルへの接続で補完する必要があるでしょう。
  • 独自のOpenGLレンダリング・コマンドのセットを発行するために、QQuickWindow::beforeRendering ()またはafterRendering()シグナルに依存するアプリケーションは、OpenGL呼び出しの前にQQuickWindow::beginExternalCommands ()を呼び出し、OpenGL呼び出しの後にQQuickWindow::endExternalCommands ()を呼び出す必要があります。これにより、アプリケーションコードによる状態の変更が、シーングラフ・レンダラー自身のキャッシュされた状態に関して混乱を招かないようにする。しかし、Qt 5と同様に、Qt Quickレンダラーによって使用されていないOpenGL 3.xまたは4.xの状態を変更すると、予期しない問題が発生する可能性があるため、アプリケーションは、これらのシグナルに接続されたスロットまたはラムダから戻る前に、そのようなOpenGLの状態をデフォルト値にリセットすることをお勧めします。
  • 既存のQQuickWindow::setRenderTarget ()オーバーロードと関連するゲッターは削除され、QQuickRenderTarget を取る新しい関数に置き換えられました。QQuickRenderControl と組み合わせてリダイレクトレンダリングを実行するアプリケーションは、OpenGLに縛られない方法でレンダーターゲットを指定するために、この新しい関数を使用することが期待されるようになりました。
  • QSGRendererInterface::GraphicsApi 引数を取るQQuickWindow::setSceneGraphBackend() オーバーロードの名前がsetGraphicsApi() に変更されました。
  • QQuickWindow 関数 setPersistentOpenGLContext と isPersistentOpenGLContext の名前が変更され、QQuickWindow::setPersistentGraphics() とQQuickWindow::isPersistentGraphics() になりました。
  • setClearBeforeRendering() と clearBeforeRendering() はQQuickWindow から削除されました。 Qt 6 ではカラーバッファのクリアをスキップするオプションはありません。setClearBeforeRendering() の呼び出しは、Qt Quick がカラーバッファにレンダリングされたコンテンツをクリアするのを防ぐために、Qt 5 ではアンダーレイと組み合わせてしばしば必要でした。Qt 6 では、beforeRenderPassRecording() シグナルに接続することで、クリア後、Qt Quick のコンテンツをレンダリングする前にレンダリングすることができます。
  • QQuickWindow::openglContext() 関数は削除されました。アプリケーションがシーングラフがレンダリングに OpenGL を使用していることを確認したら、QSGRendererInterface::getResource() からQOpenGLContext を問い合わせることができます。
  • QQuickWindow::openglContextCreated() シグナルが削除されました。
  • 非推奨の QQuickWindow::createTextureFromId() 関数が削除されました。代わりに、QPlatformInterface::QSGOpenGLTexture、QPlatformInterface::QSGVulkanTexture、QPlatformInterface::QSGD3D11Texture、または QPlatformInterface::QSGMetalTexture の fromNative() 関数を使用してください。
  • QQuickFramebufferObject クラスは、変更されていない API で利用可能ですが、シーングラフが OpenGL でレンダリングされている場合にのみ機能します。VulkanやMetalなど、他のグラフィックスAPIを使用する場合は機能しません。QQuickFramebufferObject に依存するアプリケーションは、main()関数内でQQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGL) を呼び出すことで、強制的に OpenGL を使用する必要があります。
  • QQuickRenderControl grab()は削除され、代わりに ()を使用します。initialize()関数は、 を受け取らなくなりました。アプリケーションは、 ()と ()を適宜呼び出す必要があります。マルチサンプリングが必要な場合は、新しい関数 () を呼び出してサンプル数を指定する必要があります。QQuickWindow::grabWindow QOpenGLContext QQuickRenderControl::beginFrame QQuickRenderControl::endFrame QQuickRenderControl::setSamples
  • 既存のネイティブ・グラフィックス・デバイスやコンテキスト・オブジェクトと組み合わせて Qt Quick レンダリングを実行したいアプリケーションは、QQuickRenderControlinitialize(QOpenGLContext*) 関数を提供しなくなったため、新しいQQuickWindow::setGraphicsDevice() 関数を使用する必要があります。
  • QQuickPaintedItemContext2DFramebuffer モードに設定しても効果はありません。デフォルトのImageモードに設定されているのと同じように動作します。
  • 環境変数QSG_NO_DEPTH_BUFFER は Qt 6.0 でもサポートされていますが、その使用はQQuickGraphicsConfigurationsetDepthBufferFor2D() を呼び出すことで置き換えることを推奨します。 はQQuickWindow と関連付けられます。

QSG* API の変更点

  • QSGMaterialShader のインターフェイスが変更されました。実装はもはやOpenGLに依存すべきではなく、今では削除されたupdateState()のような関数が currentで呼び出されると仮定することはできません。新しい、データ指向のインターフェイスでは、updateState()は、 ()、 ()、 ()で置き換えられます。文字列として提供される GLSL シェーダーコードの代わりに、シェーダーは コマンドラインツールなどの Qt Shader Tools モジュールのツールによって前処理されることが期待されるようになりました。これにより、実行時にどのグラフィックス API(Vulkan、Metal、OpenGL、または Direct 3D)が使用されているかに関係なく、シェーダー資産が使用可能であることが保証されます。QOpenGLContext updateUniformData updateSampledImage updateGraphicsPipelineState qsb
  • QSGEngine は削除されました。万が一、このクラスを使用するアプリケーションがある場合は、代わりにQQuickRenderControl を使用するように移植することをお勧めします。
  • QSGAbstractRenderer はパブリックではなくなりました。このクラスの使用はQSGEngineとの組み合わせでのみ意味があり、このクラスが削除されたため、QSGAbstractRendererはprivateに戻されました。
  • QSGSimpleMaterial 便利クラスは削除されました。アプリケーションは、改訂された OpenGL に依存しないQSGMaterial API を代わりに使用することが期待されています。
  • QSGTexture の基礎となるネイティブ・テクスチャ・オブジェクトにアクセスするために、textureId() は使用できなくなりました。代わりに、QSGTexture::platformInterface() を QPlatformInterface::QSGOpenGLTexture、QPlatformInterface::QSGVulkanTexture、QPlatformInterface::QSGD3D11Texture、または QPlatformInterface::QSGMetalTexture とともに使用してください。
  • QSGImageNode のサブクラスは、setAnisotropyLevel() や anisotropyLevel() などの新しい追加バーチャルをオーバーライドする必要があります。
  • QSGTexture のサブクラスは再設計する必要がありそうです。bind()やupdateBindOptions()のようなOpenGL固有の仮想関数のいくつかはもはや存在しませんが、comparisonKey()のような実装が必須となる新しい仮想関数があります。

Qt Quick での OpenGL 使用に関する変更

多くのアプリケーションにとっては何の問題もありませんが、アプリケーション開発者は、Qt 6 の Qt Quick レンダリングでは、OpenGL が必ずしもデフォルトの選択肢ではなくなっていることに注意する必要があります。software バックエンドを使用しない限り、Qt Quick アプリケーションは実行時に OpenGL、Vulkan、Metal、または Direct3D 11 を使用できます。QSG_RHI_BACKEND 環境変数またはQQuickWindow::setSceneGraphBackend() 関数によって明示的な要求が行われなかった場合、Qt Quick によってプラットフォーム固有のデフォルトが選択されます。

詳細については、Qt Quick Scene GraphQt Quick Scene Graph Default Renderer のページを参照してください。

©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。