diff options
Diffstat (limited to 'tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp')
-rw-r--r-- | tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp | 453 |
1 files changed, 263 insertions, 190 deletions
diff --git a/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp b/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp index f8464e2383..73360ae21d 100644 --- a/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp +++ b/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QTest> @@ -40,6 +15,12 @@ #include <QGridLayout> #include <QStyleFactory> #include <QTabWidget> +#include <QStyleOption> + +#include <private/qguiapplication_p.h> +#include <qpa/qplatformtheme.h> + +#include <QtWidgets/private/qapplication_p.h> class tst_QPushButton : public QObject { @@ -60,7 +41,6 @@ private slots: void setDown(); void popupCrash(); void isChecked(); - void animateClick(); void toggle(); void clicked(); void touchTap(); @@ -73,20 +53,22 @@ private slots: #endif void emitReleasedAfterChange(); void hitButton(); + void iconOnlyStyleSheet(); + void mousePressAndMove(); + void reactToMenuClosed(); protected slots: void resetCounters(); void onClicked(); - void onToggled( bool on ); + void onToggled(bool on); void onPressed(); void onReleased(); - void helperSlotDelete(); private: - uint click_count; - uint toggle_count; - uint press_count; - uint release_count; + int click_count; + int toggle_count; + int press_count; + int release_count; QPushButton *testWidget; QPointingDevice *m_touchScreen = QTest::createTouchDevice(); @@ -101,40 +83,40 @@ void tst_QPushButton::getSetCheck() QMenu *var1 = new QMenu; obj1.setMenu(var1); QCOMPARE(var1, obj1.menu()); - obj1.setMenu((QMenu *)0); - QCOMPARE((QMenu *)0, obj1.menu()); + obj1.setMenu(nullptr); + QCOMPARE(obj1.menu(), nullptr); delete var1; } void tst_QPushButton::initTestCase() { // Create the test class - testWidget = new QPushButton( "&Start", 0 ); + testWidget = new QPushButton("&Start", 0); testWidget->setObjectName("testWidget"); - testWidget->resize( 200, 200 ); + testWidget->resize(200, 200); testWidget->show(); - connect( testWidget, SIGNAL(clicked()), this, SLOT(onClicked()) ); - connect( testWidget, SIGNAL(pressed()), this, SLOT(onPressed()) ); - connect( testWidget, SIGNAL(released()), this, SLOT(onReleased()) ); - connect( testWidget, SIGNAL(toggled(bool)), this, SLOT(onToggled(bool)) ); + connect(testWidget, SIGNAL(clicked()), this, SLOT(onClicked())); + connect(testWidget, SIGNAL(pressed()), this, SLOT(onPressed())); + connect(testWidget, SIGNAL(released()), this, SLOT(onReleased())); + connect(testWidget, SIGNAL(toggled(bool)), this, SLOT(onToggled(bool))); } void tst_QPushButton::cleanupTestCase() { delete testWidget; - testWidget = 0; + testWidget = nullptr; } void tst_QPushButton::init() { - testWidget->setAutoRepeat( false ); - testWidget->setDown( false ); + testWidget->setAutoRepeat(false); + testWidget->setDown(false); testWidget->setText("Test"); - testWidget->setEnabled( true ); + testWidget->setEnabled(true); #if QT_CONFIG(shortcut) QKeySequence seq; - testWidget->setShortcut( seq ); + testWidget->setShortcut(seq); #endif resetCounters(); @@ -153,7 +135,7 @@ void tst_QPushButton::onClicked() click_count++; } -void tst_QPushButton::onToggled( bool /*on*/ ) +void tst_QPushButton::onToggled(bool /*on*/) { toggle_count++; } @@ -171,46 +153,46 @@ void tst_QPushButton::onReleased() void tst_QPushButton::autoRepeat() { // If this changes, this test must be completely revised. - QVERIFY( !testWidget->isCheckable() ); + QVERIFY(!testWidget->isCheckable()); // verify autorepeat is off by default. - QPushButton tmp( 0 ); + QPushButton tmp; tmp.setObjectName("tmp"); - QVERIFY( !tmp.autoRepeat() ); + QVERIFY(!tmp.autoRepeat()); // check if we can toggle the mode - testWidget->setAutoRepeat( true ); - QVERIFY( testWidget->autoRepeat() ); + testWidget->setAutoRepeat(true); + QVERIFY(testWidget->autoRepeat()); - testWidget->setAutoRepeat( false ); - QVERIFY( !testWidget->autoRepeat() ); + testWidget->setAutoRepeat(false); + QVERIFY(!testWidget->autoRepeat()); resetCounters(); // check that the button is down if we press space and not in autorepeat - testWidget->setDown( false ); - testWidget->setAutoRepeat( false ); - QTest::keyPress( testWidget, Qt::Key_Space ); + testWidget->setDown(false); + testWidget->setAutoRepeat(false); + QTest::keyPress(testWidget, Qt::Key_Space); - QTRY_VERIFY( testWidget->isDown() ); - QVERIFY( toggle_count == 0 ); - QVERIFY( press_count == 1 ); - QVERIFY( release_count == 0 ); - QVERIFY( click_count == 0 ); + QTRY_VERIFY(testWidget->isDown()); + QCOMPARE(toggle_count, 0); + QCOMPARE(press_count, 1); + QCOMPARE(release_count, 0); + QCOMPARE(click_count, 0); - QTest::keyRelease( testWidget, Qt::Key_Space ); + QTest::keyRelease(testWidget, Qt::Key_Space); resetCounters(); // check that the button is down if we press space while in autorepeat // we can't actually confirm how many times it is fired, more than 1 is enough. - testWidget->setDown( false ); - testWidget->setAutoRepeat( true ); - QTest::keyPress( testWidget, Qt::Key_Space ); + testWidget->setDown(false); + testWidget->setAutoRepeat(true); + QTest::keyPress(testWidget, Qt::Key_Space); QTRY_VERIFY(press_count > 3); - QVERIFY( testWidget->isDown() ); - QVERIFY( toggle_count == 0 ); - QTest::keyRelease( testWidget, Qt::Key_Space ); + QVERIFY(testWidget->isDown()); + QCOMPARE(toggle_count, 0); + QTest::keyRelease(testWidget, Qt::Key_Space); QCOMPARE(press_count, release_count); QCOMPARE(release_count, click_count); @@ -218,113 +200,128 @@ void tst_QPushButton::autoRepeat() // check that pressing ENTER has no effect resetCounters(); - testWidget->setDown( false ); - testWidget->setAutoRepeat( false ); - QTest::keyPress( testWidget, Qt::Key_Enter ); + testWidget->setDown(false); + // Skip after reset if ButtonPressKeys has Key_Enter + const auto buttonPressKeys = QGuiApplicationPrivate::platformTheme() + ->themeHint(QPlatformTheme::ButtonPressKeys) + .value<QList<Qt::Key>>(); + if (buttonPressKeys.contains(Qt::Key_Enter)) { + return; + } + testWidget->setAutoRepeat(false); + QTest::keyPress(testWidget, Qt::Key_Enter); - QTest::qWait( 300 ); + QTest::qWait(300); - QVERIFY( !testWidget->isDown() ); - QVERIFY( toggle_count == 0 ); - QVERIFY( press_count == 0 ); - QVERIFY( release_count == 0 ); - QVERIFY( click_count == 0 ); - QTest::keyRelease( testWidget, Qt::Key_Enter ); + QVERIFY(!testWidget->isDown()); + QCOMPARE(toggle_count, 0); + QCOMPARE(press_count, 0); + QCOMPARE(release_count, 0); + QCOMPARE(click_count, 0); + QTest::keyRelease(testWidget, Qt::Key_Enter); // check that pressing ENTER has no effect resetCounters(); - testWidget->setDown( false ); - testWidget->setAutoRepeat( true ); - QTest::keyClick( testWidget, Qt::Key_Enter ); - QTest::qWait( 300 ); - QVERIFY( !testWidget->isDown() ); - QVERIFY( toggle_count == 0 ); - QVERIFY( press_count == 0 ); - QVERIFY( release_count == 0 ); - QVERIFY( click_count == 0 ); + testWidget->setDown(false); + testWidget->setAutoRepeat(true); + QTest::keyClick(testWidget, Qt::Key_Enter); + QTest::qWait(300); + QVERIFY(!testWidget->isDown()); + QCOMPARE(toggle_count, 0); + QCOMPARE(press_count, 0); + QCOMPARE(release_count, 0); + QCOMPARE(click_count, 0); } void tst_QPushButton::pressed() { - QTest::keyPress( testWidget, ' ' ); - QCOMPARE( press_count, (uint)1 ); - QCOMPARE( release_count, (uint)0 ); - - QTest::keyRelease( testWidget, ' ' ); - QCOMPARE( press_count, (uint)1 ); - QCOMPARE( release_count, (uint)1 ); + QTest::keyPress(testWidget, ' '); + QCOMPARE(press_count, 1); + QCOMPARE(release_count, 0); + + QTest::keyRelease(testWidget, ' '); + QCOMPARE(press_count, 1); + QCOMPARE(release_count, 1); + + // Skip if ButtonPressKeys has Key_Enter + const auto buttonPressKeys = QGuiApplicationPrivate::platformTheme() + ->themeHint(QPlatformTheme::ButtonPressKeys) + .value<QList<Qt::Key>>(); + if (buttonPressKeys.contains(Qt::Key_Enter)) { + return; + } - QTest::keyPress( testWidget,Qt::Key_Enter ); - QCOMPARE( press_count, (uint)1 ); - QCOMPARE( release_count, (uint)1 ); + QTest::keyPress(testWidget,Qt::Key_Enter); + QCOMPARE(press_count, 1); + QCOMPARE(release_count, 1); testWidget->setAutoDefault(true); - QTest::keyPress( testWidget,Qt::Key_Enter ); - QCOMPARE( press_count, (uint)2 ); - QCOMPARE( release_count, (uint)2 ); + QTest::keyPress(testWidget,Qt::Key_Enter); + QCOMPARE(press_count, 2); + QCOMPARE(release_count, 2); testWidget->setAutoDefault(false); } void tst_QPushButton::isCheckable() { - QVERIFY( !testWidget->isCheckable() ); + QVERIFY(!testWidget->isCheckable()); } void tst_QPushButton::setDown() { - testWidget->setDown( false ); - QVERIFY( !testWidget->isDown() ); + testWidget->setDown(false); + QVERIFY(!testWidget->isDown()); - testWidget->setDown( true ); - QVERIFY( testWidget->isDown() ); + testWidget->setDown(true); + QVERIFY(testWidget->isDown()); - testWidget->setDown( true ); - QTest::keyClick( testWidget, Qt::Key_Escape ); - QVERIFY( !testWidget->isDown() ); + testWidget->setDown(true); + QTest::keyClick(testWidget, Qt::Key_Escape); + QVERIFY(!testWidget->isDown()); } void tst_QPushButton::isChecked() { - testWidget->setDown( false ); - QVERIFY( !testWidget->isChecked() ); + testWidget->setDown(false); + QVERIFY(!testWidget->isChecked()); - testWidget->setDown( true ); - QVERIFY( !testWidget->isChecked() ); + testWidget->setDown(true); + QVERIFY(!testWidget->isChecked()); - testWidget->setDown( false ); + testWidget->setDown(false); testWidget->toggle(); - QVERIFY( testWidget->isChecked() == testWidget->isCheckable() ); + QCOMPARE(testWidget->isChecked(), testWidget->isCheckable()); } void tst_QPushButton::toggle() { // the pushbutton shouldn't toggle the button. testWidget->toggle(); - QVERIFY( testWidget->isChecked() == false ); + QCOMPARE(testWidget->isChecked(), false); } void tst_QPushButton::toggled() { // the pushbutton shouldn't send a toggled signal when we call the toggle slot. - QVERIFY( !testWidget->isCheckable() ); + QVERIFY(!testWidget->isCheckable()); testWidget->toggle(); - QVERIFY( toggle_count == 0 ); + QCOMPARE(toggle_count, 0); // do it again, just to be sure resetCounters(); testWidget->toggle(); - QVERIFY( toggle_count == 0 ); + QCOMPARE(toggle_count, 0); // finally check that we can toggle using the mouse resetCounters(); - QTest::mousePress( testWidget, Qt::LeftButton ); - QVERIFY( toggle_count == 0 ); - QVERIFY( click_count == 0 ); + QTest::mousePress(testWidget, Qt::LeftButton); + QCOMPARE(toggle_count, 0); + QCOMPARE(click_count, 0); - QTest::mouseRelease( testWidget, Qt::LeftButton ); - QVERIFY( click_count == 1 ); + QTest::mouseRelease(testWidget, Qt::LeftButton); + QCOMPARE(click_count, 1); } #if QT_CONFIG(shortcut) @@ -336,74 +333,56 @@ void tst_QPushButton::toggled() void tst_QPushButton::setAccel() { - if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)) - QSKIP("Wayland: This fails. Figure out why."); - testWidget->setText("&AccelTest"); - QKeySequence seq( Qt::ALT | Qt::Key_A ); - testWidget->setShortcut( seq ); + QKeySequence seq(Qt::ALT | Qt::Key_A); + testWidget->setShortcut(seq); // The shortcut will not be activated unless the button is in a active // window and has focus - QApplication::setActiveWindow(testWidget); testWidget->setFocus(); QVERIFY(QTest::qWaitForWindowActive(testWidget)); - QTest::keyClick( testWidget, 'A', Qt::AltModifier ); - QTRY_VERIFY( click_count == 1 ); - QVERIFY( press_count == 1 ); - QVERIFY( release_count == 1 ); - QVERIFY( toggle_count == 0 ); + QTest::keyClick(testWidget, 'A', Qt::AltModifier); + QTRY_VERIFY(click_count == 1); + QCOMPARE(press_count, 1); + QCOMPARE(release_count, 1); + QCOMPARE(toggle_count, 0); // wait 200 ms because setAccel uses animateClick. // if we don't wait this may screw up a next test. QTest::qWait(200); - QTRY_VERIFY( !testWidget->isDown() ); + QTRY_VERIFY(!testWidget->isDown()); } #endif // QT_CONFIG(shortcut) -void tst_QPushButton::animateClick() -{ - QVERIFY( !testWidget->isDown() ); - testWidget->animateClick(); - QVERIFY( testWidget->isDown() ); - QTest::qWait( 200 ); - QVERIFY( !testWidget->isDown() ); - - QVERIFY( click_count == 1 ); - QVERIFY( press_count == 1 ); - QVERIFY( release_count == 1 ); - QVERIFY( toggle_count == 0 ); -} - void tst_QPushButton::clicked() { - QTest::mousePress( testWidget, Qt::LeftButton ); - QVERIFY( press_count == 1 ); - QVERIFY( release_count == 0 ); + QTest::mousePress(testWidget, Qt::LeftButton); + QCOMPARE(press_count, 1); + QCOMPARE(release_count, 0); - QTest::mouseRelease( testWidget, Qt::LeftButton ); - QCOMPARE( press_count, (uint)1 ); - QCOMPARE( release_count, (uint)1 ); + QTest::mouseRelease(testWidget, Qt::LeftButton); + QCOMPARE(press_count, 1); + QCOMPARE(release_count, 1); press_count = 0; release_count = 0; testWidget->setDown(false); for (uint i=0; i<10; i++) - QTest::mouseClick( testWidget, Qt::LeftButton ); - QCOMPARE( press_count, (uint)10 ); - QCOMPARE( release_count, (uint)10 ); + QTest::mouseClick(testWidget, Qt::LeftButton); + QCOMPARE(press_count, 10); + QCOMPARE(release_count, 10); } void tst_QPushButton::touchTap() { QTest::touchEvent(testWidget, m_touchScreen).press(0, QPoint(10, 10)); - QVERIFY( press_count == 1 ); - QVERIFY( release_count == 0 ); + QCOMPARE(press_count, 1); + QCOMPARE(release_count, 0); QTest::touchEvent(testWidget, m_touchScreen).release(0, QPoint(10, 10)); - QCOMPARE( press_count, (uint)1 ); - QCOMPARE( release_count, (uint)1 ); - QCOMPARE( click_count, (uint)1 ); + QCOMPARE(press_count, 1); + QCOMPARE(release_count, 1); + QCOMPARE(click_count, 1); press_count = 0; release_count = 0; @@ -413,26 +392,23 @@ void tst_QPushButton::touchTap() QTest::touchEvent(testWidget, m_touchScreen).press(0, QPoint(10, 10)); QTest::touchEvent(testWidget, m_touchScreen).release(0, QPoint(10, 10)); } - QCOMPARE( press_count, (uint)10 ); - QCOMPARE( release_count, (uint)10 ); - QCOMPARE( click_count, (uint)10 ); -} - -QPushButton *pb = 0; -void tst_QPushButton::helperSlotDelete() -{ - delete pb; - pb = 0; + QCOMPARE(press_count, 10); + QCOMPARE(release_count, 10); + QCOMPARE(click_count, 10); } void tst_QPushButton::popupCrash() { - pb = new QPushButton("foo"); + QPushButton *pb = new QPushButton("foo"); QMenu *menu = new QMenu("bar", pb); pb->setMenu(menu); - QTimer::singleShot(1000, this, SLOT(helperSlotDelete())); + QTimer::singleShot(1000, this, [&pb]{ + delete pb; + pb = nullptr; + }); pb->show(); pb->click(); + QTRY_COMPARE(pb, nullptr); } void tst_QPushButton::defaultAndAutoDefault() @@ -522,14 +498,14 @@ void tst_QPushButton::defaultAndAutoDefault() // Reparenting QVERIFY(button2.autoDefault()); - button2.setParent(0); + button2.setParent(nullptr); QVERIFY(!button2.autoDefault()); button2.setAutoDefault(false); button2.setParent(&dialog); QVERIFY(!button2.autoDefault()); button1.setAutoDefault(true); - button1.setParent(0); + button1.setParent(nullptr); QVERIFY(button1.autoDefault()); } } @@ -570,11 +546,13 @@ void tst_QPushButton::sizeHint() button->setParent(widget); button->sizeHint(); - widget->setParent(0); + widget->setParent(nullptr); delete dialog; button->setDefault(false); QCOMPARE(button->sizeHint(), initSizeHint); delete button; + + delete widget; } // Test 2 @@ -604,6 +582,8 @@ void tst_QPushButton::sizeHint() tabWidget->setCurrentWidget(tab1); QTRY_COMPARE(button1_2->size(), button2_2->size()); + + delete dialog; } } @@ -621,7 +601,7 @@ void tst_QPushButton::taskQTBUG_20191_shortcutWithKeypadModifer() dialog.setLayout(layout); dialog.show(); QVERIFY(QTest::qWaitForWindowExposed(&dialog)); - QApplication::setActiveWindow(&dialog); + QApplicationPrivate::setActiveWindow(&dialog); // add shortcut '5' to button1 and test with keyboard and keypad '5' keys QSignalSpy spy1(button1, SIGNAL(clicked())); @@ -630,7 +610,7 @@ void tst_QPushButton::taskQTBUG_20191_shortcutWithKeypadModifer() QTest::qWait(300); QTest::keyClick(&dialog, Qt::Key_5, Qt::KeypadModifier); QTest::qWait(300); - QCOMPARE(spy1.count(), 2); + QCOMPARE(spy1.size(), 2); // add shortcut 'keypad 5' to button2 spy1.clear(); @@ -640,8 +620,8 @@ void tst_QPushButton::taskQTBUG_20191_shortcutWithKeypadModifer() QTest::qWait(300); QTest::keyClick(&dialog, Qt::Key_5, Qt::KeypadModifier); QTest::qWait(300); - QCOMPARE(spy1.count(), 1); - QCOMPARE(spy2.count(), 1); + QCOMPARE(spy1.size(), 1); + QCOMPARE(spy2.size(), 1); // remove shortcut from button1 spy1.clear(); @@ -651,8 +631,8 @@ void tst_QPushButton::taskQTBUG_20191_shortcutWithKeypadModifer() QTest::qWait(300); QTest::keyClick(&dialog, Qt::Key_5, Qt::KeypadModifier); QTest::qWait(300); - QCOMPARE(spy1.count(), 0); - QCOMPARE(spy2.count(), 1); + QCOMPARE(spy1.size(), 0); + QCOMPARE(spy2.size(), 1); } #endif // QT_CONFIG(shortcut) @@ -668,7 +648,7 @@ void tst_QPushButton::emitReleasedAfterChange() dialog.setLayout(layout); dialog.show(); QVERIFY(QTest::qWaitForWindowExposed(&dialog)); - QApplication::setActiveWindow(&dialog); + QApplicationPrivate::setActiveWindow(&dialog); button1->setFocus(); QSignalSpy spy(button1, SIGNAL(released())); @@ -676,16 +656,16 @@ void tst_QPushButton::emitReleasedAfterChange() QVERIFY(button1->isDown()); QTest::keyClick(&dialog, Qt::Key_Tab); QVERIFY(!button1->isDown()); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); spy.clear(); - QCOMPARE(spy.count(), 0); + QCOMPARE(spy.size(), 0); button1->setFocus(); QTest::mousePress(button1, Qt::LeftButton); QVERIFY(button1->isDown()); button1->setEnabled(false); QVERIFY(!button1->isDown()); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); } /* @@ -734,5 +714,98 @@ void tst_QPushButton::hitButton() QVERIFY(!button2->hitButton(QPoint(2, 2))); } +/* + Test that a style sheet with only icon doesn't crash. + QTBUG-91735 +*/ +void tst_QPushButton::iconOnlyStyleSheet() +{ + QIcon icon(":/qt-project.org/styles/commonstyle/images/dvd-32.png"); + QVERIFY(!icon.isNull()); + QPushButton pb; + pb.setStyleSheet("QPushButton {" + "icon: url(:/qt-project.org/styles/commonstyle/images/dvd-32.png);" + "border: red;" + "}"); + pb.show(); + QVERIFY(QTest::qWaitForWindowExposed(&pb)); +} + +/* + Test that mouse has been pressed,the signal is sent when moving the mouse. + QTBUG-97937 +*/ +void tst_QPushButton::mousePressAndMove() +{ + QPushButton button; + button.setGeometry(0, 0, 20, 20); + QSignalSpy pressSpy(&button, &QAbstractButton::pressed); + QSignalSpy releaseSpy(&button, &QAbstractButton::released); + + QTest::mousePress(&button, Qt::LeftButton); + QCOMPARE(pressSpy.size(), 1); + QCOMPARE(releaseSpy.size(), 0); + + // mouse pressed and moving out + QTest::mouseMove(&button, QPoint(100, 100)); + + // should emit released signal when the mouse is dragged out of boundary + QCOMPARE(pressSpy.size(), 1); + QCOMPARE(releaseSpy.size(), 1); + + // mouse pressed and moving into + QTest::mouseMove(&button, QPoint(10, 10)); + + // should emit pressed signal when the mouse is dragged into of boundary + QCOMPARE(pressSpy.size(), 2); + QCOMPARE(releaseSpy.size(), 1); +} + +/* + Test checking that a QPushButton with a QMenu has a sunken style only + when the menu is open + QTBUG-120976 +*/ +void tst_QPushButton::reactToMenuClosed() +{ + // create a subclass of QPushButton to expose the initStyleOption method + class PushButton : public QPushButton { + public: + virtual void initStyleOption(QStyleOptionButton *option) const override + { + QPushButton::initStyleOption(option); + } + }; + + PushButton button; + QStyleOptionButton opt; + QMenu menu; + + // add a menu to the button + menu.addAction(tr("string")); + button.setMenu(&menu); + + // give the button a size and show it + button.setGeometry(0, 0, 50, 50); + button.show(); + QVERIFY(QTest::qWaitForWindowExposed(&button)); + + // click the button to open the menu + QTest::mouseClick(&button, Qt::LeftButton); + + // check the menu is visible and the button style is sunken + QTRY_VERIFY(menu.isVisible()); + button.initStyleOption(&opt); + QVERIFY(opt.state.testFlag(QStyle::StateFlag::State_Sunken)); + + // close the menu + menu.close(); + + // check the menu isn't visible and the style isn't sunken + QTRY_VERIFY(!menu.isVisible()); + button.initStyleOption(&opt); + QVERIFY(!opt.state.testFlag(QStyle::StateFlag::State_Sunken)); +} + QTEST_MAIN(tst_QPushButton) #include "tst_qpushbutton.moc" |