diff options
author | Jens Bache-Wiig <jens.bache-wiig@digia.com> | 2014-03-20 14:47:32 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-03-20 15:11:58 +0100 |
commit | 3adb18503a865e0bb826cb1b5be059572bb96594 (patch) | |
tree | 7a97e5f0d65392148d3350a8272660c25d4c1a5a | |
parent | 89f9aa0038b76a5e06cf2621bd588ce89f2c7189 (diff) | |
download | qtquickcontrols-3adb18503a865e0bb826cb1b5be059572bb96594.tar.gz |
Try to maintain bindings to checked property in CheckBox
It is currently impossible to keep a binding to the checked property
because any external manipulation of checked will cause it to be
internally overwritten based on the implicitly triggered
checkedStateChanged signal. This adds a protection mechanism similar
to what we already have on the checkedStateChanged signal.
[ChangeLog][QtQuickControls][CheckBox]Fixed a problem incorrectly causing
bindings to the checked state to break.
Task-number: QTBUG-31627
Change-Id: I506fa34561529a414c7b088001f96e8f283edd89
Reviewed-by: Mitch Curtis <mitch.curtis@digia.com>
Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
-rw-r--r-- | src/controls/CheckBox.qml | 14 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_checkbox.qml | 39 |
2 files changed, 51 insertions, 2 deletions
diff --git a/src/controls/CheckBox.qml b/src/controls/CheckBox.qml index 00671755..e96e64fd 100644 --- a/src/controls/CheckBox.qml +++ b/src/controls/CheckBox.qml @@ -132,6 +132,13 @@ AbstractCheckable { */ property bool __ignoreChecked: false + /*! + \internal + True if onCheckedStateChanged should be ignored because we were reacting + to onCheckedChanged. + */ + property bool __ignoreCheckedState: false + style: Qt.createComponent(Settings.style + "/CheckBoxStyle.qml", checkBox) activeFocusOnTab: true @@ -142,8 +149,11 @@ AbstractCheckable { __cycleStatesHandler: __cycleCheckBoxStates onCheckedChanged: { - if (!__ignoreChecked) + if (!__ignoreChecked) { + __ignoreCheckedState = true; checkedState = checked ? Qt.Checked : Qt.Unchecked; + __ignoreCheckedState = false; + } } onCheckedStateChanged: { @@ -151,7 +161,7 @@ AbstractCheckable { if (checkedState === Qt.PartiallyChecked) { partiallyCheckedEnabled = true; checked = false; - } else { + } else if (!__ignoreCheckedState) { checked = checkedState === Qt.Checked; } __ignoreChecked = false; diff --git a/tests/auto/controls/data/tst_checkbox.qml b/tests/auto/controls/data/tst_checkbox.qml index 2e3469d6..278fb0e1 100644 --- a/tests/auto/controls/data/tst_checkbox.qml +++ b/tests/auto/controls/data/tst_checkbox.qml @@ -168,6 +168,45 @@ Item { } } + function test_check_keep_binding() { + var root = Qt.createQmlObject("import QtQuick 2.1; import QtQuick.Controls 1.1; \n" + + "Row { \n" + + " property alias checkBox1: checkBox1 \n" + + " property alias checkBox2: checkBox2 \n" + + " CheckBox { id: checkBox1 } \n" + + " CheckBox { id: checkBox2; checked: checkBox1.checked; enabled: false } \n" + + "}", container, ""); + + compare(root.checkBox1.checked, false); + compare(root.checkBox2.checked, false); + root.checkBox1.checked = true; + compare(root.checkBox1.checked, true); + compare(root.checkBox2.checked, true); + root.checkBox1.checked = false; + compare(root.checkBox1.checked, false); + compare(root.checkBox2.checked, false); + } + + function test_checkState_keep_binding() { + var root = Qt.createQmlObject("import QtQuick 2.1; import QtQuick.Controls 1.1; \n" + + "Row { \n" + + " property alias checkBox1: checkBox1 \n" + + " property alias checkBox2: checkBox2 \n" + + " CheckBox { id: checkBox1 } \n" + + " CheckBox { id: checkBox2; checkedState: checkBox1.checkedState; enabled: false } \n" + + "}", container, ""); + + compare(root.checkBox1.checkedState, Qt.Unchecked); + compare(root.checkBox2.checkedState, Qt.Unchecked); + root.checkBox1.checkedState = Qt.Checked; + compare(root.checkBox1.checkedState, Qt.Checked); + compare(root.checkBox2.checkedState, Qt.Checked); + root.checkBox1.checkedState = Qt.Unchecked; + compare(root.checkBox1.checkedState, Qt.Unchecked); + compare(root.checkBox2.checkedState, Qt.Unchecked); + } + + function test_exclusiveGroup() { var root = Qt.createQmlObject("import QtQuick 2.1; import QtQuick.Controls 1.1; \n" + "Row { \n" |