Qt 5.4/Qml: Verhindern, dass bindende Schleife
Ich habe eine Globale singleton - "Einstellungen" hält, die Anwendung Einstellungen. Wenn ich versuche, führen Sie den folgenden code bekomme ich einen QML CheckBox: Binding loop detected for property "checked"
:
CheckBox {
checked: Settings.someSetting
onCheckedChanged: {
Settings.someSetting = checked;
}
}
Es ist offensichtlich, warum dieser Fehler Auftritt, aber wie kann ich korrekt implementieren Sie diese Funktion ohne bindende Schleife? E. g. Ich möchte zum speichern des aktuellen Aktivierungszustand des Kontrollkästchens in den Einstellungen singleton.
Ich bin mit Qt 5.4 und Qml Schnell 2.
Grüße,
- Wenn Sie nicht wollen, zu machen, eine Schleife binden - nicht verbindlich. Verwenden Sie einen proxy-variable, zum Beispiel.
- Meinst du eine Eigenschaft, die außerhalb der checkbox, die hält den Wert?
- Ja, ich meinte, dass.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht binden. Da die check-box nicht vollkommen abhängig von
Setting.someSetting
.Wenn ein Benutzer auf die checkbox, die
CheckBox.checked
geändert werden, von selbst. Zur gleichen Zeit, die Eigenschaft, die Bindung ist nicht mehr gültig.Settings.someSetting
nicht ändern das Kontrollkästchen, nachdem es angeklickt wird, der durch den Benutzer. Daher diechecked: Settings.someSetting
verbindlich ist falsch.Wenn Sie möchten, weisen Sie einen anfänglichen Wert für das Kontrollkästchen, wenn die Komponente fertig ist, verwenden Sie
Component.onCompleted
zuordnen:Wenn Sie auf ein komplexeres Szenario, das
Setting.someSetting
kann geändert werden, indem Sie einige andere Dinge, die Laufzeit und den Status der Kontrollkästchen erforderlich ist, um gleichzeitig geändert werden. FangenonSomeSettingChanged
signal und explizit geändert werden, das Kontrollkästchen. Senden Sie den Wert vonsomeSettingCheckBox
zuSettings
nur, wenn das Programm/widget/dialog/xxx abgeschlossen.Wenn Sie nicht wollen, zu machen, eine Schleife binden - nicht verbindlich, verwenden Sie einen proxy-variable, zum Beispiel. Andere einfache Lösung kann es sein, überprüfen Sie den Wert:
Können Sie auch zwei-Wege-Bindung um dieses Problem zu beheben:
Manchmal ist es nützlich, getrennte input-und output-Werte in der Kontrolle. In dieser Fall-Kontroll-zeigt immer einen realen Wert, und es kann auch zeigen, eine Verzögerung für den Benutzer.