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
QQmlListProperty
Qt のコンテナの対応する変更に合わせて、CountFunction
と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 // ... };
- バージョン引数を取らない
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();
のようなコードがあれば
Modern QML modulesやPort 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.