diff options
author | Mitch Curtis <mitch.curtis@qt.io> | 2021-06-19 11:30:54 +0200 |
---|---|---|
committer | Mitch Curtis <mitch.curtis@qt.io> | 2022-06-02 12:46:11 +0800 |
commit | 36c6c1ea57ad503a2f42fe81a12d1254fcd38cca (patch) | |
tree | af9fee349b18b0c92c3620525d683decb57e2098 /src/qmltest/quicktest.cpp | |
parent | 4a32ceec401b772cc0335f03310e714555b6e9c2 (diff) |
QtQuickTest: add API for checking for polish at window level
This adds a qIsPolishScheduled(QQuickWindow *) overload of
qIsPolishScheduled(QQuickItem *) (added in
40d6072bc8a4df0fe1a16025fe30fe653463a446) and deprecates
qWaitForItemPolished() (added in
7a3cad0619662b992154e075ec6b840bfc8a46a7) in favor of qWaitForPolish(),
which has QQuickItem* and QQuickWindow* overloads.
The existing functions that take QQuickItem are useful, but testing
Qt Quick applications can be made even easier by allowing users to
check if a window has any items that need to be polished. This
information is already present (in QQuickWindowPrivate::itemsToPolish),
so it's very efficient to check for.
This is especially useful now that Qt Quick Layouts using polishing for
their layouting, for example, as it's no longer necessary to find
individual polishable items in complex hierarchies before proceeding
to interact with child items.
[ChangeLog][QtQuickTest][QQuickTest] Added
QQuickTest::qIsPolishScheduled(QQuickWindow *) and
QQuickTest::qWaitForPolish(QQuickWindow *) functions for verifying that
updatePolish() was called on one or more items managed by a window.
[ChangeLog][QtQuickTest][QQuickTest] Deprecated
QQuickTest::qWaitForItemPolished(QQuickItem *). Use the new
QQuickTest::qWaitForPolish(QQuickItem *) function instead.
Fixes: QTBUG-93757
Change-Id: I95b6e051b3c9fd2fa93604f4d9ccda486bb29f9d
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'src/qmltest/quicktest.cpp')
-rw-r--r-- | src/qmltest/quicktest.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/qmltest/quicktest.cpp b/src/qmltest/quicktest.cpp index e7ad511fe1..e2deaf5533 100644 --- a/src/qmltest/quicktest.cpp +++ b/src/qmltest/quicktest.cpp @@ -45,8 +45,10 @@ #include <QtQml/qqmlengine.h> #include <QtQml/qqmlcontext.h> #include <QtQuick/private/qquickitem_p.h> +#include <QtQuick/private/qquickwindow_p.h> #include <QtQuick/qquickitem.h> #include <QtQuick/qquickview.h> +#include <QtQuick/qquickwindow.h> #include <QtQml/qjsvalue.h> #include <QtQml/qjsengine.h> #include <QtQml/qqmlpropertymap.h> @@ -110,7 +112,35 @@ bool QQuickTest::qIsPolishScheduled(const QQuickItem *item) } /*! + \since 6.4 + \overload qIsPolishScheduled() + + Returns \c true if there are any items managed by this window for + which \c qIsPolishScheduled(item) returns \c true, otherwise + returns \c false. + + For example, if an item somewhere within the scene may or may not + be polished, but you need to wait for it if it is, you can use + the following code: + + \code + if (QQuickTest::qIsPolishScheduled(window)) + QVERIFY(QQuickTest::qWaitForPolish(window)); + \endcode + + \sa QQuickItem::polish(), QQuickItem::updatePolish(), + QQuickTest::qWaitForPolish() +*/ +bool QQuickTest::qIsPolishScheduled(const QQuickWindow *window) +{ + return !QQuickWindowPrivate::get(window)->itemsToPolish.isEmpty(); +} + +#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) +#if QT_DEPRECATED_SINCE(6, 4) +/*! \since 5.13 + \deprecated [6.4] Use \l qWaitForPolish() instead. Waits for \a timeout milliseconds or until \l {QQuickItem::}{updatePolish()} has been called on \a item. @@ -126,9 +156,45 @@ bool QQuickTest::qIsPolishScheduled(const QQuickItem *item) */ bool QQuickTest::qWaitForItemPolished(const QQuickItem *item, int timeout) { + return qWaitForPolish(item, timeout); +} +#endif +#endif + +/*! + \since 6.4 + + Waits for \a timeout milliseconds or until + \l {QQuickItem::}{updatePolish()} has been called on \a item. + + Returns \c true if \c updatePolish() was called on \a item within + \a timeout milliseconds, otherwise returns \c false. + + \sa QQuickItem::polish(), QQuickItem::updatePolish(), + QQuickTest::qIsPolishScheduled() +*/ +bool QQuickTest::qWaitForPolish(const QQuickItem *item, int timeout) +{ return QTest::qWaitFor([&]() { return !QQuickItemPrivate::get(item)->polishScheduled; }, timeout); } +/*! + \since 6.4 + + Waits for \a timeout milliseconds or until \c qIsPolishScheduled(item) + returns \c false for all items managed by \a window. + + Returns \c true if \c qIsPolishScheduled(item) returns false for all items + within \a timeout milliseconds, otherwise returns \c false. + + \sa QQuickItem::polish(), QQuickItem::updatePolish(), + QQuickTest::qIsPolishScheduled() +*/ +bool QQuickTest::qWaitForPolish(const QQuickWindow *window, int timeout) +{ + return QTest::qWaitFor([&]() { return QQuickWindowPrivate::get(window)->itemsToPolish.isEmpty(); }, timeout); +} + static inline QString stripQuotes(const QString &s) { if (s.length() >= 2 && s.startsWith(QLatin1Char('"')) && s.endsWith(QLatin1Char('"'))) |