Qt クイックコントロールの変更点

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

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

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

Qt Quick Controls 1 からの移行

Qt Quick Controls 1 は Qt 5.11 で非推奨となり、Qt 6.0 から削除されました。代わりに Qt Quick Controls(以前は Qt Quick Controls 2 と呼ばれていました)を使用してください。詳細はQt 5.15を参照してください:Qt 5 ドキュメントのQt Quick Controls vs Qt Quick Controls 1を参照してください。

タイプ登録の変更

Qt Quick Controls は、Qt 6 でいくつかの大きな、主に内部的な変更を受けました。Qt 5.15 で導入された改良された型登録を利用することで、モジュールの QML ファイルを C++ にコンパイルするための道が開かれ、より効果的なツーリングが可能になりました。特に、Qt Creator の QML コードモデルはより完全な型を把握できるようになり、Qt Quick Controls コードの補完とエラーチェックの信頼性が向上します。qmllintやqmlformatのような静的解析ツールも、C++のコンパイル時に宣言されるようになった型を認識できるようになり、恩恵を受けます。

これらの変更の結果、いくつかのことが少し変わっています。

カスタムスタイルが適切なQMLモジュールに

コンパイル時の型登録を可能にするため、Qt Quick Controls の各スタイルは適切な QML モジュールになりました。以前は、独自のスタイルを作成するにはButton.qml ひとつで十分でした。便利ではありましたが、これには非標準の API が必要で、Qt Designer のようなツールで適応する必要がありました。

現在では、スタイルが実装するすべての QML タイプは、そのスタイルの qmldir ファイルで宣言する必要があります:

module MyStyle
Button 1.0 Button.qml

これを QML の世界の他の部分と統一することで、スタイルは開発者にとってより身近なものになり、初心者にとっても理解しやすくなることが期待されます。その結果、以下のAPIが削除されました:

  • QQuickStyle::addStylePath()
  • QQuickStyle::availableStyles()
  • QQuickStyle::path()
  • QQuickStyle::stylePathList()
  • qt_quick_controls_style_path

他のQMLモジュールと同様に、QMLエンジンのインポートパスでスタイルを見つける必要があるため、このAPIをサポートする必要はなくなりました。

スタイル名

さらに、スタイル名の大文字と小文字を区別する形式が1つだけになりました:"Material"、"MyStyle "などです。つまり、スタイル名はQMLモジュール名と完全に一致しなければなりません。これはファイルセレクタにも適用され、以前はすべてのスタイル名が小文字でした。例えば、Qt 5のプロジェクトでは以下のような構成が有効でした:

MyProject
├── main.qml
├── HomePage.qml
└── +material
    └───HomePage.qml

Qt 6 では、+material+Material になります:

MyProject
├── main.qml
├── HomePage.qml
└── +Material
    └───HomePage.qml

特定のスタイルでアプリケーションを実行する既存の方法はすべてサポートされています。

ランタイムとコンパイル時のスタイル選択

インポートが内部的に機能するようになったため、スタイルのインポートに特別な意味が加わりました。以前は、QtQuick.Controls をインポートすると、現在のスタイルのコントロール タイプがQMLエンジンに登録されていました:

import QtQuick.Controls

これは、実行時にスタイルが選択されるため、実行時のスタイル選択と呼ばれます。

QtQuick.Controls.Material を明示的にインポートすると、そのスタイルが提供する追加 API(たとえば、付属の Material タイプなど)が単に公開されます:

import QtQuick.Controls.Material

現在、スタイルを明示的にインポートすると、その両方が実行されます。

これは、最後にインポートされたスタイルのコントロール タイプ(Button など)が使用されることを意味します。これをコンパイル時のスタイル選択と呼びます。

これは既存のコードに影響を与えます。つまり、アプリケーションが複数のスタイルをサポートしている場合は、これらのインポートをファイル選択された独自のQMLファイルに移動します。

例えば、main.qml

import QtQuick.Controls
import QtQuick.Controls.Material
import QtQuick.Controls.Universal

ApplicationWindow {
    width: 600
    height: 400
    visible: true

    Material.theme: darkMode ? Material.Dark : Material.Light
    Universal.theme: darkMode ? Universal.Dark : Universal.Light

    // Child items, etc.
}

共通のコードを "base "コンポーネントに移動することができます:

// MainWindow.qml

import QtQuick.Controls

ApplicationWindow {}

次に、+Material サブディレクトリを追加し、その中にマテリアル固有のコードをMainWindow.qml に追加します:

// +Material/MainWindow.qml

import QtQuick.Controls.Material

ApplicationWindow {
    Material.theme: darkMode ? Material.Dark : Material.Light
}

Universalも同様にします:

// +Universal/MainWindow.qml

import QtQuick.Controls.Universal

ApplicationWindow {
    Universal.theme: darkMode ? Universal.Dark : Universal.Light
}

次に、main.qml

import QtQuick.Controls

MainWindow {
    width: 600
    height: 400
    visible: true

    // Child items, etc.
}

も参照してください:Qt Quick Controls でファイルセレクタを使う

デフォルトスタイル

デフォルトスタイルは、もはやデフォルトスタイルではないため、"Basic" に名前が変更されました。代わりに、デフォルトのスタイルは Qt がビルドされたプラットフォームに基づいて選択されるようになりました:

そのため、Qt 5 でスタイルを指定せず、カスタマイズしたコントロールを使用しているアプリケーションでは、Qt 6 で Basic スタイルを明示的に指定し、それらのコントロールが Qt 5 と同じように見え、動作するようにする必要があります。

パレット

パレット API はQQuickItem に移動しました。 Qt Quick Controls でパレットを使用する様々な API に変更はありません。

コントロール

ApplicationWindow の変更

非推奨のオーバーレイ プロパティとアタッチ API が削除されました。代わりにOverlay のアタッチドタイプを使用してください。

コンボボックスに関する変更

pressed プロパティが読み取り専用になりました。ComboBox の視覚的に押された状態を変更するには、代わりにdown プロパティを使用してください。

コンテナに関する変更

非推奨のremoveItem(var) 関数が削除されました。removeItem(Item) またはtakeItem(int) を代わりに使用できます。

ダイアログの変更

Dialog done()、 ()、 () を呼び出すとき、 () と () シグナルが () の前に発行されるようになりました。accept reject accepted rejected closed

Menu に関する変更

非推奨のremoveItem(var) 関数が削除されました。removeItem(Item)またはtakeItem(int)を代わりに使用できます。

ツールチップの変更

ToolTipのタイムアウトは、opened() が発行された後にのみ開始されるようになりました。この結果、エンター遷移を持つツールチップは、タイムアウト・プロパティの全期間表示されるようになりました。これは、以前よりも若干長く表示されることを意味します。そのため、アプリケーションでツールチップを視覚的にチェックし、必要に応じてタイムアウトを調整する価値があるかもしれません。

StackViewの変更

StackView.Transition列挙値は非推奨となりました。与えられた操作に対してデフォルトのトランジションを使用するために、operation引数を省略することができます。

Tumblerに対する変更

implicitWidth Tumbler と は、 の で提供されなければならなくなりました。implicitHeight Tumbler contentItem

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