summaryrefslogtreecommitdiffstats
path: root/tests/auto/widgets/widgets
diff options
context:
space:
mode:
authorVolker Hilsheimer <volker.hilsheimer@qt.io>2020-01-22 13:51:01 +0100
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2020-01-28 22:26:26 +0100
commit6e1d70ae12baae4610356ec7b69635ad75a97b4e (patch)
treefa84a818aabe41389544c2fa05ac2ca4b2ff6bb6 /tests/auto/widgets/widgets
parent94bc57213f9a8a74e9e7520de68d7bba7f42ea4c (diff)
QPushButton: only trigger button when click occurs within the bevel rect
On the mac, the push button's bevel doesn't cover the entire widget rectangle, but is smaller to leave space for focus frame, shadow, and in general to meet style guidelines. Without this change, a click anywhere inside the widget would activate the button. QAbstractButton::hitButton can be reimplemented to limit the area in which the button is triggered. However, getting the rectangle also requires an addition to QStyle, so that we can query QStyle::subElementRect for the actual area the button's bevel covers. As a side effect, tests that use QPushButton and assume that it responds to clicks at position 0,0 have to be fixed so that they don't fail on mac. Change-Id: I01b60a763bccf39090aee5b2369af300f922d226 Fixes: QTBUG-81452 Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Diffstat (limited to 'tests/auto/widgets/widgets')
-rw-r--r--tests/auto/widgets/widgets/qbuttongroup/tst_qbuttongroup.cpp37
-rw-r--r--tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp28
2 files changed, 49 insertions, 16 deletions
diff --git a/tests/auto/widgets/widgets/qbuttongroup/tst_qbuttongroup.cpp b/tests/auto/widgets/widgets/qbuttongroup/tst_qbuttongroup.cpp
index 47dfc86a69..279fe49e3a 100644
--- a/tests/auto/widgets/widgets/qbuttongroup/tst_qbuttongroup.cpp
+++ b/tests/auto/widgets/widgets/qbuttongroup/tst_qbuttongroup.cpp
@@ -58,6 +58,23 @@ protected:
}
};
+class TestPushButton : public QPushButton
+{
+public:
+ TestPushButton(QWidget *parent = nullptr)
+ : QPushButton(parent)
+ {}
+ TestPushButton(const QString &title, QWidget *parent = nullptr)
+ : QPushButton(title, parent)
+ {}
+
+protected:
+ bool hitButton(const QPoint &pos) const override
+ {
+ return rect().contains(pos);
+ }
+};
+
#include <qbuttongroup.h>
class tst_QButtonGroup : public QObject
@@ -97,7 +114,7 @@ void tst_QButtonGroup::arrowKeyNavigation()
QGroupBox g1("1", &dlg);
QHBoxLayout g1layout(&g1);
QRadioButton bt1("Radio1", &g1);
- QPushButton pb("PB", &g1);
+ TestPushButton pb("PB", &g1);
QLineEdit le(&g1);
QRadioButton bt2("Radio2", &g1);
g1layout.addWidget(&bt1);
@@ -231,9 +248,9 @@ void tst_QButtonGroup::exclusive()
{
QDialog dlg(0);
QHBoxLayout layout(&dlg);
- QPushButton *pushButton1 = new QPushButton(&dlg);
- QPushButton *pushButton2 = new QPushButton(&dlg);
- QPushButton *pushButton3 = new QPushButton(&dlg);
+ TestPushButton *pushButton1 = new TestPushButton(&dlg);
+ TestPushButton *pushButton2 = new TestPushButton(&dlg);
+ TestPushButton *pushButton3 = new TestPushButton(&dlg);
pushButton1->setCheckable(true);
pushButton2->setCheckable(true);
pushButton3->setCheckable(true);
@@ -271,9 +288,9 @@ void tst_QButtonGroup::exclusive()
void tst_QButtonGroup::testSignals()
{
QButtonGroup buttons;
- QPushButton pb1;
- QPushButton pb2;
- QPushButton pb3;
+ TestPushButton pb1;
+ TestPushButton pb2;
+ TestPushButton pb3;
buttons.addButton(&pb1);
buttons.addButton(&pb2, 23);
buttons.addButton(&pb3);
@@ -390,9 +407,9 @@ void tst_QButtonGroup::checkedButton()
{
QButtonGroup buttons;
buttons.setExclusive(false);
- QPushButton pb1;
+ TestPushButton pb1;
pb1.setCheckable(true);
- QPushButton pb2;
+ TestPushButton pb2;
pb2.setCheckable(true);
buttons.addButton(&pb1);
buttons.addButton(&pb2, 23);
@@ -456,7 +473,7 @@ void tst_QButtonGroup::task209485_removeFromGroupInEventHandler()
QFETCH(int, signalCount);
qRegisterMetaType<QAbstractButton *>("QAbstractButton *");
- QPushButton *button = new QPushButton;
+ TestPushButton *button = new TestPushButton;
QButtonGroup group;
group.addButton(button);
diff --git a/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp b/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp
index 2c5cb88ed6..1c19bf96d6 100644
--- a/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp
+++ b/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp
@@ -152,6 +152,22 @@ Q_DECLARE_METATYPE(Qt::WindowType);
Q_DECLARE_METATYPE(Qt::WindowFlags);
Q_DECLARE_METATYPE(QMdiSubWindow*);
+class TestPushButton : public QPushButton
+{
+public:
+ TestPushButton(const QString &title, QWidget *parent = nullptr)
+ : QPushButton(title, parent)
+ {
+ }
+
+protected:
+ // don't rely on style-specific button behavior in test
+ bool hitButton(const QPoint &point) const override
+ {
+ return rect().contains(point);
+ }
+};
+
class tst_QMdiSubWindow : public QObject
{
Q_OBJECT
@@ -390,7 +406,7 @@ void tst_QMdiSubWindow::mainWindowSupport()
// the maximized subwindow's title is imposed onto the main window's titlebar.
if (!nativeMenuBar) {
QCOMPARE(mainWindow.windowTitle(), QString());
- QMdiSubWindow *window = workspace->addSubWindow(new QPushButton(QLatin1String("Test")));
+ QMdiSubWindow *window = workspace->addSubWindow(new TestPushButton(QLatin1String("Test")));
QString expectedTitle = QLatin1String("MainWindow's title is empty");
window->setWindowTitle(expectedTitle);
QCOMPARE(window->windowTitle(), expectedTitle);
@@ -1298,7 +1314,7 @@ void tst_QMdiSubWindow::changeFocusWithTab()
QTest::keyPress(widget, Qt::Key_Backtab);
QCOMPARE(QApplication::focusWidget(), static_cast<QWidget *>(firstLineEdit));
- QMdiSubWindow *window = mdiArea.addSubWindow(new QPushButton);
+ QMdiSubWindow *window = mdiArea.addSubWindow(new TestPushButton(QLatin1String("test")));
window->show();
QCOMPARE(mdiArea.activeSubWindow(), window);
@@ -1907,7 +1923,7 @@ void tst_QMdiSubWindow::setFont()
QSKIP("This test function is unstable in CI, please see QTBUG-22544");
QMdiArea mdiArea;
mdiArea.setWindowTitle(QLatin1String(QTest::currentTestFunction()));
- QMdiSubWindow *subWindow = mdiArea.addSubWindow(new QPushButton(QLatin1String("test")));
+ QMdiSubWindow *subWindow = mdiArea.addSubWindow(new TestPushButton(QLatin1String("test")));
subWindow->resize(300, 100);
subWindow->setWindowTitle(QLatin1String("Window title"));
mdiArea.show();
@@ -2057,19 +2073,19 @@ void tst_QMdiSubWindow::task_233197()
QMenuBar *menuBar = mainWindow->menuBar(); // force creation of a menubar
Q_UNUSED(menuBar);
- QPushButton *focus1 = new QPushButton(QLatin1String("Focus 1"), mainWindow);
+ QPushButton *focus1 = new TestPushButton(QLatin1String("Focus 1"), mainWindow);
QObject::connect(focus1, &QAbstractButton::clicked, subWindow1,
QOverload<>::of(&QWidget::setFocus));
focus1->move(5, 30);
focus1->show();
- QPushButton *focus2 = new QPushButton(QLatin1String("Focus 2"), mainWindow);
+ QPushButton *focus2 = new TestPushButton(QLatin1String("Focus 2"), mainWindow);
QObject::connect(focus2, &QAbstractButton::clicked, subWindow2,
QOverload<>::of(&QWidget::setFocus));
focus2->move(5, 60);
focus2->show();
- QPushButton *close = new QPushButton(QLatin1String("Close"), mainWindow);
+ QPushButton *close = new TestPushButton(QLatin1String("Close"), mainWindow);
QObject::connect(close, &QAbstractButton::clicked, mainWindow, &QWidget::close);
close->move(5, 90);
close->show();