diff options
Diffstat (limited to 'tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp')
-rw-r--r-- | tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp | 175 |
1 files changed, 173 insertions, 2 deletions
diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp index 731a8c5d91..5715505fd6 100644 --- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp +++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp @@ -407,6 +407,8 @@ private slots: void testForOutsideWSRangeFlag(); + void tabletTracking(); + private: bool ensureScreenSize(int width, int height); @@ -4243,12 +4245,14 @@ void tst_QWidget::update() } } +#ifndef Q_OS_OSX static inline bool isOpaque(QWidget *widget) { if (!widget) return false; return qt_widget_private(widget)->isOpaque; } +#endif void tst_QWidget::isOpaque() { @@ -5214,16 +5218,40 @@ protected: widgetDuringFocusAboutToChange = qApp->focusWidget(); return QWidget::event(ev); } + virtual void focusInEvent(QFocusEvent *) + { + foucsObjectDuringFocusIn = qApp->focusObject(); + detectedBadEventOrdering = foucsObjectDuringFocusIn != mostRecentFocusObjectChange; + } virtual void focusOutEvent(QFocusEvent *) { + foucsObjectDuringFocusOut = qApp->focusObject(); widgetDuringFocusOut = qApp->focusWidget(); + detectedBadEventOrdering = foucsObjectDuringFocusOut != mostRecentFocusObjectChange; + } + + void focusObjectChanged(QObject *focusObject) + { + mostRecentFocusObjectChange = focusObject; } public: - FocusWidget(QWidget *parent) : QWidget(parent), widgetDuringFocusAboutToChange(0), widgetDuringFocusOut(0) {} + FocusWidget(QWidget *parent) : QWidget(parent), + widgetDuringFocusAboutToChange(0), widgetDuringFocusOut(0), + foucsObjectDuringFocusIn(0), foucsObjectDuringFocusOut(0), + mostRecentFocusObjectChange(0), detectedBadEventOrdering(false) + { + connect(qGuiApp, &QGuiApplication::focusObjectChanged, this, &FocusWidget::focusObjectChanged); + } QWidget *widgetDuringFocusAboutToChange; QWidget *widgetDuringFocusOut; + + QObject *foucsObjectDuringFocusIn; + QObject *foucsObjectDuringFocusOut; + + QObject *mostRecentFocusObjectChange; + bool detectedBadEventOrdering; }; void tst_QWidget::setFocus() @@ -5424,6 +5452,40 @@ void tst_QWidget::setFocus() QCOMPARE(window.focusWidget(), nullptr); QCOMPARE(QApplication::focusWidget(), nullptr); } + + { + QWidget window; + window.resize(m_testWidgetSize); + window.move(windowPos); + + FocusWidget child1(&window); + QWidget child2(&window); + + window.show(); + window.activateWindow(); + QVERIFY(QTest::qWaitForWindowExposed(&window)); + QTRY_VERIFY(QApplication::focusWindow()); + + QCOMPARE(QApplication::focusObject(), &window); + + child1.setFocus(); + QTRY_VERIFY(child1.hasFocus()); + QCOMPARE(window.focusWidget(), &child1); + QCOMPARE(QApplication::focusWidget(), &child1); + QCOMPARE(QApplication::focusObject(), &child1); + QCOMPARE(child1.foucsObjectDuringFocusIn, &child1); + QVERIFY2(!child1.detectedBadEventOrdering, + "focusObjectChanged should be delivered before widget focus events on setFocus"); + + child1.clearFocus(); + QTRY_VERIFY(!child1.hasFocus()); + QCOMPARE(window.focusWidget(), nullptr); + QCOMPARE(QApplication::focusWidget(), nullptr); + QCOMPARE(QApplication::focusObject(), &window); + QVERIFY(child1.foucsObjectDuringFocusOut != &child1); + QVERIFY2(!child1.detectedBadEventOrdering, + "focusObjectChanged should be delivered before widget focus events on clearFocus"); + } } template<class T> class EventSpy : public QObject @@ -8119,7 +8181,7 @@ void tst_QWidget::customDpi() custom->logicalDpiX(); QCOMPARE(custom->metricCallCount, 1); child->logicalDpiX(); - QCOMPARE(custom->metricCallCount, 2); + QCOMPARE(custom->metricCallCount, 1); } void tst_QWidget::customDpiProperty() @@ -8957,8 +9019,13 @@ void tst_QWidget::taskQTBUG_4055_sendSyntheticEnterLeave() void tst_QWidget::windowFlags() { QWidget w; + const auto baseFlags = w.windowFlags(); w.setWindowFlags(w.windowFlags() | Qt::FramelessWindowHint); QVERIFY(w.windowFlags() & Qt::FramelessWindowHint); + w.setWindowFlag(Qt::WindowStaysOnTopHint, true); + QCOMPARE(w.windowFlags(), baseFlags | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); + w.setWindowFlag(Qt::FramelessWindowHint, false); + QCOMPARE(w.windowFlags(), baseFlags | Qt::WindowStaysOnTopHint); } void tst_QWidget::initialPosForDontShowOnScreenWidgets() @@ -10464,5 +10531,109 @@ void tst_QWidget::testForOutsideWSRangeFlag() } } +class TabletWidget : public QWidget +{ +public: + TabletWidget(QWidget *parent) : QWidget(parent) { } + + int tabletEventCount = 0; + int pressEventCount = 0; + int moveEventCount = 0; + int releaseEventCount = 0; + int trackingChangeEventCount = 0; + qint64 uid = -1; + +protected: + void tabletEvent(QTabletEvent *event) override { + ++tabletEventCount; + uid = event->uniqueId(); + switch (event->type()) { + case QEvent::TabletMove: + ++moveEventCount; + break; + case QEvent::TabletPress: + ++pressEventCount; + break; + case QEvent::TabletRelease: + ++releaseEventCount; + break; + default: + break; + } + } + + bool event(QEvent *ev) override { + if (ev->type() == QEvent::TabletTrackingChange) + ++trackingChangeEventCount; + return QWidget::event(ev); + } +}; + +void tst_QWidget::tabletTracking() +{ + QWidget parent; + parent.resize(200,200); + // QWidgetWindow::handleTabletEvent doesn't deliver tablet events to the window's widget, only to a child. + // So it doesn't do any good to show a TabletWidget directly: it needs a parent. + TabletWidget widget(&parent); + widget.resize(200,200); + parent.showNormal(); + QVERIFY(QTest::qWaitForWindowExposed(&parent)); + widget.setAttribute(Qt::WA_TabletTracking); + QTRY_COMPARE(widget.trackingChangeEventCount, 1); + QVERIFY(widget.hasTabletTracking()); + + QWindow *window = parent.windowHandle(); + QPointF local(10, 10); + QPointF global = window->mapToGlobal(local.toPoint()); + QPointF deviceLocal = QHighDpi::toNativeLocalPosition(local, window); + QPointF deviceGlobal = QHighDpi::toNativePixels(global, window->screen()); + qint64 uid = 1234UL; + + QWindowSystemInterface::handleTabletEvent(window, QDateTime::currentMSecsSinceEpoch(), deviceLocal, deviceGlobal, + QTabletEvent::Stylus, QTabletEvent::Pen, Qt::NoButton, 0, 0, 0, 0, 0, 0, uid, Qt::NoModifier); + QCoreApplication::processEvents(); + QTRY_COMPARE(widget.moveEventCount, 1); + QCOMPARE(widget.uid, uid); + + local += QPoint(10, 10); + deviceLocal += QPoint(10, 10); + deviceGlobal += QPoint(10, 10); + QWindowSystemInterface::handleTabletEvent(window, QDateTime::currentMSecsSinceEpoch(), deviceLocal, deviceGlobal, + QTabletEvent::Stylus, QTabletEvent::Pen, Qt::NoButton, 0, 0, 0, 0, 0, 0, uid, Qt::NoModifier); + QCoreApplication::processEvents(); + QTRY_COMPARE(widget.moveEventCount, 2); + + widget.setTabletTracking(false); + QCoreApplication::processEvents(); + QTRY_COMPARE(widget.trackingChangeEventCount, 2); + + QWindowSystemInterface::handleTabletEvent(window, QDateTime::currentMSecsSinceEpoch(), deviceLocal, deviceGlobal, + QTabletEvent::Stylus, QTabletEvent::Pen, Qt::LeftButton, 0, 0, 0, 0, 0, 0, uid, Qt::NoModifier); + QCoreApplication::processEvents(); + QTRY_COMPARE(widget.pressEventCount, 1); + + local += QPoint(10, 10); + deviceLocal += QPoint(10, 10); + deviceGlobal += QPoint(10, 10); + QWindowSystemInterface::handleTabletEvent(window, QDateTime::currentMSecsSinceEpoch(), deviceLocal, deviceGlobal, + QTabletEvent::Stylus, QTabletEvent::Pen, Qt::LeftButton, 0, 0, 0, 0, 0, 0, uid, Qt::NoModifier); + QCoreApplication::processEvents(); + QTRY_COMPARE(widget.moveEventCount, 3); + + QWindowSystemInterface::handleTabletEvent(window, QDateTime::currentMSecsSinceEpoch(), deviceLocal, deviceGlobal, + QTabletEvent::Stylus, QTabletEvent::Pen, Qt::NoButton, 0, 0, 0, 0, 0, 0, uid, Qt::NoModifier); + QCoreApplication::processEvents(); + QTRY_COMPARE(widget.releaseEventCount, 1); + + local += QPoint(10, 10); + deviceLocal += QPoint(10, 10); + deviceGlobal += QPoint(10, 10); + QWindowSystemInterface::handleTabletEvent(window, QDateTime::currentMSecsSinceEpoch(), deviceLocal, deviceGlobal, + QTabletEvent::Stylus, QTabletEvent::Pen, Qt::NoButton, 0, 0, 0, 0, 0, 0, uid, Qt::NoModifier); + QCoreApplication::processEvents(); + QTRY_COMPARE(widget.moveEventCount, 3); +} + QTEST_MAIN(tst_QWidget) #include "tst_qwidget.moc" |