summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/widgets/widgets/qtoolbutton.cpp5
-rw-r--r--tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp23
2 files changed, 28 insertions, 0 deletions
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"