diff options
Diffstat (limited to 'tests/auto')
26 files changed, 624 insertions, 48 deletions
diff --git a/tests/auto/cmake/CMakeLists.txt b/tests/auto/cmake/CMakeLists.txt index 25f2ab6a87..0f794915ee 100644 --- a/tests/auto/cmake/CMakeLists.txt +++ b/tests/auto/cmake/CMakeLists.txt @@ -121,7 +121,7 @@ test_module_includes( ) expect_pass(test_concurrent_module) expect_pass(test_openglextensions_module) -if (QT_WITH_ANGLE OR (NOT WIN32 AND NOT APPLE)) +if (QT_WITH_ANGLE OR (NOT WIN32 AND NOT APPLE AND NOT NO_EGL)) expect_pass(test_egl_lib) endif() expect_pass(test_opengl_lib) diff --git a/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp b/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp index b5f736cfbb..616fe33309 100644 --- a/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp +++ b/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp @@ -1917,6 +1917,17 @@ void tst_QTextCodec::codecForHtml_data() html = "<!DOCTYPE html><html><head><meta charset=\" utf' 8 /><title>Test</title></head>"; QTest::newRow("invalid charset, early terminator (')") << html << noDefault << fallback; + + const char src[] = { char(0xff), char(0xfe), char(0x7a), char(0x03), 0, 0 }; + html = src; + QTest::newRow("greek text UTF-16LE") << html << 106 << 1014; + + html = "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\"><span style=\"color: rgb(0, 0, 0); font-family: " + "'Galatia SIL'; font-size: 27px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; " + "line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: " + "auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; display: inline !important; float: " + "none;\">ͻ</span>\000"; + QTest::newRow("greek text UTF-8") << html << 106 << 106; } void tst_QTextCodec::codecForHtml() diff --git a/tests/auto/corelib/global/qflags/tst_qflags.cpp b/tests/auto/corelib/global/qflags/tst_qflags.cpp index b9b817d688..e50a6b63fe 100644 --- a/tests/auto/corelib/global/qflags/tst_qflags.cpp +++ b/tests/auto/corelib/global/qflags/tst_qflags.cpp @@ -49,6 +49,7 @@ private slots: void testFlagMultiBits() const; void constExpr(); void signedness(); + void classEnum(); }; void tst_QFlags::testFlag() const @@ -137,6 +138,121 @@ void tst_QFlags::signedness() QtPrivate::is_signed<Qt::Alignment::Int>::value)); } +#if defined(Q_COMPILER_CLASS_ENUM) +enum class MyStrictEnum { StrictZero, StrictOne, StrictTwo, StrictFour=4 }; +Q_DECLARE_FLAGS( MyStrictFlags, MyStrictEnum ) +Q_DECLARE_OPERATORS_FOR_FLAGS( MyStrictFlags ) + +Q_STATIC_ASSERT( !QTypeInfo<MyStrictFlags>::isComplex ); +Q_STATIC_ASSERT( !QTypeInfo<MyStrictFlags>::isStatic ); +Q_STATIC_ASSERT( !QTypeInfo<MyStrictFlags>::isLarge ); +Q_STATIC_ASSERT( !QTypeInfo<MyStrictFlags>::isPointer ); +#endif + +void tst_QFlags::classEnum() +{ +#if defined(Q_COMPILER_CLASS_ENUM) + // The main aim of the test is making sure it compiles + // The QCOMPARE are there as an extra + MyStrictEnum e1 = MyStrictEnum::StrictOne; + MyStrictEnum e2 = MyStrictEnum::StrictTwo; + + MyStrictFlags f1(MyStrictEnum::StrictOne); + QCOMPARE(f1, 1); + + MyStrictFlags f2(e2); + QCOMPARE(f2, 2); + + MyStrictFlags f0; + QCOMPARE(f0, 0); + + MyStrictFlags f3(e2 | e1); + QCOMPARE(f3, 3); + + QVERIFY(f3.testFlag(MyStrictEnum::StrictOne)); + QVERIFY(!f1.testFlag(MyStrictEnum::StrictTwo)); + + QVERIFY(!f0); + + QCOMPARE(f3 & int(1), 1); + QCOMPARE(f3 & uint(1), 1); + QCOMPARE(f3 & MyStrictEnum::StrictOne, 1); + + MyStrictFlags aux; + aux = f3; + aux &= int(1); + QCOMPARE(aux, 1); + + aux = f3; + aux &= uint(1); + QCOMPARE(aux, 1); + + aux = f3; + aux &= MyStrictEnum::StrictOne; + QCOMPARE(aux, 1); + + aux = f3; + aux &= f1; + QCOMPARE(aux, 1); + + aux = f3 ^ f3; + QCOMPARE(aux, 0); + + aux = f3 ^ f1; + QCOMPARE(aux, 2); + + aux = f3 ^ f0; + QCOMPARE(aux, 3); + + aux = f3 ^ MyStrictEnum::StrictOne; + QCOMPARE(aux, 2); + + aux = f3 ^ MyStrictEnum::StrictZero; + QCOMPARE(aux, 3); + + aux = f3; + aux ^= f3; + QCOMPARE(aux, 0); + + aux = f3; + aux ^= f1; + QCOMPARE(aux, 2); + + aux = f3; + aux ^= f0; + QCOMPARE(aux, 3); + + aux = f3; + aux ^= MyStrictEnum::StrictOne; + QCOMPARE(aux, 2); + + aux = f3; + aux ^= MyStrictEnum::StrictZero; + QCOMPARE(aux, 3); + + aux = f1 | f2; + QCOMPARE(aux, 3); + + aux = MyStrictEnum::StrictOne | MyStrictEnum::StrictTwo; + QCOMPARE(aux, 3); + + aux = f1; + aux |= f2; + QCOMPARE(aux, 3); + + aux = MyStrictEnum::StrictOne; + aux |= MyStrictEnum::StrictTwo; + QCOMPARE(aux, 3); + + aux = ~f1; + QCOMPARE(aux, -2); + + // Just to make sure it compiles + if (false) + qDebug() << f3; +#endif +} + // (statically) check QTypeInfo for QFlags instantiations: enum MyEnum { Zero, One, Two, Four=4 }; Q_DECLARE_FLAGS( MyFlags, MyEnum ) diff --git a/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp b/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp index d7fc76d980..3607467ff9 100644 --- a/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp +++ b/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp @@ -268,7 +268,8 @@ static int NColorRoles[] = { QPalette::ToolTipText + 1, // Qt_4_5 QPalette::ToolTipText + 1, // Qt_4_6 QPalette::ToolTipText + 1, // Qt_5_0 - 0 // add the correct value for Qt_5_1 here later + QPalette::ToolTipText + 1, // Qt_5_1 + 0 // add the correct value for Qt_5_2 here later }; // Testing get/set functions diff --git a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp index f01e319872..613bfd5c17 100644 --- a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp +++ b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp @@ -152,6 +152,7 @@ private slots: void invalidProgramString_data(); void invalidProgramString(); void onlyOneStartedSignal(); + void finishProcessBeforeReadingDone(); // keep these at the end, since they use lots of processes and sometimes // caused obscure failures to occur in tests that followed them (esp. on the Mac) @@ -2168,6 +2169,39 @@ void tst_QProcess::onlyOneStartedSignal() QCOMPARE(spyFinished.count(), 1); } +//----------------------------------------------------------------------------- + +class BlockOnReadStdOut : public QObject +{ + Q_OBJECT +public: + BlockOnReadStdOut(QProcess *process) + { + connect(process, SIGNAL(readyReadStandardOutput()), SLOT(block())); + } + +public slots: + void block() + { + QThread::sleep(1); + } +}; + +void tst_QProcess::finishProcessBeforeReadingDone() +{ + QProcess process; + BlockOnReadStdOut blocker(&process); + QEventLoop loop; + connect(&process, SIGNAL(finished(int)), &loop, SLOT(quit())); + process.start("testProcessOutput/testProcessOutput"); + QVERIFY(process.waitForStarted()); + loop.exec(); + QStringList lines = QString::fromLocal8Bit(process.readAllStandardOutput()).split( + QRegExp(QStringLiteral("[\r\n]")), QString::SkipEmptyParts); + QVERIFY(!lines.isEmpty()); + QCOMPARE(lines.last(), QStringLiteral("10239 -this is a number")); +} + #endif //QT_NO_PROCESS QTEST_MAIN(tst_QProcess) diff --git a/tests/auto/corelib/json/tst_qtjson.cpp b/tests/auto/corelib/json/tst_qtjson.cpp index 543226978c..010c8acb5f 100644 --- a/tests/auto/corelib/json/tst_qtjson.cpp +++ b/tests/auto/corelib/json/tst_qtjson.cpp @@ -234,9 +234,54 @@ void tst_QtJson::testNumbers() QJsonArray array; for (int i = 0; i < n; ++i) array.append((double)numbers[i]); + + QByteArray serialized = QJsonDocument(array).toJson(); + QJsonDocument json = QJsonDocument::fromJson(serialized); + QJsonArray array2 = json.array(); + + QCOMPARE(array.size(), array2.size()); + for (int i = 0; i < array.size(); ++i) { + QCOMPARE(array.at(i).type(), QJsonValue::Double); + QCOMPARE(array.at(i).toDouble(), (double)numbers[i]); + QCOMPARE(array2.at(i).type(), QJsonValue::Double); + QCOMPARE(array2.at(i).toDouble(), (double)numbers[i]); + } + } + + { + qint64 numbers[] = { + 0, + -1, + 1, + (1UL<<54), + (1UL<<55), + (1UL<<56), + -(1UL<<54), + -(1UL<<55), + -(1UL<<56), + (1UL<<54) - 1, + (1UL<<55) - 1, + (1UL<<56) - 1, + -((1UL<<54) - 1), + -((1UL<<55) - 1), + -((1UL<<56) - 1) + }; + int n = sizeof(numbers)/sizeof(qint64); + + QJsonArray array; + for (int i = 0; i < n; ++i) + array.append((double)numbers[i]); + + QByteArray serialized = QJsonDocument(array).toJson(); + QJsonDocument json = QJsonDocument::fromJson(serialized); + QJsonArray array2 = json.array(); + + QCOMPARE(array.size(), array2.size()); for (int i = 0; i < array.size(); ++i) { QCOMPARE(array.at(i).type(), QJsonValue::Double); QCOMPARE(array.at(i).toDouble(), (double)numbers[i]); + QCOMPARE(array2.at(i).type(), QJsonValue::Double); + QCOMPARE(array2.at(i).toDouble(), (double)numbers[i]); } } @@ -245,18 +290,18 @@ void tst_QtJson::testNumbers() 0, -1, 1, - (1<<26), - (1<<27), - (1<<28), - -(1<<26), - -(1<<27), - -(1<<28), - (1<<26) - 1, - (1<<27) - 1, - (1<<28) - 1, - -((1<<26) - 1), - -((1<<27) - 1), - -((1<<28) - 1), + (1UL<<54), + (1UL<<55), + (1UL<<56), + -(1UL<<54), + -(1UL<<55), + -(1UL<<56), + (1UL<<54) - 1, + (1UL<<55) - 1, + (1UL<<56) - 1, + -((1UL<<54) - 1), + -((1UL<<55) - 1), + -((1UL<<56) - 1), 1.1, 0.1, -0.1, @@ -269,9 +314,17 @@ void tst_QtJson::testNumbers() QJsonArray array; for (int i = 0; i < n; ++i) array.append(numbers[i]); + + QByteArray serialized = QJsonDocument(array).toJson(); + QJsonDocument json = QJsonDocument::fromJson(serialized); + QJsonArray array2 = json.array(); + + QCOMPARE(array.size(), array2.size()); for (int i = 0; i < array.size(); ++i) { QCOMPARE(array.at(i).type(), QJsonValue::Double); QCOMPARE(array.at(i).toDouble(), numbers[i]); + QCOMPARE(array2.at(i).type(), QJsonValue::Double); + QCOMPARE(array2.at(i).toDouble(), numbers[i]); } } diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp index 06fc89f657..d16369de02 100644 --- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp +++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp @@ -145,6 +145,7 @@ private slots: void connectFunctorArgDifference(); void connectFunctorOverloads(); void disconnectDoesNotLeakFunctor(); + void connectBase(); }; struct QObjectCreatedOnShutdown @@ -5811,5 +5812,29 @@ void tst_QObject::disconnectDoesNotLeakFunctor() QCOMPARE(countedStructObjectsCount, 0); } +class SubSender : public SenderObject { + Q_OBJECT +}; + +void tst_QObject::connectBase() +{ + SubSender sub; + ReceiverObject r1; + r1.reset(); + + QVERIFY( connect( &sub, &SubSender::signal1 , &r1, &ReceiverObject::slot1 ) ); + QVERIFY( connect( &sub, static_cast<void (SenderObject::*)()>(&SubSender::signal2) , &r1, &ReceiverObject::slot2 ) ); + QVERIFY( connect( &sub, static_cast<void (SubSender::*)()>(&SubSender::signal3) , &r1, &ReceiverObject::slot3 ) ); + + sub.emitSignal1(); + sub.emitSignal2(); + sub.emitSignal3(); + + QCOMPARE( r1.count_slot1, 1 ); + QCOMPARE( r1.count_slot2, 1 ); + QCOMPARE( r1.count_slot3, 1 ); +} + + QTEST_MAIN(tst_QObject) #include "tst_qobject.moc" diff --git a/tests/auto/corelib/thread/qthreadpool/tst_qthreadpool.cpp b/tests/auto/corelib/thread/qthreadpool/tst_qthreadpool.cpp index 8a72ae5bce..fb34afb880 100644 --- a/tests/auto/corelib/thread/qthreadpool/tst_qthreadpool.cpp +++ b/tests/auto/corelib/thread/qthreadpool/tst_qthreadpool.cpp @@ -94,6 +94,8 @@ private slots: void tryStart(); void tryStartPeakThreadCount(); void tryStartCount(); + void priorityStart_data(); + void priorityStart(); void waitForDone(); void waitForDoneTimeout(); void destroyingWaitsForTasksToFinish(); @@ -747,6 +749,57 @@ void tst_QThreadPool::tryStartCount() } } +void tst_QThreadPool::priorityStart_data() +{ + QTest::addColumn<int>("otherCount"); + QTest::newRow("0") << 0; + QTest::newRow("1") << 1; + QTest::newRow("2") << 2; +} + +void tst_QThreadPool::priorityStart() +{ + class Holder : public QRunnable + { + public: + QSemaphore &sem; + Holder(QSemaphore &sem) : sem(sem) {} + void run() + { + sem.acquire(); + } + }; + class Runner : public QRunnable + { + public: + QAtomicPointer<QRunnable> &ptr; + Runner(QAtomicPointer<QRunnable> &ptr) : ptr(ptr) {} + void run() + { + ptr.testAndSetRelaxed(0, this); + } + }; + + QFETCH(int, otherCount); + QSemaphore sem; + QAtomicPointer<QRunnable> firstStarted; + QRunnable *expected; + QThreadPool threadPool; + threadPool.setMaxThreadCount(1); // start only one thread at a time + + // queue the holder first + // We need to be sure that all threads are active when we + // queue the two Runners + threadPool.start(new Holder(sem)); + while (otherCount--) + threadPool.start(new Runner(firstStarted), 0); // priority 0 + threadPool.start(expected = new Runner(firstStarted), 1); // priority 1 + + sem.release(); + QVERIFY(threadPool.waitForDone()); + QCOMPARE(firstStarted.load(), expected); +} + void tst_QThreadPool::waitForDone() { QTime total, pass; diff --git a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp index 6cfcf74069..0ec3f64020 100644 --- a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp +++ b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp @@ -1398,13 +1398,19 @@ void tst_QDateTime::operator_insert_extract() { QDataStream dataStream(&byteArray, QIODevice::WriteOnly); dataStream.setVersion(dataStreamVersion); - if (dataStreamVersion >= QDataStream::Qt_5_0) { + if (dataStreamVersion == QDataStream::Qt_5_0) { // Qt 5 serialises as UTC and converts back to the stored timeSpec when // deserialising; we don't need to do it ourselves... dataStream << dateTime << dateTime; } else { - // ... but lower versions don't, so we have to here. + // ... but other versions don't, so we have to here. dataStream << dateTimeAsUTC << dateTimeAsUTC; + // We'll also make sure that a deserialised local datetime is the same + // time of day (potentially different UTC time), regardless of which + // timezone it was serialised in. E.g.: Tue Aug 14 08:00:00 2012 + // serialised in WST should be deserialised as Tue Aug 14 08:00:00 2012 + // HST. + dataStream << dateTime; } } @@ -1420,7 +1426,7 @@ void tst_QDateTime::operator_insert_extract() QDateTime deserialised; dataStream >> deserialised; - if (dataStreamVersion >= QDataStream::Qt_5_0) { + if (dataStreamVersion == QDataStream::Qt_5_0) { // Ensure local time is still correct. Again, Qt 5 handles the timeSpec // conversion (in this case, UTC => LocalTime) for us when deserialising. QCOMPARE(deserialised, expectedLocalTime); @@ -1453,6 +1459,14 @@ void tst_QDateTime::operator_insert_extract() QCOMPARE(deserialised, expectedLocalTime); // Sanity check UTC times. QCOMPARE(deserialised.toUTC(), expectedLocalTime.toUTC()); + + if (dataStreamVersion != QDataStream::Qt_5_0) { + // Deserialised local datetime should be the same time of day, + // regardless of which timezone it was serialised in. + QDateTime localDeserialized; + dataStream >> localDeserialized; + QCOMPARE(localDeserialized, dateTime); + } } qputenv("TZ", previousTimeZone.toLocal8Bit().constData()); diff --git a/tests/auto/corelib/tools/qhash/tst_qhash.cpp b/tests/auto/corelib/tools/qhash/tst_qhash.cpp index 1cbf181286..71428310b8 100644 --- a/tests/auto/corelib/tools/qhash/tst_qhash.cpp +++ b/tests/auto/corelib/tools/qhash/tst_qhash.cpp @@ -75,6 +75,9 @@ private slots: void const_shared_null(); void twoArguments_qHash(); void initializerList(); + + void qthash_data(); + void qthash(); }; struct Foo { @@ -1330,5 +1333,24 @@ void tst_QHash::initializerList() #endif } +void tst_QHash::qthash_data() +{ + QTest::addColumn<QString>("key"); + QTest::addColumn<uint>("hash"); + + QTest::newRow("null") << QString() << 0u; + QTest::newRow("empty") << QStringLiteral("") << 0u; + QTest::newRow("abcdef") << QStringLiteral("abcdef") << 108567222u; + QTest::newRow("tqbfjotld") << QStringLiteral("The quick brown fox jumps over the lazy dog") << 140865879u; + QTest::newRow("42") << QStringLiteral("42") << 882u; +} + +void tst_QHash::qthash() +{ + QFETCH(QString, key); + const uint result = qt_hash(key); + QTEST(result, "hash"); +} + QTEST_APPLESS_MAIN(tst_QHash) #include "tst_qhash.moc" diff --git a/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp b/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp index f8775bc75f..0f6015ebdc 100644 --- a/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp +++ b/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp @@ -350,6 +350,7 @@ void tst_QLocale::ctor() TEST_CTOR("es_ES", Spanish, Spain) TEST_CTOR("es_419", Spanish, LatinAmericaAndTheCaribbean) TEST_CTOR("es-419", Spanish, LatinAmericaAndTheCaribbean) + TEST_CTOR("fr_MA", French, Morocco) // test default countries for languages TEST_CTOR("zh", Chinese, China) diff --git a/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp b/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp index c77b4eea42..7cd8642f26 100644 --- a/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp +++ b/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp @@ -510,11 +510,11 @@ void tst_QKeySequence::toStringFromKeycode_data() QTest::newRow("A") << QKeySequence(Qt::Key_A) << "A"; QTest::newRow("-1") << QKeySequence(-1) << ""; QTest::newRow("Unknown") << QKeySequence(Qt::Key_unknown) << ""; - QTest::newRow("Ctrl+Numpad+Ins") << QKeySequence(Qt::ControlModifier | Qt::KeypadModifier | Qt::Key_Insert) << "Ctrl+Numpad+Ins"; - QTest::newRow("Ctrl+Numpad+Del") << QKeySequence(Qt::ControlModifier | Qt::KeypadModifier | Qt::Key_Delete) << "Ctrl+Numpad+Del"; - QTest::newRow("Ctrl+Alt+Numpad+Del") << QKeySequence(Qt::ControlModifier | Qt::AltModifier | Qt::KeypadModifier | Qt::Key_Delete) << "Ctrl+Alt+Numpad+Del"; + QTest::newRow("Ctrl+Num+Ins") << QKeySequence(Qt::ControlModifier | Qt::KeypadModifier | Qt::Key_Insert) << "Ctrl+Num+Ins"; + QTest::newRow("Ctrl+Num+Del") << QKeySequence(Qt::ControlModifier | Qt::KeypadModifier | Qt::Key_Delete) << "Ctrl+Num+Del"; + QTest::newRow("Ctrl+Alt+Num+Del") << QKeySequence(Qt::ControlModifier | Qt::AltModifier | Qt::KeypadModifier | Qt::Key_Delete) << "Ctrl+Alt+Num+Del"; QTest::newRow("Ctrl+Ins") << QKeySequence(Qt::ControlModifier | Qt::Key_Insert) << "Ctrl+Ins"; - QTest::newRow("Ctrl+Numpad+Ins(1)") << QKeySequence(Qt::Key_Insert | Qt::KeypadModifier | Qt::ControlModifier) << "Ctrl+Numpad+Ins"; + QTest::newRow("Ctrl+Num+Ins(1)") << QKeySequence(Qt::Key_Insert | Qt::KeypadModifier | Qt::ControlModifier) << "Ctrl+Num+Ins"; } void tst_QKeySequence::toStringFromKeycode() diff --git a/tests/auto/opengl/qgl/tst_qgl.cpp b/tests/auto/opengl/qgl/tst_qgl.cpp index 00973cf533..28ec699427 100644 --- a/tests/auto/opengl/qgl/tst_qgl.cpp +++ b/tests/auto/opengl/qgl/tst_qgl.cpp @@ -875,6 +875,10 @@ void tst_QGL::graphicsViewClipping() scene.setSceneRect(view.viewport()->rect()); QVERIFY(QTest::qWaitForWindowExposed(&view)); + #ifdef Q_OS_MAC + // The black rectangle jumps from the center to the upper left for some reason. + QTest::qWait(100); + #endif QTRY_VERIFY(widget->painted); diff --git a/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp b/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp index b117edddd4..0261224543 100644 --- a/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp +++ b/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp @@ -45,6 +45,8 @@ #include <qpagesetupdialog.h> #include <qpainter.h> #include <qprintdialog.h> +#include <qprintpreviewdialog.h> +#include <qprintpreviewwidget.h> #include <qprinterinfo.h> #include <qvariant.h> #include <qpainter.h> @@ -98,6 +100,7 @@ private slots: void testMargins_data(); void testMargins(); void testPageSetupDialog(); + void testPrintPreviewDialog(); void testMulitpleSets_data(); void testMulitpleSets(); void testPageMargins_data(); @@ -242,6 +245,49 @@ void tst_QPrinter::testPageSetupDialog() } } +// A preview dialog showing 4 pages for testPrintPreviewDialog(). + +class MyPreviewDialog : public QPrintPreviewDialog { + Q_OBJECT +public: + MyPreviewDialog(QPrinter *p) : QPrintPreviewDialog(p) + { + connect(this, SIGNAL(paintRequested(QPrinter*)), this, SLOT(slotPaintRequested(QPrinter*))); + } + +public slots: + void slotPaintRequested(QPrinter *p); +}; + +void MyPreviewDialog::slotPaintRequested(QPrinter *p) +{ + enum { pageCount = 4 }; + QPainter painter; + painter.begin(p); + for (int i = 0; i < pageCount; ++i) { + const QRect f = p->pageRect(QPrinter::DevicePixel).toRect(); + painter.fillRect(f, Qt::white); + painter.drawText(f.center(), QString::fromLatin1("Page %1").arg(i + 1)); + if (i != pageCount - 1) + p->newPage(); + } + painter.end(); +} + +void tst_QPrinter::testPrintPreviewDialog() +{ + // QTBUG-14517: Showing the dialog with Qt::WindowMaximized caused it to switch to + // page 2 due to the scrollbar logic (besides testing for crashes). + QPrinter printer; + MyPreviewDialog dialog(&printer); + dialog.setWindowState(Qt::WindowMaximized); + dialog.show(); + QVERIFY(QTest::qWaitForWindowExposed(&dialog)); + QPrintPreviewWidget *widget = dialog.findChild<QPrintPreviewWidget *>(); + QVERIFY(widget); + QCOMPARE(widget->currentPage(), 1); +} + #ifdef Q_OS_WIN // QPrinter::winPageSize(): Windows only. void tst_QPrinter::testPageSize() diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp index 3cd2f1f936..3459bede85 100644 --- a/tests/auto/tools/moc/tst_moc.cpp +++ b/tests/auto/tools/moc/tst_moc.cpp @@ -79,6 +79,9 @@ QT_USE_NAMESPACE +template <bool b> struct QTBUG_31218 {}; +struct QTBUG_31218_Derived : QTBUG_31218<-1<0> {}; + struct MyStruct {}; struct MyStruct2 {}; @@ -322,6 +325,8 @@ public slots: signals: void signalWithArray(const double[3]); void signalWithNamedArray(const double namedArray[3]); + void signalWithIterator(QList<QUrl>::iterator); + void signalWithListPointer(QList<QUrl>*); //QTBUG-31002 private slots: // for tst_Moc::preprocessorConditionals @@ -1734,6 +1739,11 @@ void tst_Moc::warnings() #endif QProcess proc; + + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + env.insert("QT_MESSAGE_PATTERN", "no qDebug or qWarning please"); + proc.setProcessEnvironment(env); + proc.start("moc", args); QVERIFY(proc.waitForStarted()); diff --git a/tests/auto/widgets/dialogs/dialogs.pro b/tests/auto/widgets/dialogs/dialogs.pro index e767c9767e..acff1df5ba 100644 --- a/tests/auto/widgets/dialogs/dialogs.pro +++ b/tests/auto/widgets/dialogs/dialogs.pro @@ -14,7 +14,7 @@ SUBDIRS=\ qsidebar \ qwizard \ -wince*:SUBDIRS -= qabstractprintdialog +wince*|!qtHaveModule(printsupport):SUBDIRS -= qabstractprintdialog !contains(QT_CONFIG, private_tests): SUBDIRS -= \ qsidebar \ diff --git a/tests/auto/widgets/dialogs/qprogressdialog/tst_qprogressdialog.cpp b/tests/auto/widgets/dialogs/qprogressdialog/tst_qprogressdialog.cpp index d49f356d8c..68502f0d8d 100644 --- a/tests/auto/widgets/dialogs/qprogressdialog/tst_qprogressdialog.cpp +++ b/tests/auto/widgets/dialogs/qprogressdialog/tst_qprogressdialog.cpp @@ -46,6 +46,7 @@ #include <qdebug.h> #include <qprogressdialog.h> #include <qlabel.h> +#include <qthread.h> class tst_QProgressDialog : public QObject { @@ -58,6 +59,7 @@ public: private slots: void getSetCheck(); void task198202(); + void QTBUG_31046(); }; tst_QProgressDialog::tst_QProgressDialog() @@ -149,5 +151,14 @@ void tst_QProgressDialog::task198202() QCOMPARE(dlg.sizeHint().height(), futureHeight); } +void tst_QProgressDialog::QTBUG_31046() +{ + QProgressDialog dlg("", "", 50, 60); + dlg.setValue(0); + QThread::msleep(200); + dlg.setValue(50); + QCOMPARE(50, dlg.value()); +} + QTEST_MAIN(tst_QProgressDialog) #include "tst_qprogressdialog.moc" diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp index 37190c3cf2..3e24257736 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp @@ -470,6 +470,7 @@ private slots: void QTBUG_13473_sceneposchange(); void QTBUG_16374_crashInDestructor(); void QTBUG_20699_focusScopeCrash(); + void QTBUG_30990_rightClickSelection(); private: QList<QGraphicsItem *> paintedItems; @@ -11468,5 +11469,32 @@ void tst_QGraphicsItem::QTBUG_20699_focusScopeCrash() fs.setFocus(); } +void tst_QGraphicsItem::QTBUG_30990_rightClickSelection() +{ + QGraphicsScene scene; + QGraphicsItem *item1 = scene.addRect(10, 10, 10, 10); + item1->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable); + QGraphicsItem *item2 = scene.addRect(100, 100, 10, 10); + item2->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable); + + // right mouse press & release over an item should not make it selected + sendMousePress(&scene, item1->boundingRect().center(), Qt::RightButton); + QVERIFY(!item1->isSelected()); + sendMouseRelease(&scene, item1->boundingRect().center(), Qt::RightButton); + QVERIFY(!item1->isSelected()); + + // right mouse press over one item, moving over another item, + // and then releasing should make neither of the items selected + sendMousePress(&scene, item1->boundingRect().center(), Qt::RightButton); + QVERIFY(!item1->isSelected()); + QVERIFY(!item2->isSelected()); + sendMouseMove(&scene, item2->boundingRect().center(), Qt::RightButton); + QVERIFY(!item1->isSelected()); + QVERIFY(!item2->isSelected()); + sendMouseRelease(&scene, item2->boundingRect().center(), Qt::RightButton); + QVERIFY(!item1->isSelected()); + QVERIFY(!item2->isSelected()); +} + QTEST_MAIN(tst_QGraphicsItem) #include "tst_qgraphicsitem.moc" diff --git a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp index beea46c979..c2e6d33adb 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp @@ -983,6 +983,7 @@ void tst_QGraphicsProxyWidget::hoverEnterLeaveEvent() // in QTest::mouseMove(&view, QPoint(50, 50)); + QSKIP("QTBUG-25294"); QTRY_COMPARE(widget->testAttribute(Qt::WA_UnderMouse), hasWidget ? true : false); // ### this attribute isn't supported QCOMPARE(widget->enterCount, hasWidget ? 1 : 0); diff --git a/tests/auto/widgets/graphicsview/qgraphicssceneindex/tst_qgraphicssceneindex.cpp b/tests/auto/widgets/graphicsview/qgraphicssceneindex/tst_qgraphicssceneindex.cpp index 7794fde2c7..dd432912f3 100644 --- a/tests/auto/widgets/graphicsview/qgraphicssceneindex/tst_qgraphicssceneindex.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicssceneindex/tst_qgraphicssceneindex.cpp @@ -307,8 +307,8 @@ void tst_QGraphicsSceneIndex::clear() QGraphicsView view(&scene); view.show(); - QVERIFY(QTest::qWaitForWindowActive(&view)); qApp->setActiveWindow(&view); + QVERIFY(QTest::qWaitForWindowActive(&view)); scene.clear(); // Make sure the index is re-generated after QGraphicsScene::clear(); diff --git a/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp b/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp index 4cfdfccd63..31439e203c 100644 --- a/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp @@ -1214,7 +1214,7 @@ void tst_QGraphicsWidget::layoutDirection() { QFETCH(Qt::LayoutDirection, layoutDirection); QGraphicsScene scene; - QGraphicsView *view = new QGraphicsView(&scene); + QScopedPointer<QGraphicsView> view(new QGraphicsView(&scene)); SubQGraphicsWidget widget; scene.addItem(&widget); QCOMPARE(widget.layoutDirection(), Qt::LeftToRight); @@ -1229,14 +1229,13 @@ void tst_QGraphicsWidget::layoutDirection() widget.setLayoutDirection(layoutDirection); QCOMPARE(widget.testAttribute(Qt::WA_SetLayoutDirection), true); view->show(); - QVERIFY(QTest::qWaitForWindowExposed(view)); + QVERIFY(QTest::qWaitForWindowExposed(view.data())); for (int i = 0; i < children.count(); ++i) { QTRY_COMPARE(children[i]->layoutDirection(), layoutDirection); QTRY_COMPARE(children[i]->testAttribute(Qt::WA_SetLayoutDirection), false); view->repaint(); QTRY_COMPARE(children[i]->m_painterLayoutDirection, layoutDirection); } - delete view; } void tst_QGraphicsWidget::paint_data() @@ -1696,8 +1695,26 @@ void tst_QGraphicsWidget::verifyFocusChain() delete w; } { + // QTBUG-30923: + // Child QGraphicsWidget with tabFocusFirst gets removed & deleted should not crash. + // This case simulates what QtQuick1 does when you have QGraphicsObject based + // item in different qml views that are loaded one after another. + QGraphicsItem *parent1 = new QGraphicsRectItem(0); // root item + scene.addItem(parent1); + for (int i = 0; i < 2; i++) { + SubQGraphicsWidget *w1 = new SubQGraphicsWidget(parent1); + w1->setFocusPolicy(Qt::StrongFocus); + w1->setFocus(); + QVERIFY(w1->hasFocus()); + scene.removeItem(w1); + delete w1; + QApplication::processEvents(); + } + delete parent1; + } + { // remove the tabFocusFirst widget from the scene. - QWidget *window = new QWidget; + QScopedPointer<QWidget> window(new QWidget); QVBoxLayout *layout = new QVBoxLayout; window->setLayout(layout); QLineEdit *lineEdit = new QLineEdit; @@ -1717,8 +1734,8 @@ void tst_QGraphicsWidget::verifyFocusChain() w1_2->setFocusPolicy(Qt::StrongFocus); scene.addItem(w1_2); window->show(); - QApplication::setActiveWindow(window); - QVERIFY(QTest::qWaitForWindowActive(window)); + QApplication::setActiveWindow(window.data()); + QVERIFY(QTest::qWaitForWindowActive(window.data())); lineEdit->setFocus(); QTRY_VERIFY(lineEdit->hasFocus()); @@ -1758,7 +1775,6 @@ void tst_QGraphicsWidget::verifyFocusChain() QTest::keyPress(QApplication::focusWidget(), Qt::Key_Tab); QTRY_VERIFY(w1_3->hasFocus()); QTRY_VERIFY(compareFocusChain(view, QList<QGraphicsItem*>() << w1_3 << w1_4)); - delete window; } } @@ -2962,16 +2978,16 @@ void tst_QGraphicsWidget::respectHFW() QGraphicsScene scene; HFWWidget *window = new HFWWidget; scene.addItem(window); - QGraphicsView *view = new QGraphicsView(&scene); + QScopedPointer<QGraphicsView> view(new QGraphicsView(&scene)); view->resize(400, 400); view->setSceneRect(-100, -100, 300,300); view->show(); window->setGeometry(0, 0, 70, 70); - QVERIFY(QTest::qWaitForWindowActive(view)); + QVERIFY(QTest::qWaitForWindowActive(view.data())); { // here we go - simulate a interactive resize of the window - QTest::mouseMove(view, view->mapFromScene(71, 71)); // bottom right corner + QTest::mouseMove(view.data(), view->mapFromScene(71, 71)); // bottom right corner QTest::mousePress(view->viewport(), Qt::LeftButton, 0, view->mapFromScene(71, 71), 200); view->grabMouse(); @@ -3157,15 +3173,14 @@ void tst_QGraphicsWidget::initialShow2() QGraphicsScene dummyScene(0, 0, 200, 200); dummyScene.addItem(new QGraphicsRectItem(0, 0, 100, 100)); - QGraphicsView *dummyView = new QGraphicsView(&dummyScene); + QScopedPointer<QGraphicsView> dummyView(new QGraphicsView(&dummyScene)); dummyView->setWindowFlags(Qt::X11BypassWindowManagerHint); EventSpy paintSpy(dummyView->viewport(), QEvent::Paint); dummyView->show(); - qApp->setActiveWindow(dummyView); - QVERIFY(QTest::qWaitForWindowActive(dummyView)); + qApp->setActiveWindow(dummyView.data()); + QVERIFY(QTest::qWaitForWindowActive(dummyView.data())); const int expectedRepaintCount = paintSpy.count(); - delete dummyView; - dummyView = 0; + dummyView.reset(); MyGraphicsWidget *widget = new MyGraphicsWidget; widget->resize(100, 100); @@ -3179,7 +3194,7 @@ void tst_QGraphicsWidget::initialShow2() qApp->setActiveWindow(&view); QVERIFY(QTest::qWaitForWindowActive(&view)); -#if defined(Q_OS_WIN) || defined(UBUNTU_LUCID) +#ifdef UBUNTU_LUCID QEXPECT_FAIL("", "QTBUG-20778", Abort); #endif QTRY_COMPARE(widget->repaints, expectedRepaintCount); diff --git a/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp b/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp index d47eebe03a..538cc7bb4c 100644 --- a/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp +++ b/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp @@ -232,6 +232,8 @@ private slots: void enterKey_data(); void enterKey(); void comboBox(); + void testLineEditValidation_data(); + void testLineEditValidation(); void task257859_finalizeEdit(); void QTBUG4435_keepSelectionOnCheck(); @@ -1413,6 +1415,135 @@ void tst_QItemDelegate::comboBox() QCOMPARE(data.toBool(), false); } +void tst_QItemDelegate::testLineEditValidation_data() +{ + QTest::addColumn<int>("key"); + + QTest::newRow("enter") << int(Qt::Key_Enter); + QTest::newRow("return") << int(Qt::Key_Return); + QTest::newRow("tab") << int(Qt::Key_Tab); + QTest::newRow("backtab") << int(Qt::Key_Backtab); + QTest::newRow("escape") << int(Qt::Key_Escape); +} + +void tst_QItemDelegate::testLineEditValidation() +{ + QFETCH(int, key); + + struct TestDelegate : public QItemDelegate + { + virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const + { + Q_UNUSED(option); + Q_UNUSED(index); + + QLineEdit *editor = new QLineEdit(parent); + QRegularExpression re("\\w+,\\w+"); // two words separated by a comma + editor->setValidator(new QRegularExpressionValidator(re, editor)); + editor->setObjectName(QStringLiteral("TheEditor")); + return editor; + } + } delegate; + + QStandardItemModel model; + // need a couple of dummy items to test tab and back tab + model.appendRow(new QStandardItem(QStringLiteral("dummy"))); + QStandardItem *item = new QStandardItem(QStringLiteral("abc,def")); + model.appendRow(item); + model.appendRow(new QStandardItem(QStringLiteral("dummy"))); + + QListView view; + view.setModel(&model); + view.setItemDelegate(&delegate); + view.show(); + view.setFocus(); + QApplication::setActiveWindow(&view); + QVERIFY(QTest::qWaitForWindowActive(&view)); + + QList<QLineEdit *> lineEditors; + QPointer<QLineEdit> editor; + QPersistentModelIndex index = model.indexFromItem(item); + + view.setCurrentIndex(index); + view.edit(index); + QTest::qWait(30); + + lineEditors = view.findChildren<QLineEdit *>(QStringLiteral("TheEditor")); + QCOMPARE(lineEditors.count(), 1); + editor = lineEditors.at(0); + editor->clear(); + + // first try to set a valid text + QTest::keyClicks(editor, QStringLiteral("foo,bar")); + QTest::qWait(30); + + // close the editor + QTest::keyClick(editor, Qt::Key(key)); + QTest::qWait(30); + + QVERIFY(editor.isNull()); + if (key != Qt::Key_Escape) + QCOMPARE(item->data(Qt::DisplayRole).toString(), QStringLiteral("foo,bar")); + else + QCOMPARE(item->data(Qt::DisplayRole).toString(), QStringLiteral("abc,def")); + + // now an invalid (but partially matching) text + view.setCurrentIndex(index); + view.edit(index); + QTest::qWait(30); + + lineEditors = view.findChildren<QLineEdit *>(QStringLiteral("TheEditor")); + QCOMPARE(lineEditors.count(), 1); + editor = lineEditors.at(0); + editor->clear(); + + // edit + QTest::keyClicks(editor, QStringLiteral("foobar")); + QTest::qWait(30); + + // try to close the editor + QTest::keyClick(editor, Qt::Key(key)); + QTest::qWait(30); + + if (key != Qt::Key_Escape) { + QVERIFY(!editor.isNull()); + QCOMPARE(qApp->focusWidget(), editor.data()); + QCOMPARE(editor->text(), QStringLiteral("foobar")); + QCOMPARE(item->data(Qt::DisplayRole).toString(), QStringLiteral("foo,bar")); + } else { + QVERIFY(editor.isNull()); + QCOMPARE(item->data(Qt::DisplayRole).toString(), QStringLiteral("abc,def")); + } + + // reset the view to forcibly close the editor + view.reset(); + QTest::qWait(30); + + // set a valid text again + view.setCurrentIndex(index); + view.edit(index); + QTest::qWait(30); + + lineEditors = view.findChildren<QLineEdit *>(QStringLiteral("TheEditor")); + QCOMPARE(lineEditors.count(), 1); + editor = lineEditors.at(0); + editor->clear(); + + // set a valid text + QTest::keyClicks(editor, QStringLiteral("gender,bender")); + QTest::qWait(30); + + // close the editor + QTest::keyClick(editor, Qt::Key(key)); + QTest::qWait(30); + + QVERIFY(editor.isNull()); + if (key != Qt::Key_Escape) + QCOMPARE(item->data(Qt::DisplayRole).toString(), QStringLiteral("gender,bender")); + else + QCOMPARE(item->data(Qt::DisplayRole).toString(), QStringLiteral("abc,def")); +} + // ### _not_ covered: diff --git a/tests/auto/widgets/itemviews/qtableview/qtableview.pro b/tests/auto/widgets/itemviews/qtableview/qtableview.pro index 41016ff984..0814af77fb 100644 --- a/tests/auto/widgets/itemviews/qtableview/qtableview.pro +++ b/tests/auto/widgets/itemviews/qtableview/qtableview.pro @@ -1,5 +1,4 @@ CONFIG += testcase -CONFIG += parallel_test TARGET = tst_qtableview QT += widgets widgets-private testlib QT += core-private gui-private diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp index 25e1dc3fa0..fefa7333d1 100644 --- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp +++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp @@ -4010,10 +4010,6 @@ void tst_QWidget::update() QApplication::processEvents(); QApplication::processEvents(); - -#ifdef Q_OS_MAC - QEXPECT_FAIL(0, "Cocoa compositor says to paint this twice.", Continue); -#endif QTRY_COMPARE(w.numPaintEvents, 1); QCOMPARE(w.visibleRegion(), QRegion(w.rect())); diff --git a/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp b/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp index 6364a736cd..f5d92be95d 100644 --- a/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp +++ b/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp @@ -1705,6 +1705,11 @@ void tst_QMdiArea::tileSubWindows() subWindow->setMinimumSize(minSize); QCOMPARE(workspace.size(), QSize(350, 150)); + + // Prevent scrollbars from messing up the expected viewport calculation below + workspace.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + workspace.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + workspace.tileSubWindows(); // The sub-windows are now tiled like this: // | win 1 || win 2 || win 3 | @@ -1723,11 +1728,12 @@ void tst_QMdiArea::tileSubWindows() #ifdef Q_OS_WINCE QSKIP("Not fixed yet! See task 197453"); #endif -#ifdef Q_OS_MAC - QEXPECT_FAIL("", "QTBUG-25298", Abort); -#endif QTRY_COMPARE(workspace.viewport()->rect().size(), expectedViewportSize); + // Restore original scrollbar behavior for test below + workspace.setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); + workspace.setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + // Not enough space for all sub-windows to be visible -> provide scroll bars. workspace.resize(160, 150); qApp->processEvents(); diff --git a/tests/auto/widgets/widgets/qstackedwidget/qstackedwidget.pro b/tests/auto/widgets/widgets/qstackedwidget/qstackedwidget.pro index d016caf393..2e8b86f35a 100644 --- a/tests/auto/widgets/widgets/qstackedwidget/qstackedwidget.pro +++ b/tests/auto/widgets/widgets/qstackedwidget/qstackedwidget.pro @@ -3,7 +3,6 @@ ############################################################ CONFIG += testcase -CONFIG += parallel_test TARGET = tst_qstackedwidget QT += widgets testlib SOURCES += tst_qstackedwidget.cpp |