From 3b3b6f1adf8a4f8c3d5763dd05e67c0169d7dd3b Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Sun, 5 Nov 2023 18:34:55 +0100 Subject: [PATCH] QCheckBox: Don't emit checkStateChanged when nothing changed QCheckBox::checkStateChanged() was emitted with msvc even though the check state was not changed due to a faulty comparison. Amends: 37b47ebf946ef1a37573107375fbe5fc0eb1e6d2 Fixes: QTBUG-118716 Task-number: QTBUG-104688 Change-Id: Iafeabeb9214f6c7510ea4ed87fabb7dc0ba175a6 Reviewed-by: Friedemann Kleint (cherry picked from commit 90822833f373d9aa9e2ee9b60f93b869e718cfe0) Reviewed-by: Christian Ehrlicher --- src/widgets/widgets/qcheckbox.cpp | 2 +- .../widgets/qcheckbox/tst_qcheckbox.cpp | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/widgets/widgets/qcheckbox.cpp b/src/widgets/widgets/qcheckbox.cpp index 5b44271d48a..98420352d79 100644 --- a/src/widgets/widgets/qcheckbox.cpp +++ b/src/widgets/widgets/qcheckbox.cpp @@ -28,7 +28,7 @@ public: uint tristate : 1; uint noChange : 1; uint hovering : 1; - Qt::CheckState publishedState : 2; + Qt::CheckState publishedState : 3; void init(); }; diff --git a/tests/auto/widgets/widgets/qcheckbox/tst_qcheckbox.cpp b/tests/auto/widgets/widgets/qcheckbox/tst_qcheckbox.cpp index 9055b139019..59d15c4f542 100644 --- a/tests/auto/widgets/widgets/qcheckbox/tst_qcheckbox.cpp +++ b/tests/auto/widgets/widgets/qcheckbox/tst_qcheckbox.cpp @@ -16,6 +16,7 @@ private slots: void initTestCase(); void setChecked(); + void setCheckedSignal(); void setTriState(); void setText_data(); void setText(); @@ -59,6 +60,25 @@ void tst_QCheckBox::setChecked() QVERIFY(!testWidget.isChecked()); } +void tst_QCheckBox::setCheckedSignal() +{ + QCheckBox testWidget; + testWidget.setCheckState(Qt::Unchecked); + QSignalSpy checkStateChangedSpy(&testWidget, &QCheckBox::stateChanged); + testWidget.setCheckState(Qt::Checked); + testWidget.setCheckState(Qt::Checked); + QTRY_COMPARE(checkStateChangedSpy.size(), 1); // get signal only once + QCOMPARE(testWidget.checkState(), Qt::Checked); + testWidget.setCheckState(Qt::Unchecked); + testWidget.setCheckState(Qt::Unchecked); + QTRY_COMPARE(checkStateChangedSpy.size(), 2); // get signal only once + QCOMPARE(testWidget.checkState(), Qt::Unchecked); + testWidget.setCheckState(Qt::PartiallyChecked); + testWidget.setCheckState(Qt::PartiallyChecked); + QTRY_COMPARE(checkStateChangedSpy.size(), 3); // get signal only once + QCOMPARE(testWidget.checkState(), Qt::PartiallyChecked); +} + void tst_QCheckBox::setTriState() { QCheckBox testWidget;