summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Bache-Wiig <jens.bache-wiig@digia.com>2014-03-20 14:47:32 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-20 15:11:58 +0100
commit3adb18503a865e0bb826cb1b5be059572bb96594 (patch)
tree7a97e5f0d65392148d3350a8272660c25d4c1a5a
parent89f9aa0038b76a5e06cf2621bd588ce89f2c7189 (diff)
downloadqtquickcontrols-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.qml14
-rw-r--r--tests/auto/controls/data/tst_checkbox.qml39
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"