このページでは

変更点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 プロパティには URL "/home/qml/images" が格納されていました。このため、Qml でこのような形で相対 URL を使用することは不可能でした。そこで Qt 6 では、URL は相対的なまま維持され、必要な場合(例えば、Image コンポーネントのソースとして使用される場合など)にのみ解決されるようになりました。 従来の挙動に依存している場合は、次のように記述できます。Qt.resolvedUrl

たとえば、次のようなコードがある場合

property url imageFolder: "./images"

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

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

Qt.resolvedUrlは、Qt 5とQt 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

QQmlListPropertyの `CountFunction ` および `AtFunction ` は、Qt のコンテナにおける対応する変更に合わせて、`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
        // ...
    };
  • バージョン引数を受け取らない `qmlRegisterExtendedType ` および `qmlRegisterInterface ` のオーバーロードは削除されました。バージョンを指定するオーバーロードを使用するか、QML_EXTENDED およびQML_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);

「QMLモジュールの近代化」および「QMLモジュールのCMakeへの移植」も参照してください 。

© 2026 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.