このページでは

C

QMLオブジェクトの属性

すべての QML オブジェクトタイプには定義された属性があります。各オブジェクトのインスタンスは、そのオブジェクトタイプに定義された属性の セットとともに生成されます。オブジェクトの属性には様々な種類があり、以下の節で説明します。

オブジェクト宣言における属性

QML 文書におけるオブジェクト宣言は、新しい型を定義するものです。また、定義された型のインスタンスを生成する際にインスタンス化される オブジェクト階層を宣言します。

QMLのオブジェクト型の定義には、以下のような属性も含めることができます:

  • id属性
  • プロパティ属性
  • シグナル属性
  • シグナルハンドラ属性
  • メソッド属性
  • アタッチド・プロパティとアタッチド・シグナル・ハンドラ属性
  • 列挙属性

これらの属性の詳細は後述する。

id属性

QML オブジェクトタイプは、id 属性を最大 1 つまで持つことができます。この属性は、QML 言語が提供するものであり、どの QML オブジェクト型でも再定義したり、上書きしたりすることはできません。

オブジェクト・インスタンスのid属性に割り当てられた値によって、他のオブジェクトはそのオブジェクト・インスタンスを識別し、参照することができます。このid は、小文字かアンダースコアで始まり、文字、数字、アンダースコア以外の文字を含むことはできません。

以下の例では、TextInput オブジェクトとText オブジェクトを定義しています。TextInput オブジェクトのid の値は"myTextInput" です。Text オブジェクトは、TextInputtext プロパティと同じ値を持つように、myTextInput.text を参照してtext プロパティを設定します:

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型がそのプロパティを読み込み専用と明示的に定義している場合を除きます。

プロパティの属性の定義

エクスポートしたクラス宣言の public メンバは、Qul::Property<T> 型であれば、 コンポーネントのプロパティとして利用することができます。ここでT はプロパティの C++ 型を表し、対応する QML 型にマッピングされています。

注意: 組み込みの比較演算子を持たないすべての型T には、ユーザー定義の演算子== を与えなければなりません。

このようにして定義したプロパティは組み込みプロパティのように振る舞います。特に、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 updateEvent 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の値型は、カスタムプロパティの型として使用することができます。例えば、これらはすべて有効なプロパティ宣言です:

Item {
    property int someNumber
    property string someString
}

注: 列挙値は単に整数値であり、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 の限られたサブセットしかサポートしていません。詳しくは、JavaScript environment forQt Quick Ultralite applications をご覧ください。

以下の例は、これら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 型のプロパティは文字列ではなく色を格納しますが、"red" の文字列をcolor のプロパティに代入してもエラーは発生しません。

デフォルトでサポートされているプロパティタイプのリストについては、すべてのQMLタイプを参照してください。

特殊なプロパティ型

オブジェクトリストのプロパティ属性

list タイプのプロパティには、QML オブジェクトタイプの値のリストを割り当てる ことができます。オブジェクトリストの値を定義するための構文は、角括弧で囲まれたカンマ区切りのリストです:

[ <item 1>, <item 2>, ... ]

例えば、Item タイプにはstates プロパティがあり、これはState タイプのオブジェクトのリストを保持するために使用されます。以下のコードは、このプロパティの値を3つのState オブジェクトのリストに初期化します:

import QtQuick

Item {
    states: [
        State { name: "loading" },
        State { name: "running" },
        State { name: "stopped" }
    ]
}

リストに1つの項目しかない場合は、角括弧を省略できます:

import QtQuick

Item {
    states: State { name: "running" }
}

オブジェクト宣言のプロパティに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.textbuttonText に影響を与えますが、その逆はありません。

プ ロパテ ィ のエ イ リ ア ス と 型

プ ロパテ ィ エイリアス は明示的な型指定を持つ こ と はで き ません。プ ロ パテ ィ エ イ リ ア スの型は、 それが参照す る プ ロ パテ ィ ま たはオブジ ェ ク ト のdeclared 型です。したがって、id を使ってオブジェクトのエイリアスを作成しても、そのエイリアスを介して余分なプロパティにアクセスすることはできません:

// MyItem.qml
Item {
    property alias inner: innerItem

    Item {
        id: innerItem
        property int extraProperty
    }
}

innerItem でしかないため、このコンポーネントの外部から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
    }
}
// ExtraItem.qml
Item {
    property int extraProperty
}

読み取り専用プロパティ

オブジェクト宣言では、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 型は、数値型のプロパティ(intreal など)のみをアニメーション化します。数値型でないプロパティでNumberAnimation を使おうとしてもエラーにはなりません。特定のプロパティ・タイプに関連付けられたときのプロパティ修飾型の動作は、その実装によって定義されます。

シグナル属性

たとえば、プロパティが変更された、アニメーションが開始または停止した、画像がダウンロードされたなどです。例えば、MouseArea 型には、clicked シグナルがあり、ユーザーがマウス領域内をクリックしたときに発信されます。

特定のシグナルが発せられると、シグナル・ハンドラを通してオブジェクトに通知することができる。シグナル・ハンドラはon<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のオブジェクト定義にシグナルを追加すると、自動的に関連するシグナルハンドラが追加されます。プログラムロジックを実装するために、クライアントは実装を提供することができます。

activateddeactivated のシグナルを持つ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 シグナルを文書化していませんが、TextInputtext プロパティを持っているので、このシグナルは暗黙のうちに利用可能です。これは、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 コードのブロックを定義することができます。メソッドを QML の型に追加することで、スタンドアロンで再利用可能な JavaScript のコードブロックを定義することができます。また、メソッドのパラメータの型も宣言しなければなりません。

同じ型ブロックの中で同じ名前のメソッドやシグナルを2つ宣言しようとするとエラーになります。しかし、新しいメソッドは、その型に対する既存のメソッドの名前を再利用することができる。しかし、既存のメソッドが隠され、アクセスできなくなる可能性があるため、これは慎重に行うべきである。

以下は、height の値を代入するときに呼び出されるcalculateHeight() メソッドを持つRectangle です:

import QtQuick

Rectangle {
    id: rect

    function calculateHeight(): real {
        return rect.width / 2;
    }

    width: 100
    height: calculateHeight()
}

メソッドにパラメータがある場合は、メソッド内でパラメータ名にアクセスできます。以下では、MouseArea がクリックされると、moveTo() メソッドが呼び出され、受け取ったnewXnewY パラメータを参照してテキストの位置を変更することができます:

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 の各デリゲート・オブジェクトが利用できるアタッチ・プロパティPathView.isCurrentItem を持っています。各デリゲートのインスタンスは、このプロパティを使用して、ビューで現在選択されている項目であるかどうかを判断します:

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 添付プロパティを参照するようになります。

列挙属性

列挙属性は固定された選択肢を提供します。列挙型は、enum キーワードを使用して QML で宣言することができます:

// 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のライセンスによっては利用可能です。