Qt QML の変更点

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

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

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

QML 言語

URLの解決

Qt 5 では、相対 URL は、特に url プロパティに割り当てられた場合、不統一ではありますが、直接解決されることがよくありました。Qt 6では、このようなことはなくなりました。

もし、"/home/qml/example.qml "の下にQMLファイルが保存されていて、"example.qml "の中に

property url imageFolder: "./images"

が含まれていた場合、urlプロパティには"/home/qml/images "というURLが格納されます。そのため、Qt 6 では URL は相対 URL のままとなり、必要な場合(Image コンポーネントのソースとして使用される場合など)にのみ解決されます。旧来の動作に依存している場合はQt.resolvedUrl

例えば

property url imageFolder: "./images"

のように書き換えることができます。

property url imageFolder: Qt.resolvedUrl("./images")

Qt.resolvedUrl は Qt 5 と 6 の両方で使用できます。

バリアント・プロパティ

variant プロパティは、Qt 5 から廃止されましたが、 プロパティと全く同じように扱われます。バリアント・プロパティへの代入で暗黙の文字列変換に依存していたコードは、正しい型のオブジェクトを明示的に作成するように更新する必要があります。var

例えば

property variant myColor: "red"

のようなコードがあれば、次のように書き換えることができます。

property variant myColor: Qt.color("red")

暗黙の文字列変換は

  • color(代わりにQt.colorを使います)、
  • date (代わりに Date オブジェクトを使います)、
  • rect(代わりにQt.rectを使う)、そして
  • size (代わりに Qt.size を使ってください)

variant 新しいコードでは、代わりに プロパティを使用することが強く推奨されます。var

注: プロパティの型が変更されないことが分かっている場合は、var プロパティではなく、具体的な型のプロパティを使用してください。

注: これらの変換は、エンジンに登録されたクラスのQVariant プロパティにも適用されました。variant プロパティと同様に、暗黙の文字列変換に依存していたコードは、Qt オブジェクトの対応する関数を使用する必要があります。

ソース非互換 API の変更

変更された API

QQmlListProperty CountFunction と は、Qt のコンテナの対応する変更に合わせて、 の代わりに を使用するように変更されました。AtFunction int qsizetype

例えば

int myCountFunction(QQmlListProperty<MyType> *);
MyType *myAtFunction(QQmlListProperty<MyType> *, int);

QQmlListProperty<MyType> myReadOnlyList(containingObject, container, &myCountFunction,
                                        &myAtFunction);

のように書き換えることができます。

qsizetype myCountFunction(QQmlListProperty<MyType> *);
MyType *myAtFunction(QQmlListProperty<MyType> *, qsizetype);

QQmlListProperty<MyType> myReadOnlyList(containingObject, container, &myCountFunction,
                                        &myAtFunction);

Qt 5 と Qt 6 の両方をサポートする必要があるコードは、Qt 5 ではint で Qt 6 ではqsizetype である typedef を使うか、すでにそのような型エイリアスであるQList::size_type を使うことができます。

削除された API

様々な非推奨関数が削除されました。

  • 参照を取るQQmlListProperty コンストラクタは削除されました。

    例えば

    QQmlListProperty<QObject>(owner, owner->objectList);

    のようなコードがあれば

    QQmlListProperty<QObject>(owner, &owner->objectList);
  • 関数qmlDebug,qmlInfo,qmlWarning,qmlContext,qmlEngine は、以前はグローバル名前空間(名前空間付きビルドでは Qt 名前空間)とQtQml 名前空間の両方に存在していました。これらの関数は現在、グローバル名前空間のみに存在します。

    例えば

    QQmlEngine *engine = QtQml::qmlEngine(qmlObject);

    のようなコードがあれば、次のように書き換えることができます。

    QQmlEngine *engine = qmlEngine(qmlObject);
  • 引数を取らないオーバーロードqmlRegisterType は削除された。代わりにqmlRegisterAnonymousType を使うか、QML_ANONYMOUS で宣言的な型登録に切り替えてください。

    例えば

    class AnonymousType : public QObject {
      // ...
    };
    
    qmlRegisterType<AnonymousType>();

    のようなコードがあれば

    class AnonymousType : public QObject {
      // ...
    };
    
    qmlRegisterAnonymousType<AnonymousType>("MyModule", 1);

    あるいは

    class AnonymousType : public QObject {
        QML_ANONYMOUS
        // ...
    };
  • バージョン引数を取らないqmlRegisterExtendedTypeqmlRegisterInterface のオーバーロードは削除された。バージョンを指定するオーバーロードを使うか、QML_EXTENDEDQML_INTERFACE を使って宣言的な型登録に切り替えてください。

    例えば

    struct GreetInterface
    {
       virtual ~GreetInterface();
       virtual void greet();
    };
    Q_DECLARE_INTERFACE(GreetInterface, "org.hi.GreetInterface")
    
    qmlRegisterInterface<GreetInterface>("Greeter");

    のようなコードがあれば、次のように書き換えることができる。

    struct GreetInterface
    {
       virtual ~GreetInterface();
       virtual void greet();
    };
    Q_DECLARE_INTERFACE(GreetInterface, "org.hi.GreetInterface")
    
    qmlRegisterInterface<GreetInterface>("Greeter", 1);

    あるいは

    struct GreetInterface
    {
       QML_INTERFACE(Greeter)
       virtual ~GreetInterface();
       virtual void greet();
    };
    Q_DECLARE_INTERFACE(GreetInterface, "org.hi.GreetInterface")

    注: 新しいコードでは、宣言的な型登録が望ましい。

  • 関数QJSValue::engine は削除された。エンジンへのアクセスが必要な場合は、代わりにエンジンへの参照を格納する必要があります。
  • qmlAttachedPropertiesObjectById および は削除されました。代わりに の オーバーロードを使用してください。qmlAttachedPropertiesObject(int *, const QObject *, const QMetaObject *, bool) qmlAttachedPropertiesObject qmlAttachedPropertiesObject(QObject *, QQmlAttachedPropertiesFunc, bool)
  • QJSEngine::installTranslatorFunctions QJSEngine::installExtensions が代わりに使用できます。

    例えば

    QJSEngine engine;
    engine.installTranslatorFunctions();

    のようなコードがあれば

    QJSEngine engine;
    engine.installExtensions(QJSEngine::TranslationExtension);

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