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 ライセンスの下で利用可能です。
詳細はこちら。