summaryrefslogtreecommitdiffstats
path: root/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2017-01-03 17:38:55 +0100
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2017-01-10 23:24:57 +0000
commit6f504a1cdd1c076365e7916f0851c5d35a8f7ad1 (patch)
treea2ea38146f6430d9e7c21cb0476c9075b27d55de /tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
parent166f23eb929d71f8a1239e0854516020b3fbc8ee (diff)
Widgets: report focus object change to QtGui before sending widget events
Updating the focus child means the focus object of the window has changed. We need to report this to QtGui immediately so that it can e.g. inform the input context of the new focus object, before widgets reacting to the focus events start calling update() on the input method. Change-Id: Ie3f7b835591e71519e3f384c2abdad53242c9736 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp')
-rw-r--r--tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp60
1 files changed, 59 insertions, 1 deletions
diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
index 9ddcabd165..2657b28d30 100644
--- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
+++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
@@ -5216,16 +5216,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()
@@ -5426,6 +5450,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