C
QML オブジェクトの属性
すべてのQMLオブジェクト型には、定義済みの属性セットがあります。オブジェクト型の各インスタンスは、そのオブジェクト型に対して定義された属性セットを持って作成されます。オブジェクト属性にはさまざまな種類があり、それらは以下のセクションで説明します。
オブジェクト宣言における属性
QMLドキュメント内のオブジェクト宣言は、新しい型を定義します。また、その定義された型のインスタンスを作成する際にインスタンス化されるオブジェクト階層も宣言します。
QMLのオブジェクト型定義には、以下のいずれかの属性型を含めることもできます:
- id属性
- プロパティ属性
- シグナル属性
- シグナルハンドラ属性
- メソッド属性
- アタッチされたプロパティおよびアタッチされたシグナルハンドラ属性
- 列挙型の属性
これらの属性については、以下で詳しく説明します。
id属性
QMLオブジェクト型は、id 属性を最大1つ持つことができます。この属性は言語自体によって提供されるものであり、いかなるQMLオブジェクト型によっても再定義または上書きすることはできません。
オブジェクトインスタンスのid属性に値が割り当てられると、他のオブジェクトはそのオブジェクトインスタンスを識別し、参照できるようになります。このid は小文字またはアンダースコアで始まり、文字、数字、アンダースコア以外の文字を含んではなりません。
次の例では、TextInput オブジェクトとText オブジェクトを定義しています。TextInput オブジェクトのid の値は"myTextInput" です。Text オブジェクトは、myTextInput.text を参照することで、text プロパティをTextInput のtext プロパティと同じ値に設定しています。これにより、これら2つのアイテムには同じテキストが表示されます:
import QtQuick Column { width: 200; height: 200 TextInput { id: myTextInput; text: "Hello World" } Text { text: myTextInput.text } }
オブジェクトは、それが作成されたQMLコンテキスト内のどこからでも、そのid を使用して参照できます。したがって、id の値は、そのコンテキスト内で常に一意でなければなりません。
オブジェクトのインスタンスを作成すると、そのid属性を変更することはできません。他のプロパティのように見えるかもしれませんが、id 属性は通常のproperty 属性ではなく、特別な意味論が適用されます。例えば、前述の例ではmyTextInput.id にアクセスすることはできません。
プロパティの属性
オブジェクトのプロパティとは、静的な値に設定するか、動的な式にバインドすることができる属性です。プロパティの値は他のオブジェクトから読み取ることができます。一般的に、特定の QML タイプがそのプロパティを読み取り専用として明示的に定義していない限り、他のオブジェクトによって変更することも可能です。
プロパティ属性の定義
クラス宣言でエクスポートされるパブリックメンバーは、Qul::Property<T> 型である場合、コンポーネントのプロパティとして利用可能です。ここで、T はプロパティのC++型を表し、対応するQML型にマッピングされます。
注: 組み込みの比較演算子を持たないT 型のすべてについて 、ユーザー定義のoperator==を定義する必要があります。
この方法で定義したプロパティは、組み込みのプロパティと同様に動作します。特に、QML でバインディングを割り当てたり、他のバインディングのデータソースとして使用したりすることができます。
以下の例は、プロパティの使用方法を示しています。C++でプロパティを定義します:
struct MyData : public Qul::Object { Qul::Property<int> val; void update(int x) { // can get and set property values from C++ val.setValue(x); } };
そして、QMLで次のように使用します:
Item { Item { // can bind QML property to exported property x: mydata_x.val color: "red" width: 50 height: 50 } MyData { id: mydata_x val: 100 } MyData { id: mydata_width // can bind exported property val: parent.width } Component.onCompleted: { mydata_x.update(200); console.log(mydata_width.val); } }
注: Qul::Property::setValue を呼び出しても request Qt Quick Ultralite engine update。Event queue は、実行中のQMLアニメーションやタイマーがない場合に必要です。再描画は、以下に示すようにevent queue を使用することでトリガーできます。
struct MySingleton : public Qul::Singleton<MySingleton> { Qul::Property<int> val; // function that is called only from the C++ code void update(int value); }; class MyEventQueue : public Qul::EventQueue<int> { void onEvent(const int &value) override { // set property value in the event handler MySingleton::instance().val.setValue(value); } }; void MySingleton::update(int value) { static MyEventQueue myEventQueue; myEventQueue.postEvent(value); }
詳細については、「 Qt Quick Ultralite でのプロパティの使用」を参照してください。
カスタムプロパティ属性の定義
あるいは、次の構文を使用して、オブジェクト型のカスタムプロパティを定義することもできます:
[readonly] property <propertyType> <propertyName>
これにより、オブジェクトは特定の値を外部オブジェクトに公開したり、内部状態をより簡単に管理したりできるようになります。
プロパティ名は小文字で始まり、文字、数字、およびアンダースコアのみを含めることができます。JavaScript の予約語は、プロパティ名として使用できません。
readonly キーワードは省略可能であり、プロパティの意味論を変更します。詳細については、読み取り専用プロパティを参照してください。
カスタムプロパティを宣言すると、そのプロパティに対する値変更シグナルが暗黙的に作成されるほか、on<PropertyName>Changed という名前の関連するシグナルハンドラも作成されます。ここで、<PropertyName> はプロパティ名であり、最初の文字は大文字になります。
たとえば、次のオブジェクト宣言は、Rectangle 基底型から派生した新しい型を定義しています。この型には 2 つの新しいプロパティがあり、そのうちの 1 つがシグナルハンドラを定義しています。
Rectangle { property color previousColor property color nextColor onNextColorChanged: console.log("The next color will be: " + nextColor.toString()) }
カスタムプロパティ定義で有効な型
QMLの値型であれば、どれでもカスタムプロパティの型として使用できます。たとえば、以下はすべて有効なプロパティ宣言です:
注:列挙型の 値は単なる整数値であり、int 型を使用して参照できます。
QtQuick モジュールによって提供される値型の中には、そのモジュールをインポートしない限り、プロパティ型として使用できないものがあります。詳細については、QMLの値型を参照してください。
さらに、任意のQML オブジェクト型をプロパティ型として使用することもできます。例:
property Item someItem property Rectangle someRectangle
これはカスタムQML型にも当てはまります。ColorfulButton.qml ファイルでQML型を定義した場合、ColorfulButton 型のプロパティは有効です。
プロパティ属性への値の割り当て
オブジェクトのインスタンスプロパティに値を代入するには、次のいずれかの方法を使用できます。
- 初期化時の値の代入
- 命令型による値の代入
いずれの場合も、値は静的な値か、バインディング式かのいずれかになります。
初期化時の値代入
初期化時にプロパティに値を代入するための構文は次のとおりです:
<propertyName> : <value>
オブジェクト宣言内のプロパティ定義で初期値を割り当てることができます。その場合は、プロパティ定義に次の構文を使用します:
property <propertyType> <propertyName> : <value>
以下は、プロパティ値の初期化の例です:
import QtQuick Rectangle { color: "red" property color nextColor: "blue" // combined property declaration and initialization }
命令型の値代入
命令型値代入とは、命令型の JavaScript コードを使用して、プロパティに値(静的値またはバインディング式)を代入することです。命令型値代入の構文は、以下に示すように、単なる JavaScript の代入演算子です:
[<objectId>.]<propertyName> = value
以下に、命令型値代入の例を示します:
import QtQuick Rectangle { id: rect Component.onCompleted: { rect.color = "red" } }
注: Qt for MCUs では 、JavaScriptの一部の機能のみがサポートされています。詳細については、「Qt Quick UltraliteアプリケーションのJavaScript環境」を参照してください。
静的値とバインディング式による値
前述の通り、プロパティに割り当てることができる値には、静的値とバインディング式という2種類があります。後者は、プロパティバインディングとも呼ばれます。
| 種類 | 意味 |
|---|---|
| 静的値 | 他のプロパティに依存しない定数値。 |
| バインディング式 | プロパティと他のプロパティとの関係を記述する JavaScript 式。この式内の変数は、そのプロパティの依存関係となります。 QMLエンジンは、プロパティとその依存関係との間の関係を強制します。依存関係のいずれかの値が変更されると、QMLエンジンは自動的にバインディング式を再評価し、新しい結果をそのプロパティに代入します。 注: Qt for MCUs は 、JavaScriptの限定されたサブセットのみをサポートしています。詳細については、「Qt Quick UltraliteアプリケーションのJavaScript環境」を参照してください。 |
次の例は、これら 2 種類の値をプロパティに代入する方法を示しています。
import QtQuick Rectangle { // both of these are static value assignments on initialization width: 400 height: 200 Rectangle { // both of these are binding expression value assignments on initialization width: parent.width / 2 height: parent.height } }
型安全性
プロパティは型安全であるため、そのプロパティの型と一致する値のみを代入することができます。
たとえば、プロパティがint 型である場合、そこに文字列を代入しようとすると、エラーが発生します:
property int volume: "four" // generates an error; the code will not compile
同様に、実行時に異なる型の値を代入しようとすると、エラーが発生します。
一部のプロパティ型には自然な値の表現形式が存在しないため、QMLエンジンはそれらのプロパティ型に対して、文字列から型付き値への変換を自動的に行います。例えば、color 型のプロパティは文字列ではなく色を格納しますが、color プロパティに「"red" 」という文字列を割り当ててもエラーは発生しません。
デフォルトでサポートされているプロパティ型のリストについては、「すべての QML 型」を参照してください。
特殊なプロパティ型
オブジェクトリストのプロパティ属性
list 型のプロパティには、QMLオブジェクト型の値のリストを割り当てることができます。オブジェクトリストの値を定義する構文は、角括弧で囲まれたカンマ区切りのリストです:
[ <item 1>, <item 2>, ... ]
たとえば、Item 型には、State 型のオブジェクトのリストを保持するために使用されるstates プロパティがあります。以下のコードは、このプロパティの値を3つのState オブジェクトのリストに初期化しています:
import QtQuick Item { states: [ State { name: "loading" }, State { name: "running" }, State { name: "stopped" } ] }
リストに要素が1つだけ含まれている場合は、角括弧を省略できます:
オブジェクト宣言において、list 型の値をプロパティに割り当てるには、次の構文を使用します:
property list<<ObjectType>> propertyName
他のプロパティ宣言と同様に、オブジェクトを宣言する際にプロパティを初期化するには、次の構文を使用します:
property list<<ObjectType>> propertyName: <value>
リストプロパティの宣言例を以下に示します:
import QtQuick Rectangle { // declaration without initialization property list<Rectangle> siblingRects // declaration with initialization property list<Rectangle> childRects: [ Rectangle { color: "red" }, Rectangle { color: "blue"} ] }
グループ化されたプロパティ
場合によっては、プロパティがサブプロパティ属性の論理的なグループを含むことがあります。これらのサブプロパティ属性には、ドット表記またはグループ表記のいずれかを使用して値を割り当てることができます。
たとえば、Text 型にはfont というグループプロパティがあります。次の例では、最初のText オブジェクトはドット表記を使用してfont の値を初期化していますが、2番目のオブジェクトはグループ表記を使用しています。
Text {
//dot notation
font.pixelSize: 12
font.b: true
}
Text {
//group notation
font { pixelSize: 12; b: true }
}グループ化されたプロパティ型とは、サブプロパティを持つ型のことです。グループ化されたプロパティ型がオブジェクト型(値型とは対照的に)である場合、それを保持するプロパティは読み取り専用でなければなりません。これは、サブプロパティが属するオブジェクトが置き換えられるのを防ぐためです。
プロパティの別名
プロパティエイリアスとは、別のプロパティへの参照を保持するプロパティのことです。プロパティに対して新しく一意の記憶領域を割り当てる通常のプロパティ定義とは異なり、プロパティエイリアスは、新しく宣言されたプロパティ(エイリアシングプロパティと呼ばれる)を、既存のプロパティ(エイリアシング対象プロパティ)への直接参照として結びつけます。
プロパティエイリアスの宣言は、通常のプロパティ定義と似ていますが、プロパティ型の代わりにalias キーワードを指定する必要がある点、およびプロパティ宣言の右辺が有効なエイリアス参照でなければならない点が異なります:
property alias <name>: <alias reference>
通常のプロパティとは異なり、エイリアスには以下の制限があります:
- エイリアスは、そのエイリアスプロパティを宣言する型のスコープ内にあるオブジェクト、またはそのオブジェクトのプロパティのみを参照できます。
- 任意の JavaScript 式を含めることはできません。
- その型のスコープ外で宣言されたオブジェクトを参照することはできません。
- 通常のプロパティのオプションのデフォルト値とは異なり、宣言時には `
alias` 参照が必須です。 - 添付プロパティを参照することはできません。
- 深さが 2 を超える階層内のプロパティを参照することはできません。
次の例では、buttonText というエイリアスを持つプロパティを持つButton 型が、Text の子であるtext オブジェクトに接続されています。
// Button.qml import QtQuick Rectangle { property alias buttonText: textItem.text width: 100; height: 30; color: "yellow" Text { id: textItem } }
次のコードは、子オブジェクト `Text ` に対して定義済みのテキスト文字列を持つ `Button ` を作成します:
Button { buttonText: "Click Me" }
ここでは、buttonText を変更すると、textItem.text の値が直接変更されます。textItem.text を更新するために他の値を変更するわけではありません。エイリアスがなければ、buttonText を変更しても表示されるテキストは更新されません。これは、プロパティのバインディングが単方向であるためです。つまり、textItem.text はbuttonText に影響しますが、その逆は成り立ちません。
プロパティのエイリアスと型
プロパティエイリアスには、明示的な型指定を行うことはできません。プロパティエイリアスの型は、それが参照するプロパティまたはオブジェクトのdeclared 型となります。したがって、id を使用してオブジェクトへのエイリアスを作成した場合、そのエイリアスを通じて追加のプロパティにアクセスすることはできません:
// MyItem.qml Item { property alias inner: innerItem Item { id: innerItem property int extraProperty } }
inner は単なるItem であるため、このコンポーネントの外部からinner.extraProperty を初期化することはできません:
// main.qml MyItem { inner.extraProperty: 5 // fails }
ただし、inner オブジェクトを別の QML ドキュメント(.qml )に抽出すれば、それをインスタンス化して、エイリアスを介してすべてのプロパティにアクセスすることができます:
// MainItem.qml Item { // Now you can access inner.extraProperty, as inner is now an ExtraItem property alias inner: innerItem ExtraItem { id: innerItem } }
読み取り専用プロパティ
オブジェクト宣言では、readonly キーワードを使用して、以下の構文に従って読み取り専用プロパティを定義できます。
readonly property <propertyType> <propertyName> : <value>
読み取り専用プロパティには、初期化時に静的値またはバインディング式を割り当てる必要があります。
注: 読み取り専用プロパティが初期化されると 、その静的値やバインディング式を変更することはできなくなります。
次の例では、Component.onCompleted ブロック内のコードは無効です:
Item { readonly property int someNumber: 10 Component.onCompleted: someNumber = 20 // TypeError: Cannot assign to read-only property }
プロパティ修飾子オブジェクト
プロパティには、プロパティ値修飾子オブジェクトを関連付けることができます。特定のプロパティに関連付けられたプロパティ修飾子型のインスタンスを宣言する構文は次のとおりです:
<PropertyModifierTypeName> on <propertyName> { // attributes of the object instance }
これは一般に「on」構文と呼ばれます。
前述の構文は、既存のプロパティに対して作用するオブジェクトをインスタンス化するオブジェクト宣言であることに注意することが重要です。
特定のプロパティ修飾子型は特定のプロパティ型にのみ適用可能ですが、これは言語によって強制されるものではありません。例えば、QtQuick モジュール内のNumberAnimation 型は、数値型(int やreal など)のプロパティのみをアニメーション化します。数値型以外のプロパティでNumberAnimation を使用しようとしても、エラーにはなりません。 特定のプロパティ型に関連付けられたプロパティ修飾子の動作は、その実装によって定義されます。
シグナル属性
シグナルとは、何らかのイベントが発生したことをオブジェクトから通知するものです。例えば、プロパティが変更された、アニメーションが開始または停止した、あるいは画像がダウンロードされた場合などです。例えば、MouseArea 型には、ユーザーがマウス領域内をクリックしたときに発火するclicked シグナルがあります。
特定のシグナルが発信されるたびに、オブジェクトはシグナルハンドラを通じて通知を受けることができます。シグナルハンドラはon<Signal>という構文で宣言されます。ここで、<Signal>はシグナルの名前であり、最初の文字は大文字で表記されます。 シグナルハンドラは、シグナルを発行するオブジェクトの定義内で宣言する必要があり、ハンドラには、シグナルハンドラが呼び出された際に実行される JavaScript コードのブロックを含める必要があります。
たとえば、以下のonClickedシグナルハンドラは、MouseArea オブジェクトの定義内で宣言されており、MouseArea がクリックされたときに呼び出され、コンソールにメッセージが出力されます。
import QtQuick Item { width: 100; height: 100 MouseArea { anchors.fill: parent onClicked: { console.log("Click!") } } }
シグナル属性の定義
Qul::Signal<Fn> 型のパブリックメンバーは、QML コンポーネント上のシグナルに変換されます。
テンプレート引数Fn は、シグナルのパラメータ型を記述する関数型でなければなりません。通常通り、これらの型は対応するQML型にマッピングされます。同様に、Fn で使用されるパラメータ名は、QMLシグナルのパラメータ名となります。
以下のコードは、シグナルの使用方法を示しています:
struct MyItem : public Qul::Object { Qul::Signal<void(int sigValue)> triggered; void callTriggered() { triggered(42); } };
Item { MyItem { id: myitem onTriggered: console.log(sigValue); } Component.onCompleted: myitem.callTriggered() }
プロパティ変更シグナル
QML 型には、プロパティ属性で前述したように、プロパティの値が変更されるたびに発火する組み込みのプロパティ変更シグナルも用意されています。これらのシグナルがなぜ有用なのか、またその使用方法の詳細については、プロパティ変更シグナルハンドラを参照してください。
シグナルハンドラ属性
シグナルハンドラは特殊なメソッド属性であり、関連するシグナルが発火されるたびに、QMLエンジンによってそのメソッドの実装が呼び出されます。QMLのオブジェクト定義にシグナルを追加すると、関連するシグナルハンドラが自動的にそのオブジェクト定義に追加されます。デフォルトでは、このシグナルハンドラの実装は空になっています。プログラムロジックを実装するには、クライアント側が実装を定義します。
activated およびdeactivated シグナルを持つ、次のSquareButton 型(SquareButton.qml で定義)を考えてみましょう。
// SquareButton.qml Rectangle { id: root signal activated(xPosition: real, yPosition: real) signal deactivated property int side: 100 width: side; height: side MouseArea { anchors.fill: parent onReleased: root.deactivated() onPressed: root.activated(mouse.x, mouse.y) } }
これらのシグナルは、同じディレクトリ内の別のQMLファイルにある任意のSquareButton オブジェクトによって受信可能であり、そのファイル内でクライアントがシグナルハンドラの実装を提供します:
// myapplication.qml SquareButton { onDeactivated: console.log("Deactivated!") onActivated: { console.log(`Activated at ${xPosition}, ${yPosition}`) } }
シグナルではパラメータ型がすでに指定されているため、シグナルハンドラでパラメータ型を宣言する必要はありません。
シグナルの使用に関する詳細については、「シグナルおよびハンドラによるイベントシステム」を参照してください。
プロパティ変更シグナルハンドラ
プロパティ変更シグナルのシグナルハンドラは、on<Property>Changed という構文をとります。ここで、<Property> はプロパティ名であり、最初の文字は大文字で表記されます。たとえば、TextInput 型にはtextChanged シグナルに関する記述はありませんが、TextInput にはtext プロパティがあるため、このシグナルは暗黙的に利用可能です。つまり、onTextChanged シグナルハンドラを使用して、text プロパティの変更に反応させることができます:
import QtQuick TextInput { text: "Change this!" onTextChanged: console.log(`Text has changed to: ${text}`) }
メソッド属性
オブジェクト型のメソッドとは、何らかの処理を行うため、あるいはさらなるイベントをトリガーするために呼び出すことができる関数です。メソッドはシグナルに接続することができ、シグナルが発信されるたびに自動的に呼び出されます。詳細については、「シグナルおよびハンドラによるイベントシステム」を参照してください。
メソッド属性の定義
Qt for MCUs また、QML で利用可能なオブジェクトやシングルトンに対して、デフォルトで C++ 関数が提供されます。詳細については、「Qt Quick Ultralite での関数の使用」を参照してください。
あるいは、QMLドキュメント内のオブジェクト宣言に、次の構文を使用してカスタムメソッドを追加することもできます。
function <functionName>([<parameterName>[: <parameterType>][, ...]]) [: <returnType>] { <body> }
QML 型にメソッドを追加することで、独立した再利用可能な JavaScript コードブロックを定義できます。これらのメソッドは、内部オブジェクトまたは外部オブジェクトのいずれからも呼び出すことができます。また、メソッドのパラメータ型を宣言する必要があります。
同じ型ブロック内で同じ名前のメソッドやシグナルを2つ宣言しようとするとエラーになります。ただし、新しいメソッドでは、その型上の既存のメソッドの名前を再利用することは可能です。ただし、既存のメソッドが非表示になり、アクセスできなくなる可能性があるため、この操作は慎重に行う必要があります。
以下は、height の値を代入した際に呼び出されるcalculateHeight() メソッドを持つRectangle の例です:
import QtQuick Rectangle { id: rect function calculateHeight(): real { return rect.width / 2; } width: 100 height: calculateHeight() }
メソッドにパラメータがある場合、そのパラメータはメソッド内で名前によって参照できます。以下の例では、MouseArea をクリックするとmoveTo() メソッドが呼び出され、そのメソッド内で受け取ったnewX およびnewY パラメータを参照してテキストの位置を調整します:
import QtQuick Item { width: 200; height: 200 MouseArea { anchors.fill: parent onClicked: label.moveTo(mouse.x, mouse.y) } Text { id: label function moveTo(newX: real, newY: real) { label.x = newX; label.y = newY; } text: "Move me!" } }
アタッチされたプロパティとアタッチされたシグナルハンドラ
アタッチされたプロパティとシグナルハンドラは、オブジェクトに追加のプロパティやシグナルハンドラを付与するための仕組みであり、これらがなければオブジェクトはそれらを利用できません。特に、これらはオブジェクトが、その個々のオブジェクトに特に関連するプロパティやシグナルにアクセスできるようにします。
QML 型の実装では、特定のプロパティやシグナルを持つアタッチ型を C++ で作成することを選択できます。実行時にこの型のインスタンスを作成して特定のオブジェクトにアタッチすることで、それらのオブジェクトがアタッチ型のプロパティやシグナルにアクセスできるようになります。これらにアクセスするには、プロパティおよびそれぞれのシグナルハンドラの名前の前に、アタッチ型の名前を接頭辞として付けます。
アタッチされたプロパティおよびハンドラへの参照は、以下の構文形式をとります:
<AttachingType>.<propertyName> <AttachingType>.on<SignalName>
たとえば、PathView 型には、PathView.isCurrentItem というアタッチされたプロパティがあり、PathView 内の各デリゲートオブジェクトがこれを利用できます。各デリゲートインスタンスは、このプロパティを使用して、自分がビュー内で現在選択されている項目であるかどうかを判定します:
import QtQuick PathView { width: 240; height: 320 model: 3 delegate: Rectangle { width: 100; height: 30 color: PathView.isCurrentItem ? "red" : "yellow" } }
この場合、アタッチ元となる型の名前は `PathView ` であり、対象となるプロパティは `isCurrentItem` であるため、このアタッチされたプロパティは `PathView.isCurrentItem` と呼ばれます。
Component.onCompleted を使用すると、値の設定や関数の呼び出しなど、さまざまな初期化処理を行うことができます:
// main.qml Rectangle { id: root Component.onCompleted: { if(Qt.uiLanguage == "") { Qt.uiLanguage = "en_GB" } } }
アタッチする型の名前がComponent であり、その型にcompleted というシグナルがあるため、アタッチされたシグナルハンドラはComponent.onCompleted と呼ばれます。
アタッチされたプロパティおよびシグナルハンドラへのアクセス
よくある誤解として、アタッチされたプロパティやシグナルハンドラは、これらの属性がアタッチされたオブジェクトの子要素から直接アクセスできると想定されることがあります。しかし、実際にはそうではありません。アタッチ元型のインスタンスは、特定のオブジェクトにのみアタッチされており、そのオブジェクトとそのすべての子要素にアタッチされているわけではありません。
次の例は、アタッチされたプロパティに関する前の例を修正したものです。今回は、デリゲートがItem であり、色付けされたRectangle がその子要素となっています:
import QtQuick PathView { width: 240; height: 320 model: 3 delegate: Item { width: 100; height: 30 Rectangle { width: 100; height: 30 color: PathView.isCurrentItem ? "red" : "yellow" // WRONG! This won't work. } } }
これは期待どおりに動作しません。PathView.isCurrentItem はルートデリゲートオブジェクトにのみアタッチされており、その子要素にはアタッチされていないためです。Rectangle はデリゲートの子要素であるため、isCurrentItem というアタッチされたプロパティをPathView.isCurrentItem として参照することはできません。代わりに、この矩形はルートデリゲートを介してisCurrentItem にアクセスする必要があります:
PathView { model: 4 pathItemCount: 3 path: Path { startX: 120; startY: 100 PathQuad { x: 120; y: 25; controlX: 260; controlY: 75 } PathQuad { x: 120; y: 100; controlX: -20; controlY: 75 } } delegate: Item { id: delegateItem width: 100; height: 30 Rectangle { width: 100; height: 30 color: delegateItem.PathView.isCurrentItem ? "red" : "yellow" // correct } } }
これで、delegateItem.PathView.isCurrentItem はデリゲートのisCurrentItem アタッチドプロパティを正しく参照するようになりました。
列挙属性
列挙型は、名前付きの選択肢の固定セットを提供します。これらは、QML でenum キーワードを使用して宣言できます:
// MyText.qml Text { enum TextType { Normal, Heading } }
上記に示すように、TextType などの列挙型や、Normal などの値は、大文字で始まる必要があります。
列挙値への参照には、<Type>.<EnumerationType>.<Value> または<Type>.<Value> のいずれかの構文を使用できます。
// MyText.qml Text { enum TextType { Normal, Heading } property int textType: MyText.TextType.Normal font.bold: textType === MyText.TextType.Heading font.pixelSize: textType === MyText.TextType.Heading ? 24 : 12 }
QML での列挙型の使用方法の詳細については、enumeration を参照してください。
特定の Qt ライセンスの下で利用可能です。
詳細はこちらをご覧ください。