diff --git a/src/widgets/widgets/qtoolbutton.cpp b/src/widgets/widgets/qtoolbutton.cpp index e0775afd265..8957e93f051 100644 --- a/src/widgets/widgets/qtoolbutton.cpp +++ b/src/widgets/widgets/qtoolbutton.cpp @@ -788,6 +788,11 @@ void QToolButtonPrivate::popupTimerDone() QObjectPrivate::disconnect(actualMenu, &QMenu::aboutToHide, this, &QToolButtonPrivate::updateButtonDown); + if (menuButtonDown) { + // The menu was empty, it didn't actually show up, so it was never hidden either + updateButtonDown(); + } + if (mustDeleteActualMenu) { delete actualMenu; } else { diff --git a/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp b/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp index 81a8fb0efca..9588f193387 100644 --- a/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp +++ b/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp @@ -35,6 +35,7 @@ private slots: void qtbug_34759_sizeHintResetWhenSettingMenu(); void defaultActionSynced(); void deleteInHandler(); + void emptyMenu(); protected slots: void sendMouseClick(); @@ -338,5 +339,27 @@ void tst_QToolButton::deleteInHandler() QVERIFY(!tb); } +void tst_QToolButton::emptyMenu() +{ + + QToolButton tb; + auto menu = new QMenu(&tb); + tb.setMenu(menu); + tb.showMenu(); // calls exec(), but since the fix for QTBUG-129108, we don't show an empty menu + + // see triggered() test + QTest::mouseMove(tb.windowHandle(), tb.mapFromGlobal(QPoint(0, 0))); + + // But if we now put something in the menu, it should show up + auto act = menu->addAction("an action"); + QSignalSpy triggeredSpy(act, &QAction::triggered); + // In 200ms, click on the action so that exec() returns + QTimer::singleShot(200, menu, [&]() { + QTest::mouseClick(menu, Qt::LeftButton, {}, menu->rect().center()); + }); + tb.showMenu(); // calls exec(), which only returns in 200ms + QTRY_COMPARE(triggeredSpy.size(), 1); +} + QTEST_MAIN(tst_QToolButton) #include "tst_qtoolbutton.moc"