summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/widgets/widgets/qtoolbutton.cpp6
-rw-r--r--tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp59
2 files changed, 65 insertions, 0 deletions
diff --git a/src/widgets/widgets/qtoolbutton.cpp b/src/widgets/widgets/qtoolbutton.cpp
index 1b04f3df72..81b2998849 100644
--- a/src/widgets/widgets/qtoolbutton.cpp
+++ b/src/widgets/widgets/qtoolbutton.cpp
@@ -963,6 +963,12 @@ void QToolButton::setDefaultAction(QAction *action)
}
#endif
setCheckable(action->isCheckable());
+ if (action->isCheckable()) {
+ connect(this, &QAbstractButton::toggled, this, [this](bool checked) {
+ if (defaultAction())
+ defaultAction()->setChecked(checked);
+ }, Qt::UniqueConnection);
+ }
setChecked(action->isChecked());
setEnabled(action->isEnabled());
if (action->d_func()->fontSet)
diff --git a/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp b/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp
index d6142dfcdc..12a9ec3de0 100644
--- a/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp
+++ b/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp
@@ -56,6 +56,7 @@ private slots:
void task176137_autoRepeatOfAction();
void qtbug_26956_popupTimerDone();
void qtbug_34759_sizeHintResetWhenSettingMenu();
+ void defaultActionSynced();
protected slots:
void sendMouseClick();
@@ -280,5 +281,63 @@ void tst_QToolButton::qtbug_34759_sizeHintResetWhenSettingMenu()
QTRY_COMPARE(button1.sizeHint(), button2.sizeHint());
}
+void tst_QToolButton::defaultActionSynced()
+{
+ QAction a;
+ a.setCheckable(true);
+
+ QToolButton tb;
+ tb.setDefaultAction(&a);
+ QVERIFY(tb.isCheckable());
+
+ QSignalSpy tbSpy(&tb, SIGNAL(toggled(bool)));
+ QSignalSpy aSpy(&a, SIGNAL(toggled(bool)));
+
+ int tbToggledCount = 0;
+ int aToggledCount = 0;
+
+ tb.setChecked(true);
+ QVERIFY(a.isChecked());
+ QCOMPARE(tbSpy.count(), ++tbToggledCount);
+ QCOMPARE(aSpy.count(), ++aToggledCount);
+ tb.setChecked(false);
+ QVERIFY(!a.isChecked());
+ QCOMPARE(tbSpy.count(), ++tbToggledCount);
+ QCOMPARE(aSpy.count(), ++aToggledCount);
+
+ a.setChecked(true);
+ QVERIFY(tb.isChecked());
+ QCOMPARE(tbSpy.count(), ++tbToggledCount);
+ QCOMPARE(aSpy.count(), ++aToggledCount);
+ a.setChecked(false);
+ QVERIFY(!tb.isChecked());
+ QCOMPARE(tbSpy.count(), ++tbToggledCount);
+ QCOMPARE(aSpy.count(), ++aToggledCount);
+
+ QAction b;
+ QSignalSpy bSpy(&b, SIGNAL(toggled(bool)));
+ int bToggledCount = 0;
+ tb.setDefaultAction(&b);
+ QVERIFY(!tb.isCheckable());
+ b.setCheckable(true);
+ QVERIFY(tb.isCheckable());
+
+ tb.setChecked(true);
+ QVERIFY(!a.isChecked());
+ QVERIFY(b.isChecked());
+
+ QCOMPARE(tbSpy.count(), ++tbToggledCount);
+ QCOMPARE(aSpy.count(), aToggledCount);
+ QCOMPARE(bSpy.count(), ++bToggledCount);
+
+ tb.click();
+ QVERIFY(!a.isChecked());
+ QVERIFY(!tb.isChecked());
+ QVERIFY(!b.isChecked());
+ QCOMPARE(tbSpy.count(), ++tbToggledCount);
+ QCOMPARE(aSpy.count(), aToggledCount);
+ QCOMPARE(bSpy.count(), ++bToggledCount);
+}
+
QTEST_MAIN(tst_QToolButton)
#include "tst_qtoolbutton.moc"