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 // ... };
- バージョン引数を取らない
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();
のようなコードがあれば
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。