Add QTest::qWaitForWindowFocused for checking focus window

As opposed to QTest::qWaitForWindowActive, which checks if the window
is active, which is not a guarantee that the window has focus.

Task-number: QTBUG-119287
Change-Id: I9fe65b0474095389f6518ebaaf07c71143b6f459
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
Tor Arne Vestbø 2023-12-08 14:44:10 +01:00
parent 311f889632
commit 9eb06a2848
4 changed files with 50 additions and 1 deletions

View File

@ -29,7 +29,7 @@ QT_BEGIN_NAMESPACE
\note Since focus is an exclusive property, \a window may loose its focus to another window at
any time - even after the method has returned \c true.
\sa qWaitForWindowExposed(), QWindow::isActive()
\sa qWaitForWindowExposed(), qWaitForWindowFocused(), QWindow::isActive()
*/
Q_GUI_EXPORT bool QTest::qWaitForWindowActive(QWindow *window, int timeout)
{
@ -44,6 +44,27 @@ Q_GUI_EXPORT bool QTest::qWaitForWindowActive(QWindow *window, int timeout)
return QTest::qWaitFor([&]() { return window->isActive(); }, timeout);
}
/*!
\since 6.7
Returns \c true, if \a window is the focus window within \a timeout milliseconds. Otherwise returns \c false.
The method is useful in tests that call QWindow::show() and rely on the window
having focus (for receiving keyboard events e.g.) before proceeding.
\note The method will time out and return \c false if another window prevents \a window from
becoming focused.
\note Since focus is an exclusive property, \a window may loose its focus to another window at
any time - even after the method has returned \c true.
\sa qWaitForWindowExposed(), qWaitForWindowActive(), QGuiApplication::focusWindow()
*/
Q_GUI_EXPORT bool QTest::qWaitForWindowFocused(QWindow *window, int timeout)
{
return QTest::qWaitFor([&]() { return qGuiApp->focusWindow() == window; }, timeout);
}
/*!
\since 5.0

View File

@ -23,6 +23,7 @@ Q_GUI_EXPORT bool qt_handleTouchEventv2(QWindow *w, const QPointingDevice *devic
namespace QTest {
[[nodiscard]] Q_GUI_EXPORT bool qWaitForWindowActive(QWindow *window, int timeout = 5000);
[[nodiscard]] Q_GUI_EXPORT bool qWaitForWindowFocused(QWindow *window, int timeout = 5000);
[[nodiscard]] Q_GUI_EXPORT bool qWaitForWindowExposed(QWindow *window, int timeout = 5000);
Q_GUI_EXPORT QPointingDevice * createTouchDevice(QInputDevice::DeviceType devType = QInputDevice::DeviceType::TouchScreen,

View File

@ -60,6 +60,32 @@ Q_WIDGETS_EXPORT bool QTest::qWaitForWindowActive(QWidget *widget, int timeout)
timeout);
}
/*!
\since 6.7
Returns \c true, if \a widget is the focus window within \a timeout milliseconds. Otherwise returns \c false.
The method is useful in tests that call QWidget::show() and rely on the widget
having focus (for receiving keyboard events e.g.) before proceeding.
\note The method will time out and return \c false if another window prevents \a widget from
becoming focused.
\note Since focus is an exclusive property, \a widget may loose its focus to another window at
any time - even after the method has returned \c true.
\sa qWaitForWindowExposed(), qWaitForWindowActive(), QGuiApplication::focusWindow()
*/
Q_WIDGETS_EXPORT bool QTest::qWaitForWindowFocused(QWidget *widget, int timeout)
{
return qWaitForWidgetWindow([&]() {
return widget->window()->windowHandle();
}, [&](QWindow *window) {
return qGuiApp->focusWindow() == window;
}, timeout);
}
/*!
\since 5.0

View File

@ -15,6 +15,7 @@ class QWidget;
namespace QTest {
[[nodiscard]] Q_WIDGETS_EXPORT bool qWaitForWindowActive(QWidget *widget, int timeout = 5000);
[[nodiscard]] Q_WIDGETS_EXPORT bool qWaitForWindowFocused(QWidget *widget, int timeout = 5000);
[[nodiscard]] Q_WIDGETS_EXPORT bool qWaitForWindowExposed(QWidget *widget, int timeout = 5000);
class Q_WIDGETS_EXPORT QTouchEventWidgetSequence : public QTouchEventSequence