Synchronizer QML Type
2つ以上のプロパティ間で値を同期させます。詳細...
Import Statement: | import Qt.labs.synchronizer |
Since: | Qt 6.10 |
プロパティ
- sourceObject : QtObject
- sourceProperty : string
- targetObject : QtObject
- targetProperty : string
信号
- valueBounced(QtObject object, string property)
- valueIgnored(QtObject object, string property)
詳細説明
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
構文を使用するsourceObject
とsourceProperty
プロパティに入力するtargetObject
とtargetProperty
プロパティに入力する- 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
と呼ばれる場合、それは他のプロパティを初期化するために使用されます。 - そうでない場合、sourceObject とsourceProperty に割り当てられた値がプロパティを示す場合、そのプロパティが初期同期のソースとして使用されます。
- それ以外の場合、
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つを指定することができます。
シグナル ドキュメント
このシグナルは、object のproperty が、同期の一環としてその値を設定しようとする試みを拒否し、その応答として異なる値を生成した場合に発行されます。このようなバウンスされた値は無視され、同期の再ラウンドはトリガされません。
注: 対応するハンドラはonValueBounced
である。
このシグナルは、object のproperty が、同期の一部としてその値を設定しようとしたときに応答しなかった場合に発行される。
注: 対応するハンドラは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.