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 の両方で使用できます。

移植の補助として、QML_COMPAT_RESOLVE_URLS_ON_ASSIGNMENT 環境変数を 1 に設定することで、Qt 5 の動作を得ることができます。これは Qt 6.2.2 から可能です。しかし、これはポートのブロックを解除するためだけに使用し、上記の説明のようにQt.resolvedUrl を使用することをお勧めします。

バリアント・プロパティ

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 は、Qt 6 では非推奨のキーワードのままですが、新しいコードでは、代わりに プロパティを使用することが強く推奨されます。var

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

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

ソース非互換 API の変更

変更された API

QQmlListPropertyQt のコンテナの対応する変更に合わせて、CountFunctionAtFunction が、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);

Modern QML modulesPort QML modules to CMakeも参照して ください。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.