diff --git a/src/qmltest/quicktest.cpp b/src/qmltest/quicktest.cpp index 66f1d861a2276c34505b8083b769b656605d7b66..ef026d45735afb5d04bb5d43a205a13729015de1 100644 --- a/src/qmltest/quicktest.cpp +++ b/src/qmltest/quicktest.cpp @@ -62,6 +62,8 @@ #include <stdio.h> #include <QtGui/QGuiApplication> #include <QtCore/QTranslator> +#include <QtTest/QSignalSpy> + QT_BEGIN_NAMESPACE class QTestRootObject : public QObject @@ -145,6 +147,24 @@ void handleCompileErrors(const QFileInfo &fi, QQuickView *view) results.stopLogging(); } +static bool qWaitForSignal(QObject *obj, const char* signal, int timeout = 5000) +{ + QSignalSpy spy(obj, signal); + QElapsedTimer timer; + timer.start(); + + while (!spy.size()) { + int remaining = timeout - int(timer.elapsed()); + if (remaining <= 0) + break; + QCoreApplication::processEvents(QEventLoop::AllEvents, remaining); + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + QTest::qSleep(10); + } + + return spy.size(); +} + int quick_test_main(int argc, char **argv, const char *name, const char *sourceDir) { QGuiApplication* app = 0; @@ -284,10 +304,11 @@ int quick_test_main(int argc, char **argv, const char *name, const char *sourceD // If the test already quit, then it was performed // synchronously during setSource(). Otherwise it is // an asynchronous test and we need to show the window - // and wait for the quit indication. + // and wait for the first frame to be rendered + // and then wait for quit indication. view->show(); - QTest::qWaitForWindowShown(view); - rootobj.setWindowShown(true); + if (qWaitForSignal(view, SIGNAL(frameSwapped()))) + rootobj.setWindowShown(true); if (!rootobj.hasQuit && rootobj.hasTestCase()) eventLoop.exec(); } diff --git a/tests/auto/qmltest/pixel/tst_pixel.qml b/tests/auto/qmltest/pixel/tst_pixel.qml index 624f084817143c461e845399cebd2c150efe9dd2..d36bce21aba12a4ec355b7e614430b52511342af 100644 --- a/tests/auto/qmltest/pixel/tst_pixel.qml +++ b/tests/auto/qmltest/pixel/tst_pixel.qml @@ -52,7 +52,6 @@ Rectangle { when: windowShown function test_pixel() { - wait(200); var img = grabImage(rect); compare(img.pixel(20, 20), Qt.rgba(255, 0, 0, 255)); compare(img.red(1,1), 255);