Synchronizer QML Type

2つ以上のプロパティ間で値を同期させます。詳細...

Import Statement: import Qt.labs.synchronizer
Since: Qt 6.10

プロパティ

信号

詳細説明

Synchronizer オブジェクトは、2 つ以上のプロパティをバインドして、どれか 1 つを変更すると他のすべてのプロパティが自動的に更新されるようにします。その際、どのプロパティのバインディングも壊れることはありません。Synchronizerは、2つのプロパティ間のデータの流れの方向があらかじめ決まっていない場合に使用できます。例えば、TextInput はモデルの値で初期化されますが、編集が終了したときにモデルの値も更新する必要があります。

注: Qt Quick およびQt Quick コントロールが提供する入力要素は、値の変更シグナルとは別にユーザーインタラクションシグナルを提供し、値の割り当てを C++ コードで隠すことによって、この問題を解決しています。これらの内部ではSynchronizerは必要ありません。しかし、コントロールとモデルを接続する際には、Synchronizerが役立つ場合があります。

次の例を見てください。

Synchronizerなし

// MyCustomTextInput.qml
Item {
    property string text
    function append(characters: string) { text += characters }
    [...]
}

モデルからtext プロパティを入力し、textChanged シグナルを受信したときにモデルを更新したくなるかもしれません。

// Does not work!
Item {
    id: root
    property string model: "lorem ipsum"
    MyCustomTextInput {
        text: root.model
        onTextChanged: root.model = text
    }
}

これはうまくいきませんappend 関数が呼び出されると、text プロパティが変更され、model プロパティから更新するバインディングが壊れてしまいます。次にmodel が単独で更新されると、text は更新されなくなります。

これを解決するには、バインディングを完全に省略し、両方のプロパティの更新にシグナルのみを使用します。この方法では、バインディングの利便性を放棄する必要があります。

あるいは、Synchronizerを使うこともできます。

シンクロナイザー

Item {
    id: root
    property string model: "lorem ipsum"
    MyCustomTextInput {
        Synchronizer on text {
            property alias source: root.model
        }
    }
}

Synchronizerは、モデルとテキストのどちらかが変更されると、もう一方も更新されるようにします。

同期するプロパティはいくつかの方法で指定できます:

  • on 構文を使用する
  • sourceObjectsourceProperty プロパティに入力する
  • targetObjecttargetProperty プロパティに入力する
  • synchronizer のスコープ内でエイリアスを作成する。

以下の例は、4つの異なるプロパティを同期し、すべての異なるオプションを行使します:

Item {
    id: root
    property string model: "lorem ipsum"

    MyCustomTextInput {
        Synchronizer on text {
            sourceObject: other
            sourceProperty: "text"

            targetObject: root.children[0]
            targetProperty: "objectName"

            property alias source: root.model
            property alias another: root.objectName
        }
    }

    MyCustomTextInput {
        id: other
    }
}

オプションとして、Synchronizerは初期同期を実行します:

  • エイリアスの1つがsource と呼ばれる場合、それは他のプロパティを初期化するために使用されます。
  • そうでない場合、sourceObjectsourceProperty に割り当てられた値がプロパティを示す場合、そのプロパティが初期同期のソースとして使用されます。
  • それ以外の場合、on 構文が使用されると、その方法でシンクロナイザーが作成されたプロパティが初期同期のソースとして使用されます。
  • そうでない場合は、初期同期は行われない。プロパティの1つが変更されたときにのみ、他のプロパティが更新されます。

シンクロナイザーは自動的にデバウンスします。ソースとして指定された値を使用して同期を行っている間は、更新のターゲットになると予想されるプロパティの1つからのさらなる更新を受け付けません。このような動作は、無限の更新ループにつながりやすい。SynchronizerはvalueBounced シグナルを使用して、この状態を通知します。さらに、更新を無言で拒否するプロパティを検出し、それらに対してvalueIgnored シグナルを発する。ここでいう沈黙とは、指定されたプロパティのセッターを呼び出した後に変更シグナルがないことで判断されます。

同期されるプロパティの型が異なる場合は、通常のQMLの型強制が適用されます。

プロパティのドキュメント

sourceObject : QtObject

このプロパティは、sourceObject/sourceProperty のペアの sourceObject 部分を保持し、Synchronizer が同期するプロパティの 1 つを指定します。


sourceProperty : string

この sourceProperty は、sourceObject/sourceProperty のペアの sourceProperty 部分を保持し、一緒に Synchronizer が同期するプロパティの 1 つを指定できます。


targetObject : QtObject

このプロパティは、TargetObject/targetProperty のペアの targetObject 部分を保持し、一緒に Synchronizer が同期化するプロパティの 1 つを指定できます。


targetProperty : string

このtargetPropertyは、targetObject/targetPropertyペアのtargetProperty部分を保持し、一緒にSynchronizerが同期するプロパティの1つを指定することができます。


シグナル ドキュメント

valueBounced(QtObject object, string property)

このシグナルは、objectproperty が、同期の一環としてその値を設定しようとする試みを拒否し、その応答として異なる値を生成した場合に発行されます。このようなバウンスされた値は無視され、同期の再ラウンドはトリガされません

注: 対応するハンドラはonValueBounced である。


valueIgnored(QtObject object, string property)

このシグナルは、objectproperty が、同期の一部としてその値を設定しようとしたときに応答しなかった場合に発行される。

注: 対応するハンドラはonValueIgnored です。


© 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.