diff options
-rw-r--r-- | src/widgets/widgets/qtoolbutton.cpp | 6 | ||||
-rw-r--r-- | tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp | 59 |
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" |