diff --git a/src/widgets/widgets/qtoolbutton.cpp b/src/widgets/widgets/qtoolbutton.cpp index e6f7edc1ac12..01150cd39b23 100644 --- a/src/widgets/widgets/qtoolbutton.cpp +++ b/src/widgets/widgets/qtoolbutton.cpp @@ -58,7 +58,8 @@ class QToolButtonPrivate : public QAbstractButtonPrivate Qt::ArrowType arrowType; Qt::ToolButtonStyle toolButtonStyle; QToolButton::ToolButtonPopupMode popupMode; - enum { NoButtonPressed=0, MenuButtonPressed=1, ToolButtonPressed=2 }; + uint popupModeSetByUser : 1; // true if popupMode was set through setPopupMode + enum { NoButtonPressed = 0, MenuButtonPressed = 1, ToolButtonPressed = 2 }; uint buttonPressed : 2; uint menuButtonDown : 1; uint autoRaise : 1; @@ -178,6 +179,7 @@ void QToolButtonPrivate::init() arrowType = Qt::NoArrow; menuButtonDown = false; popupMode = QToolButton::DelayedPopup; + popupModeSetByUser = false; buttonPressed = QToolButtonPrivate::NoButtonPressed; toolButtonStyle = Qt::ToolButtonIconOnly; @@ -827,7 +829,7 @@ void QToolButtonPrivate::onMenuTriggered(QAction *action) void QToolButtonPrivate::onDefaultActionChanged() { Q_Q(QToolButton); - if (defaultAction && defaultAction->menu()) + if (defaultAction && defaultAction->menu() && !popupModeSetByUser) q->setPopupMode(QToolButton::MenuButtonPopup); } @@ -864,6 +866,7 @@ void QToolButtonPrivate::onDefaultActionChanged() void QToolButton::setPopupMode(ToolButtonPopupMode mode) { Q_D(QToolButton); + d->popupModeSetByUser = true; d->popupMode = mode; } @@ -922,10 +925,11 @@ void QToolButton::setDefaultAction(QAction *action) { Q_D(QToolButton); #if QT_CONFIG(menu) - if (d->defaultAction) { + if (d->defaultAction && d->defaultAction != action) { QObjectPrivate::disconnect(d->defaultAction, &QAction::changed, d, &QToolButtonPrivate::onDefaultActionChanged); } + const bool hadMenu = d->hasMenu(); #endif d->defaultAction = action; if (!action) @@ -949,15 +953,18 @@ void QToolButton::setDefaultAction(QAction *action) setWhatsThis(action->whatsThis()); #endif #if QT_CONFIG(menu) - if (action->menu()) { + if (!hadMenu && !d->popupModeSetByUser) { // ### Qt7 Fixme // new 'default' popup mode defined introduced by tool bar. We // should have changed QToolButton's default instead. Do that // in 4.2. - setPopupMode(QToolButton::MenuButtonPopup); + if (action->menu()) { + setPopupMode(QToolButton::MenuButtonPopup); + } else { + QObjectPrivate::connect(d->defaultAction, &QAction::changed, d, + &QToolButtonPrivate::onDefaultActionChanged); + } } - QObjectPrivate::connect(d->defaultAction, &QAction::changed, d, - &QToolButtonPrivate::onDefaultActionChanged); #endif setCheckable(action->isCheckable()); setChecked(action->isChecked()); diff --git a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp index c6bebe55f23e..8f5fd72610a0 100644 --- a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp +++ b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp @@ -5096,9 +5096,6 @@ void tst_QLineEdit::testQuickSelectionWithMouse() QVERIFY(lineEdit.selectedText().endsWith(suffix)); QTest::mouseMove(lineEdit.windowHandle(), center + QPoint(20, 0)); qCDebug(lcTests) << "Selected text:" << lineEdit.selectedText(); -#if defined(Q_PROCESSOR_ARM_32) && !defined(Q_OS_VXWORKS) - QEXPECT_FAIL("", "Currently fails on gcc-armv7, needs investigation.", Continue); -#endif QCOMPARE(lineEdit.selectedText(), partialSelection); mouseReleaseIfNeeded(center + QPoint(20, 0)); diff --git a/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp b/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp index 9588f1933875..8721a0a16574 100644 --- a/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp +++ b/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp @@ -36,6 +36,7 @@ private slots: void defaultActionSynced(); void deleteInHandler(); void emptyMenu(); + void popupMode(); protected slots: void sendMouseClick(); @@ -361,5 +362,78 @@ void tst_QToolButton::emptyMenu() QTRY_COMPARE(triggeredSpy.size(), 1); } +void tst_QToolButton::popupMode() +{ + { + // action without menu -> no change in popup mode + QToolButton tb; + QCOMPARE(tb.popupMode(), QToolButton::DelayedPopup); // ### Qt7 change to MenuButtonPopup + auto a = new QAction("Action 1"); + tb.setDefaultAction(a); + QCOMPARE(tb.popupMode(), QToolButton::DelayedPopup); + } + { + // action with menu, no user-set popup mode -> MenuButtonPopup + QToolButton tb; + auto a = new QAction("Action 1"); + auto menu = new QMenu; + menu->addAction("Menuaction"); + a->setMenu(menu); // before setDefaultAction + tb.setDefaultAction(a); + QCOMPARE(tb.popupMode(), QToolButton::MenuButtonPopup); + tb.setPopupMode(QToolButton::InstantPopup); + QCOMPARE(tb.popupMode(), QToolButton::InstantPopup); + } + { + // action with menu, no user-set popup mode -> MenuButtonPopup + QToolButton tb; + auto a = new QAction("Action 1"); + auto menu = new QMenu; + menu->addAction("Menuaction"); + tb.setDefaultAction(a); + a->setMenu(menu); // after setDefaultAction + QCOMPARE(tb.popupMode(), QToolButton::MenuButtonPopup); + tb.setPopupMode(QToolButton::InstantPopup); + QCOMPARE(tb.popupMode(), QToolButton::InstantPopup); + } + { + // action without (initial) menu, user-set popup mode is not changed + QToolButton tb; + auto a = new QAction("Action 1"); + auto menu = new QMenu; + menu->addAction("Menuaction"); + tb.setDefaultAction(a); + tb.setPopupMode(QToolButton::InstantPopup); + QCOMPARE(tb.popupMode(), QToolButton::InstantPopup); + a->setMenu(menu); + QCOMPARE(tb.popupMode(), QToolButton::InstantPopup); + } + { + // action with menu but after user-set popup mode -> popup mode is not changed + QToolButton tb; + auto a = new QAction("Action 1"); + auto menu = new QMenu; + menu->addAction("Menuaction"); + tb.setPopupMode(QToolButton::InstantPopup); + QCOMPARE(tb.popupMode(), QToolButton::InstantPopup); + a->setMenu(menu); // before setDefaultAction + tb.setDefaultAction(a); + QCOMPARE(tb.popupMode(), QToolButton::InstantPopup); + } + { + // action with menu but after user-set popup mode -> popup mode is not changed + QToolButton tb; + auto a = new QAction("Action 1"); + auto menu = new QMenu; + menu->addAction("Menuaction"); + tb.setPopupMode(QToolButton::InstantPopup); + QCOMPARE(tb.popupMode(), QToolButton::InstantPopup); + tb.setDefaultAction(a); + a->setMenu(menu); // after setDefaultAction + QCOMPARE(tb.popupMode(), QToolButton::InstantPopup); + } +} + + QTEST_MAIN(tst_QToolButton) #include "tst_qtoolbutton.moc"