From eb4bcdd8cec77c558cc75d31730cff89852dd684 Mon Sep 17 00:00:00 2001 From: Alex Trotsenko Date: Thu, 4 Aug 2016 18:43:42 +0300 Subject: [PATCH 01/17] QNativeSocketEngine::option(): return a correct value on invalid call Instead of 'true', it should be '-1'. Change-Id: I5e8f99153da68d34b37477ef4cedbc447fba347f Reviewed-by: Thiago Macieira Reviewed-by: Edward Welbourne --- src/network/socket/qnativesocketengine_unix.cpp | 2 +- .../socket/platformsocketengine/tst_platformsocketengine.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp index 5dfc6480da1..1ce12edef13 100644 --- a/src/network/socket/qnativesocketengine_unix.cpp +++ b/src/network/socket/qnativesocketengine_unix.cpp @@ -307,7 +307,7 @@ int QNativeSocketEnginePrivate::option(QNativeSocketEngine::SocketOption opt) co // handle non-getsockopt cases first if (opt == QNativeSocketEngine::BindExclusively || opt == QNativeSocketEngine::NonBlockingSocketOption || opt == QNativeSocketEngine::BroadcastSocketOption) - return true; + return -1; int n, level; int v = -1; diff --git a/tests/auto/network/socket/platformsocketengine/tst_platformsocketengine.cpp b/tests/auto/network/socket/platformsocketengine/tst_platformsocketengine.cpp index 71125f463ac..ba7659a8a71 100644 --- a/tests/auto/network/socket/platformsocketengine/tst_platformsocketengine.cpp +++ b/tests/auto/network/socket/platformsocketengine/tst_platformsocketengine.cpp @@ -139,6 +139,7 @@ void tst_PlatformSocketEngine::construction() QCOMPARE(socketDevice.peerAddress(), QHostAddress()); QCOMPARE(socketDevice.peerPort(), quint16(0)); QCOMPARE(socketDevice.error(), QAbstractSocket::UnknownSocketError); + QCOMPARE(socketDevice.option(QNativeSocketEngine::NonBlockingSocketOption), -1); QTest::ignoreMessage(QtWarningMsg, PLATFORMSOCKETENGINESTRING "::bytesAvailable() was called in QAbstractSocket::UnconnectedState"); QCOMPARE(socketDevice.bytesAvailable(), -1); From 434c52269564c84e3ea57242b7aaa2fd7cad3f54 Mon Sep 17 00:00:00 2001 From: David Faure Date: Thu, 4 Aug 2016 10:01:21 +0200 Subject: [PATCH 02/17] Improve performance of QColor::name, now more than 4 times faster Before: HexRgb: 0.00230 ms per iteration, HexArgb: 0.00290 ms per iteration After: HexRgb: 0.00051 ms per iteration, HexArgb: 0.00061 ms per iteration This showed up as a relevant optimization when profiling KIconLoader which uses QColor::name() as part of the key -- thanks to Mark Gaiser for the investigation and first suggestion of a solution. I have also seen customer code writing a replacement for QColor::name() because it was too slow to be used as a hash key. Change-Id: I009ccdd712ea0d869d466e2c9894e0cea58f0e68 Reviewed-by: Marc Mutz --- src/gui/painting/qcolor.cpp | 5 +- tests/auto/gui/painting/qcolor/tst_qcolor.cpp | 2 + tests/benchmarks/gui/painting/painting.pro | 1 + .../benchmarks/gui/painting/qcolor/qcolor.pro | 7 ++ .../gui/painting/qcolor/tst_qcolor.cpp | 67 +++++++++++++++++++ 5 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 tests/benchmarks/gui/painting/qcolor/qcolor.pro create mode 100644 tests/benchmarks/gui/painting/qcolor/tst_qcolor.cpp diff --git a/src/gui/painting/qcolor.cpp b/src/gui/painting/qcolor.cpp index 3f30c061dc1..d0a60f37041 100644 --- a/src/gui/painting/qcolor.cpp +++ b/src/gui/painting/qcolor.cpp @@ -521,9 +521,10 @@ QString QColor::name(NameFormat format) const { switch (format) { case HexRgb: - return QString::asprintf("#%02x%02x%02x", red(), green(), blue()); + return QLatin1Char('#') + QString::number(rgba() | 0x1000000, 16).rightRef(6); case HexArgb: - return QString::asprintf("#%02x%02x%02x%02x", alpha(), red(), green(), blue()); + // it's called rgba() but it does return AARRGGBB + return QLatin1Char('#') + QString::number(rgba() | 0x100000000, 16).rightRef(8); } return QString(); } diff --git a/tests/auto/gui/painting/qcolor/tst_qcolor.cpp b/tests/auto/gui/painting/qcolor/tst_qcolor.cpp index b81a4e2c4cc..289b06fc62f 100644 --- a/tests/auto/gui/painting/qcolor/tst_qcolor.cpp +++ b/tests/auto/gui/painting/qcolor/tst_qcolor.cpp @@ -284,6 +284,8 @@ void tst_QColor::name_data() QTest::newRow("global color darkMagenta") << QColor(Qt::darkMagenta) << "#800080" << QColor::HexRgb; QTest::newRow("global color darkYellow") << QColor(Qt::darkYellow) << "#808000" << QColor::HexRgb; QTest::newRow("transparent red") << QColor(255, 0, 0, 102) << "#66ff0000" << QColor::HexArgb; + QTest::newRow("fully_transparent_green_rgb") << QColor(0, 0, 255, 0) << "#0000ff" << QColor::HexRgb; + QTest::newRow("fully_transparent_green_argb") << QColor(0, 0, 255, 0) << "#000000ff" << QColor::HexArgb; } void tst_QColor::name() diff --git a/tests/benchmarks/gui/painting/painting.pro b/tests/benchmarks/gui/painting/painting.pro index 0eb7fa92a72..cdcfc9b3188 100644 --- a/tests/benchmarks/gui/painting/painting.pro +++ b/tests/benchmarks/gui/painting/painting.pro @@ -1,5 +1,6 @@ TEMPLATE = subdirs SUBDIRS = \ + qcolor \ qpainter \ qregion \ qtransform \ diff --git a/tests/benchmarks/gui/painting/qcolor/qcolor.pro b/tests/benchmarks/gui/painting/qcolor/qcolor.pro new file mode 100644 index 00000000000..5ceb7023234 --- /dev/null +++ b/tests/benchmarks/gui/painting/qcolor/qcolor.pro @@ -0,0 +1,7 @@ +QT += testlib +QT += gui-private + +TEMPLATE = app +TARGET = tst_bench_qcolor + +SOURCES += tst_qcolor.cpp diff --git a/tests/benchmarks/gui/painting/qcolor/tst_qcolor.cpp b/tests/benchmarks/gui/painting/qcolor/tst_qcolor.cpp new file mode 100644 index 00000000000..b67fa450d79 --- /dev/null +++ b/tests/benchmarks/gui/painting/qcolor/tst_qcolor.cpp @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + + +class tst_QColor : public QObject +{ + Q_OBJECT + +private slots: + void nameRgb(); + void nameArgb(); +}; + +void tst_QColor::nameRgb() +{ + QColor color(128, 255, 10); + QCOMPARE(color.name(), QStringLiteral("#80ff0a")); + QBENCHMARK { + color.name(); + } +} + +void tst_QColor::nameArgb() +{ + QColor color(128, 255, 0, 102); + QCOMPARE(color.name(QColor::HexArgb), QStringLiteral("#6680ff00")); + QBENCHMARK { + color.name(QColor::HexArgb); + } +} + +QTEST_MAIN(tst_QColor) + +#include "tst_qcolor.moc" From 4cb44c744c7d15658df79b801296b98fdc956336 Mon Sep 17 00:00:00 2001 From: Jesus Fernandez Date: Thu, 4 Aug 2016 17:01:37 +0200 Subject: [PATCH 03/17] Added pointer check in QFontDatabase::load CID 11131 (#1 of 1): Dereference after null check (FORWARD_NULL)46. var_deref_op: Dereferencing null pointer fe. Change-Id: Ifc0cd0b208db511516db93c3d0e0367299df6d80 Reviewed-by: Timur Pocheptsov Reviewed-by: Konstantin Ritt --- src/gui/text/qfontdatabase.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp index 7b88a73c61c..074d9707f16 100644 --- a/src/gui/text/qfontdatabase.cpp +++ b/src/gui/text/qfontdatabase.cpp @@ -2799,6 +2799,7 @@ void QFontDatabase::load(const QFontPrivate *d, int script) req.fallBackFamilies.clear(); } + Q_ASSERT(fe); if (fe->symbol || (d->request.styleStrategy & QFont::NoFontMerging)) { for (int i = 0; i < QChar::ScriptCount; ++i) { if (!d->engineData->engines[i]) { From 1ceee31ae0f552d128fa77be79c9be135f9c6972 Mon Sep 17 00:00:00 2001 From: Alex Trotsenko Date: Wed, 3 Aug 2016 20:20:54 +0300 Subject: [PATCH 04/17] Fix tst_QProcess::closeWriteChannel() under Windows Sometimes, this test fails in CI due to notifications arriving asynchronously from the OS. This happens inside closeWriteChannel() call, where we are flushing the write buffer and I/O completion on the read pipe could occur there as well. So, take this into account before waiting for the new incoming data. Also, improve the checks on successful reading and writing. Change-Id: Iabe875fc346eb4420c72d03208d22ea861a570c6 Reviewed-by: Edward Welbourne --- tests/auto/corelib/io/qprocess/tst_qprocess.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp index 7e1d5487ba5..3c4bc79cdee 100644 --- a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp +++ b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp @@ -764,6 +764,7 @@ void tst_QProcess::restartProcess() // Reading and writing to a process is not supported on Qt/CE void tst_QProcess::closeWriteChannel() { + QByteArray testData("Data to read"); QProcess more; more.start("testProcessEOF/testProcessEOF"); @@ -771,19 +772,21 @@ void tst_QProcess::closeWriteChannel() QVERIFY(!more.waitForReadyRead(250)); QCOMPARE(more.error(), QProcess::Timedout); - QVERIFY(more.write("Data to read") != -1); + QCOMPARE(more.write(testData), qint64(testData.size())); QVERIFY(!more.waitForReadyRead(250)); QCOMPARE(more.error(), QProcess::Timedout); more.closeWriteChannel(); - - QVERIFY(more.waitForReadyRead(5000)); - QVERIFY(more.readAll().startsWith("Data to read")); + // During closeWriteChannel() call, we might also get an I/O completion + // on the read pipe. So, take this into account before waiting for + // the new incoming data. + while (more.bytesAvailable() < testData.size()) + QVERIFY(more.waitForReadyRead(5000)); + QCOMPARE(more.readAll(), testData); if (more.state() == QProcess::Running) - more.write("q"); - QVERIFY(more.waitForFinished(5000)); + QVERIFY(more.waitForFinished(5000)); QCOMPARE(more.exitStatus(), QProcess::NormalExit); QCOMPARE(more.exitCode(), 0); } From b92f5a0f3bba5d75ae59db2dbc203e577382fac3 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Wed, 3 Aug 2016 16:20:50 +0200 Subject: [PATCH 05/17] Remove hiding of .main div in offline pages The section got introduced in commit 93d35c07d06fcc, but is ignored by browsers so far due to a non-blank space (0xc2 0xa0). Task-number: QTBUG-55115 Change-Id: Ie0668b89c7151c934f40e033100a544011a583d8 Reviewed-by: Allan Sandfeld Jensen --- doc/global/template/style/offline.css | 3 --- 1 file changed, 3 deletions(-) diff --git a/doc/global/template/style/offline.css b/doc/global/template/style/offline.css index 1c5a2dfa615..612c1087d58 100644 --- a/doc/global/template/style/offline.css +++ b/doc/global/template/style/offline.css @@ -47,9 +47,6 @@ tt { text-align: left } -.main { - display: none; -} /* ----------- links From ceabcc01425664651df08bfa9f148e541287f753 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Tue, 12 Apr 2016 15:47:55 +0200 Subject: [PATCH 06/17] tst_QString: unit test for broken toLocal8bit() error-handling We can't (at present) actually exercise the failure in QWindowsLocalCodec::convertFromUnicode() that prompted us to consider the possible failure here, but we should at least test for it. Change-Id: I5066c88d7b4caeb48aebc6b79c355fa49e1c581c Reviewed-by: Frederic Marchal Reviewed-by: Thiago Macieira --- .../corelib/tools/qstring/tst_qstring.cpp | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/tests/auto/corelib/tools/qstring/tst_qstring.cpp b/tests/auto/corelib/tools/qstring/tst_qstring.cpp index db4c33afde5..bfcb20231b0 100644 --- a/tests/auto/corelib/tools/qstring/tst_qstring.cpp +++ b/tests/auto/corelib/tools/qstring/tst_qstring.cpp @@ -503,6 +503,8 @@ private slots: void fromLocal8Bit(); void local8Bit_data(); void local8Bit(); + void invalidToLocal8Bit_data(); + void invalidToLocal8Bit(); void nullFromLocal8Bit(); void fromLatin1Roundtrip_data(); void fromLatin1Roundtrip(); @@ -4277,6 +4279,66 @@ void tst_QString::local8Bit() QCOMPARE(local8Bit.toLocal8Bit(), QByteArray(result)); } +void tst_QString::invalidToLocal8Bit_data() +{ + QTest::addColumn("unicode"); + QTest::addColumn("expect"); // Initial validly-converted prefix + + { + const QChar malformed[] = { 'A', 0xd800, 'B', 0 }; + const char expected[] = "A"; + QTest::newRow("LoneHighSurrogate") + << QString(malformed, sizeof(malformed) / sizeof(QChar)) + // Don't include the terminating '\0' of expected: + << QByteArray(expected, sizeof(expected) / sizeof(char) - 1); + } + { + const QChar malformed[] = { 'A', 0xdc00, 'B', 0 }; + const char expected[] = "A"; + QTest::newRow("LoneLowSurrogate") + << QString(malformed, sizeof(malformed) / sizeof(QChar)) + << QByteArray(expected, sizeof(expected) / sizeof(char) - 1); + } + { + const QChar malformed[] = { 'A', 0xd800, 0xd801, 'B', 0 }; + const char expected[] = "A"; + QTest::newRow("DoubleHighSurrogate") + << QString(malformed, sizeof(malformed) / sizeof(QChar)) + << QByteArray(expected, sizeof(expected) / sizeof(char) - 1); + } + { + const QChar malformed[] = { 'A', 0xdc00, 0xdc01, 'B', 0 }; + const char expected[] = "A"; + QTest::newRow("DoubleLowSurrogate") + << QString(malformed, sizeof(malformed) / sizeof(QChar)) + << QByteArray(expected, sizeof(expected) / sizeof(char) - 1); + } + { + const QChar malformed[] = { 'A', 0xdc00, 0xd800, 'B', 0 }; + const char expected[] = "A"; + QTest::newRow("ReversedSurrogates") // low before high + << QString(malformed, sizeof(malformed) / sizeof(QChar)) + << QByteArray(expected, sizeof(expected) / sizeof(char) - 1); + } +} + +void tst_QString::invalidToLocal8Bit() +{ + QFETCH(QString, unicode); + QFETCH(QByteArray, expect); + QByteArray local = unicode.toLocal8Bit(); + /* + The main concern of this test is to check that any error-reporting that + toLocal8Bit() prompts on failure isn't dependent on outputting the data + it's converting via toLocal8Bit(), which would be apt to recurse. So the + real purpose of this QVERIFY(), for all that we should indeed check we get + the borked output that matches what we can reliably expect (despite + variation in how codecs respond to errors), is to verify that we got here + - i.e. we didn't crash in such a recursive stack over-flow. + */ + QVERIFY(local.startsWith(expect)); +} + void tst_QString::nullFromLocal8Bit() { QString a; From 4e6440acf8e09abbb2b2aa208f0241416154e090 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Wed, 4 May 2016 15:21:17 +0200 Subject: [PATCH 07/17] Improve reliability of callgrind benchmark results When running under callgrind, do not bother with the use of the watchdog. The constructor waits for the thread to start, which adds an overall run-time cost that depends on the OS scheduling. Change-Id: I162e2e311c43a6892ebc67dea39899e40babb61d Reviewed-by: Robin Burchell --- src/testlib/qtestcase.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp index d674b0af7ab..fe680e19aa0 100644 --- a/src/testlib/qtestcase.cpp +++ b/src/testlib/qtestcase.cpp @@ -2548,8 +2548,13 @@ static void qInvokeTestMethods(QObject *testObject) invokeMethod(testObject, "initTestCase_data()"); QScopedPointer watchDog; - if (!debuggerPresent()) + if (!debuggerPresent() +#ifdef QTESTLIB_USE_VALGRIND + && QBenchmarkGlobalData::current->mode() != QBenchmarkGlobalData::CallgrindChildProcess +#endif + ) { watchDog.reset(new WatchDog); + } if (!QTestResult::skipCurrentTest() && !QTest::currentTestFailed()) { invokeMethod(testObject, "initTestCase()"); From 131b7c8f6467abe07143099aa8b85e594bb9111b Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Thu, 28 Jul 2016 08:41:05 +0200 Subject: [PATCH 08/17] Fix permissions on lock files on Unix We should create the files with 0666 and let the umask take care of adjusting to the final permissions in the file system. [ChangeLog][QtCore][QLockFile] Fixed permissions on lock files on Unix to allow for adjustments via umask. Change-Id: Iee6a6ac3920d0ffd4465f54ac6e955f7fe087173 Reviewed-by: Denis Shienkov Reviewed-by: Edward Welbourne Reviewed-by: Thiago Macieira Reviewed-by: David Faure --- src/corelib/io/qlockfile_unix.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/corelib/io/qlockfile_unix.cpp b/src/corelib/io/qlockfile_unix.cpp index 57c689ac819..7bef253e591 100644 --- a/src/corelib/io/qlockfile_unix.cpp +++ b/src/corelib/io/qlockfile_unix.cpp @@ -176,7 +176,7 @@ QLockFile::LockError QLockFilePrivate::tryLock_sys() % localHostName() % '\n'; const QByteArray lockFileName = QFile::encodeName(fileName); - const int fd = qt_safe_open(lockFileName.constData(), O_WRONLY | O_CREAT | O_EXCL, 0644); + const int fd = qt_safe_open(lockFileName.constData(), O_WRONLY | O_CREAT | O_EXCL, 0666); if (fd < 0) { switch (errno) { case EEXIST: @@ -217,7 +217,7 @@ QLockFile::LockError QLockFilePrivate::tryLock_sys() bool QLockFilePrivate::removeStaleLock() { const QByteArray lockFileName = QFile::encodeName(fileName); - const int fd = qt_safe_open(lockFileName.constData(), O_WRONLY, 0644); + const int fd = qt_safe_open(lockFileName.constData(), O_WRONLY, 0666); if (fd < 0) // gone already? return false; bool success = setNativeLocks(fileName, fd) && (::unlink(lockFileName) == 0); From 874852d62504f70c148ddf77c9a6f17c37aeee9c Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Sat, 6 Aug 2016 19:24:48 +0200 Subject: [PATCH 09/17] QMap: remove statement about STL support during Qt's own configuration Since STL support is mandatory in Qt 5, the sentence is a tautology and can be removed. Change-Id: I8676368cc917aa00a85b1113ed2a47694427b2ce Reviewed-by: Marc Mutz --- src/corelib/tools/qmap.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/corelib/tools/qmap.cpp b/src/corelib/tools/qmap.cpp index 27ae07441e3..ec54b138f29 100644 --- a/src/corelib/tools/qmap.cpp +++ b/src/corelib/tools/qmap.cpp @@ -533,9 +533,6 @@ void QMapDataBase::freeData(QMapDataBase *d) Constructs a copy of \a other. - This function is only available if Qt is configured with STL - compatibility enabled. - \sa toStdMap() */ @@ -552,9 +549,6 @@ void QMapDataBase::freeData(QMapDataBase *d) /*! \fn std::map QMap::toStdMap() const Returns an STL map equivalent to this QMap. - - This function is only available if Qt is configured with STL - compatibility enabled. */ /*! \fn QMap::~QMap() From 385ab06fb1d99322872dc84f0e077886a917b9a7 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 29 Jul 2016 12:28:07 +0200 Subject: [PATCH 10/17] Always generate size hint for spacer items Task-number: QTBUG-55008 Change-Id: I53c86b64aa3c0a3e5f80551baefe775c2d4b1e90 Reviewed-by: Friedemann Kleint --- src/tools/uic/cpp/cppwriteinitialization.cpp | 6 +++++- tests/auto/tools/uic/baseline/imagedialog.ui.h | 4 ++-- tests/auto/tools/uic/baseline/newdynamicpropertydialog.ui.h | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/tools/uic/cpp/cppwriteinitialization.cpp b/src/tools/uic/cpp/cppwriteinitialization.cpp index e0d4bea5b96..518944d9d79 100644 --- a/src/tools/uic/cpp/cppwriteinitialization.cpp +++ b/src/tools/uic/cpp/cppwriteinitialization.cpp @@ -89,10 +89,14 @@ namespace { const QHash properties = propertyMap(node->elementProperty()); output << "new QSpacerItem("; + int w = 0; + int h = 0; if (properties.contains(QLatin1String("sizeHint"))) { const DomSize *sizeHint = properties.value(QLatin1String("sizeHint"))->elementSize(); - output << sizeHint->elementWidth() << ", " << sizeHint->elementHeight() << ", "; + w = sizeHint->elementWidth(); + h = sizeHint->elementHeight(); } + output << w << ", " << h << ", "; // size type QString sizeType = properties.contains(QLatin1String("sizeType")) ? diff --git a/tests/auto/tools/uic/baseline/imagedialog.ui.h b/tests/auto/tools/uic/baseline/imagedialog.ui.h index c02c40c2c1e..99e853b7a82 100644 --- a/tests/auto/tools/uic/baseline/imagedialog.ui.h +++ b/tests/auto/tools/uic/baseline/imagedialog.ui.h @@ -155,7 +155,7 @@ public: vboxLayout->addLayout(gridLayout); - spacerItem = new QSpacerItem(QSizePolicy::Minimum, QSizePolicy::Expanding); + spacerItem = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding); vboxLayout->addItem(spacerItem); @@ -166,7 +166,7 @@ public: hboxLayout->setContentsMargins(1, 1, 1, 1); hboxLayout->setObjectName(QStringLiteral("hboxLayout")); hboxLayout->setObjectName(QStringLiteral("")); - spacerItem1 = new QSpacerItem(QSizePolicy::Expanding, QSizePolicy::Minimum); + spacerItem1 = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum); hboxLayout->addItem(spacerItem1); diff --git a/tests/auto/tools/uic/baseline/newdynamicpropertydialog.ui.h b/tests/auto/tools/uic/baseline/newdynamicpropertydialog.ui.h index ca7bd253a86..3c4e0ba09eb 100644 --- a/tests/auto/tools/uic/baseline/newdynamicpropertydialog.ui.h +++ b/tests/auto/tools/uic/baseline/newdynamicpropertydialog.ui.h @@ -91,7 +91,7 @@ public: verticalLayout->addLayout(formLayout); - spacerItem = new QSpacerItem(QSizePolicy::Minimum, QSizePolicy::Expanding); + spacerItem = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding); verticalLayout->addItem(spacerItem); From db79b89899e6537d540e290beaed263c46e3a885 Mon Sep 17 00:00:00 2001 From: Maurice Kalinowski Date: Tue, 5 Jul 2016 09:34:13 +0200 Subject: [PATCH 11/17] winrt: support fullscreen mode Enable switching application to fullscreen mode. This is mostly required for desktop targets of WinRT. Task-number: QTBUG-54517 Change-Id: I67e4020bc2ec8da86d94815e5765959f4ae2b63f Reviewed-by: Oliver Wolff --- src/plugins/platforms/winrt/qwinrtwindow.cpp | 51 +++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/src/plugins/platforms/winrt/qwinrtwindow.cpp b/src/plugins/platforms/winrt/qwinrtwindow.cpp index 75b43205b7b..3bd0cd3ad73 100644 --- a/src/plugins/platforms/winrt/qwinrtwindow.cpp +++ b/src/plugins/platforms/winrt/qwinrtwindow.cpp @@ -320,10 +320,59 @@ void QWinRTWindow::setWindowState(Qt::WindowState state) if (d->state == state) return; +#if _MSC_VER >= 1900 + if (state == Qt::WindowFullScreen) { + HRESULT hr; + boolean success; + hr = QEventDispatcherWinRT::runOnXamlThread([&hr, &success]() { + ComPtr applicationViewStatics; + hr = RoGetActivationFactory(HString::MakeReference(RuntimeClass_Windows_UI_ViewManagement_ApplicationView).Get(), + IID_PPV_ARGS(&applicationViewStatics)); + RETURN_HR_IF_FAILED("Could not access application view statics."); + ComPtr view; + hr = applicationViewStatics->GetForCurrentView(&view); + RETURN_HR_IF_FAILED("Could not access application view."); + ComPtr view3; + hr = view.As(&view3); + Q_ASSERT_SUCCEEDED(hr); + hr = view3->TryEnterFullScreenMode(&success); + return hr; + }); + if (FAILED(hr) || !success) { + qCDebug(lcQpaWindows) << "Failed to enter full screen mode."; + return; + } + d->state = state; + return; + } + + if (d->state == Qt::WindowFullScreen) { + HRESULT hr; + hr = QEventDispatcherWinRT::runOnXamlThread([&hr]() { + ComPtr applicationViewStatics; + hr = RoGetActivationFactory(HString::MakeReference(RuntimeClass_Windows_UI_ViewManagement_ApplicationView).Get(), + IID_PPV_ARGS(&applicationViewStatics)); + RETURN_HR_IF_FAILED("Could not access application view statics."); + ComPtr view; + hr = applicationViewStatics->GetForCurrentView(&view); + RETURN_HR_IF_FAILED("Could not access application view."); + ComPtr view3; + hr = view.As(&view3); + Q_ASSERT_SUCCEEDED(hr); + hr = view3->ExitFullScreenMode(); + return hr; + }); + if (FAILED(hr)) { + qCDebug(lcQpaWindows) << "Failed to exit full screen mode."; + return; + } + } +#endif // _MSC_VER >= 1900 + if (state == Qt::WindowMinimized) setUIElementVisibility(d->uiElement.Get(), false); - if (d->state == Qt::WindowMinimized) + if (d->state == Qt::WindowMinimized || state == Qt::WindowNoState || state == Qt::WindowActive) setUIElementVisibility(d->uiElement.Get(), true); d->state = state; From 8ebe8ae35ee7556de0749bc27737ced7c61f5153 Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Fri, 5 Aug 2016 16:12:00 -0700 Subject: [PATCH 12/17] HiDPI Drag and Drop: Properly render the default image on Mac MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is only when the attached MIME data contains text, and we fall back to rendering that text into a pixmap. It requires getting the device pixel ratio from the source which, for now, may be a QWidget or a QWindow. Other cases may exist, but that would bring more dependencies than desired. Similarly, it fixes the draggabletext example. Other examples would require either to get updated pixmaps or change substantially in order to support HiDPI (e.g., the fridgemagnets example). Change-Id: I66198214233e3e06c87505744e2aaa9691fe1bb6 Reviewed-by: Filipe Azevedo Reviewed-by: Timur Pocheptsov Reviewed-by: Morten Johan Sørvig --- .../draganddrop/draggabletext/dragwidget.cpp | 4 +++- src/plugins/platforms/cocoa/qcocoadrag.mm | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/examples/widgets/draganddrop/draggabletext/dragwidget.cpp b/examples/widgets/draganddrop/draggabletext/dragwidget.cpp index 36c4df2e438..77262e5b291 100644 --- a/examples/widgets/draganddrop/draggabletext/dragwidget.cpp +++ b/examples/widgets/draganddrop/draggabletext/dragwidget.cpp @@ -150,7 +150,9 @@ void DragWidget::mousePressEvent(QMouseEvent *event) mimeData->setData(hotSpotMimeDataKey(), QByteArray::number(hotSpot.x()) + ' ' + QByteArray::number(hotSpot.y())); - QPixmap pixmap(child->size()); + qreal dpr = window()->windowHandle()->devicePixelRatio(); + QPixmap pixmap(child->size() * dpr); + pixmap.setDevicePixelRatio(dpr); child->render(&pixmap); QDrag *drag = new QDrag(this); diff --git a/src/plugins/platforms/cocoa/qcocoadrag.mm b/src/plugins/platforms/cocoa/qcocoadrag.mm index 80006ae9b85..1e9c355788f 100644 --- a/src/plugins/platforms/cocoa/qcocoadrag.mm +++ b/src/plugins/platforms/cocoa/qcocoadrag.mm @@ -34,6 +34,9 @@ #include "qcocoadrag.h" #include "qmacclipboard.h" #include "qcocoahelpers.h" +#ifndef QT_NO_WIDGETS +#include +#endif QT_BEGIN_NAMESPACE @@ -181,7 +184,18 @@ QPixmap QCocoaDrag::dragPixmap(QDrag *drag, QPoint &hotSpot) const const int width = fm.width(s); const int height = fm.height(); if (width > 0 && height > 0) { - pm = QPixmap(width, height); + qreal dpr = 1.0; + if (const QWindow *sourceWindow = qobject_cast(drag->source())) { + dpr = sourceWindow->devicePixelRatio(); + } +#ifndef QT_NO_WIDGETS + else if (const QWidget *sourceWidget = qobject_cast(drag->source())) { + if (const QWindow *sourceWindow = sourceWidget->window()->windowHandle()) + dpr = sourceWindow->devicePixelRatio(); + } +#endif + pm = QPixmap(width * dpr, height * dpr); + pm.setDevicePixelRatio(dpr); QPainter p(&pm); p.fillRect(0, 0, pm.width(), pm.height(), Qt::color0); p.setPen(Qt::color1); From 89d7c904e5f7c0cd230e59a4cd8b2ee2a1cbcac1 Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Fri, 20 May 2016 10:47:37 -0700 Subject: [PATCH 13/17] QTabBar: Cache title text sizes The first part adds QTabBarPrivate::initBasicStyleOption() which is basically QTabBar::initStyleOption() but without the expensive QFontMetrics::elidedText() call. That is because QTabBar::tabSizeHint() would call initStyleOption() and then immediately discard the result of that computation. Then, QTabBar::tabSizeHint() is modified to cache the calls to QFontMetrics::size(), which is also expensive. The cache is invalidated when the style or the font changes, or when the elide mode is set. Change-Id: I591b2e401af3576a2ebabc5b94f19ae157e28cf2 Reviewed-by: Friedemann Kleint Reviewed-by: Wayne Arnold Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/widgets/widgets/qtabbar.cpp | 87 +++++++++++++++++++++------------ src/widgets/widgets/qtabbar_p.h | 3 ++ 2 files changed, 58 insertions(+), 32 deletions(-) diff --git a/src/widgets/widgets/qtabbar.cpp b/src/widgets/widgets/qtabbar.cpp index 87fb3357d6c..fc27654addf 100644 --- a/src/widgets/widgets/qtabbar.cpp +++ b/src/widgets/widgets/qtabbar.cpp @@ -134,60 +134,59 @@ void QTabBarPrivate::updateMacBorderMetrics() } /*! - Initialize \a option with the values from the tab at \a tabIndex. This method - is useful for subclasses when they need a QStyleOptionTab, - but don't want to fill in all the information themselves. - - \sa QStyleOption::initFrom(), QTabWidget::initStyleOption() + \internal + This is basically QTabBar::initStyleOption() but + without the expensive QFontMetrics::elidedText() call. */ -void QTabBar::initStyleOption(QStyleOptionTab *option, int tabIndex) const + +void QTabBarPrivate::initBasicStyleOption(QStyleOptionTab *option, int tabIndex) const { - Q_D(const QTabBar); - int totalTabs = d->tabList.size(); + Q_Q(const QTabBar); + const int totalTabs = tabList.size(); if (!option || (tabIndex < 0 || tabIndex >= totalTabs)) return; - const QTabBarPrivate::Tab &tab = d->tabList.at(tabIndex); - option->initFrom(this); + const QTabBarPrivate::Tab &tab = tabList.at(tabIndex); + option->initFrom(q); option->state &= ~(QStyle::State_HasFocus | QStyle::State_MouseOver); - option->rect = tabRect(tabIndex); - bool isCurrent = tabIndex == d->currentIndex; + option->rect = q->tabRect(tabIndex); + const bool isCurrent = tabIndex == currentIndex; option->row = 0; - if (tabIndex == d->pressedIndex) + if (tabIndex == pressedIndex) option->state |= QStyle::State_Sunken; if (isCurrent) option->state |= QStyle::State_Selected; - if (isCurrent && hasFocus()) + if (isCurrent && q->hasFocus()) option->state |= QStyle::State_HasFocus; if (!tab.enabled) option->state &= ~QStyle::State_Enabled; - if (isActiveWindow()) + if (q->isActiveWindow()) option->state |= QStyle::State_Active; - if (!d->dragInProgress && option->rect == d->hoverRect) + if (!dragInProgress && option->rect == hoverRect) option->state |= QStyle::State_MouseOver; - option->shape = d->shape; + option->shape = shape; option->text = tab.text; if (tab.textColor.isValid()) - option->palette.setColor(foregroundRole(), tab.textColor); + option->palette.setColor(q->foregroundRole(), tab.textColor); option->icon = tab.icon; - option->iconSize = iconSize(); // Will get the default value then. + option->iconSize = q->iconSize(); // Will get the default value then. option->leftButtonSize = tab.leftWidget ? tab.leftWidget->size() : QSize(); option->rightButtonSize = tab.rightWidget ? tab.rightWidget->size() : QSize(); - option->documentMode = d->documentMode; + option->documentMode = documentMode; - if (tabIndex > 0 && tabIndex - 1 == d->currentIndex) + if (tabIndex > 0 && tabIndex - 1 == currentIndex) option->selectedPosition = QStyleOptionTab::PreviousIsSelected; - else if (tabIndex + 1 < totalTabs && tabIndex + 1 == d->currentIndex) + else if (tabIndex + 1 < totalTabs && tabIndex + 1 == currentIndex) option->selectedPosition = QStyleOptionTab::NextIsSelected; else option->selectedPosition = QStyleOptionTab::NotAdjacent; - bool paintBeginning = (tabIndex == 0) || (d->dragInProgress && tabIndex == d->pressedIndex + 1); - bool paintEnd = (tabIndex == totalTabs - 1) || (d->dragInProgress && tabIndex == d->pressedIndex - 1); + const bool paintBeginning = (tabIndex == 0) || (dragInProgress && tabIndex == pressedIndex + 1); + const bool paintEnd = (tabIndex == totalTabs - 1) || (dragInProgress && tabIndex == pressedIndex - 1); if (paintBeginning) { if (paintEnd) option->position = QStyleOptionTab::OnlyOneTab; @@ -200,7 +199,7 @@ void QTabBar::initStyleOption(QStyleOptionTab *option, int tabIndex) const } #ifndef QT_NO_TABWIDGET - if (const QTabWidget *tw = qobject_cast(parentWidget())) { + if (const QTabWidget *tw = qobject_cast(q->parentWidget())) { option->features |= QStyleOptionTab::HasFrame; if (tw->cornerWidget(Qt::TopLeftCorner) || tw->cornerWidget(Qt::BottomLeftCorner)) option->cornerWidgets |= QStyleOptionTab::LeftCornerWidget; @@ -208,6 +207,19 @@ void QTabBar::initStyleOption(QStyleOptionTab *option, int tabIndex) const option->cornerWidgets |= QStyleOptionTab::RightCornerWidget; } #endif +} + +/*! + Initialize \a option with the values from the tab at \a tabIndex. This method + is useful for subclasses when they need a QStyleOptionTab, + but don't want to fill in all the information themselves. + + \sa QStyleOption::initFrom(), QTabWidget::initStyleOption() +*/ +void QTabBar::initStyleOption(QStyleOptionTab *option, int tabIndex) const +{ + Q_D(const QTabBar); + d->initBasicStyleOption(option, tabIndex); QRect textRect = style()->subElementRect(QStyle::SE_TabBarTabText, option, this); option->text = fontMetrics().elidedText(option->text, d->elideMode, textRect.width(), @@ -1020,6 +1032,7 @@ void QTabBar::setTabText(int index, const QString &text) { Q_D(QTabBar); if (QTabBarPrivate::Tab *tab = d->at(index)) { + d->textSizes.remove(tab->text); tab->text = text; #ifndef QT_NO_SHORTCUT releaseShortcut(tab->shortcutId); @@ -1379,7 +1392,7 @@ QSize QTabBar::tabSizeHint(int index) const Q_D(const QTabBar); if (const QTabBarPrivate::Tab *tab = d->at(index)) { QStyleOptionTab opt; - initStyleOption(&opt, index); + d->initBasicStyleOption(&opt, index); opt.text = d->tabList.at(index).text; QSize iconSize = tab->icon.isNull() ? QSize(0, 0) : opt.iconSize; int hframe = style()->pixelMetric(QStyle::PM_TabBarTabHSpace, &opt, this); @@ -1405,13 +1418,16 @@ QSize QTabBar::tabSizeHint(int index) const if (!opt.icon.isNull()) padding += 4; + QHash::iterator it = d->textSizes.find(tab->text); + if (it == d->textSizes.end()) + it = d->textSizes.insert(tab->text, fm.size(Qt::TextShowMnemonic, tab->text)); + const int textWidth = it.value().width(); QSize csz; if (verticalTabs(d->shape)) { csz = QSize( qMax(maxWidgetWidth, qMax(fm.height(), iconSize.height())) + vframe, - fm.size(Qt::TextShowMnemonic, tab->text).width() + iconSize.width() + hframe + widgetHeight + padding); + textWidth + iconSize.width() + hframe + widgetHeight + padding); } else { - csz = QSize(fm.size(Qt::TextShowMnemonic, tab->text).width() + iconSize.width() + hframe - + widgetWidth + padding, + csz = QSize(textWidth + iconSize.width() + hframe + widgetWidth + padding, qMax(maxWidgetHeight, qMax(fm.height(), iconSize.height())) + vframe); } @@ -2071,15 +2087,21 @@ void QTabBarPrivate::setCurrentNextEnabledIndex(int offset) void QTabBar::changeEvent(QEvent *event) { Q_D(QTabBar); - if (event->type() == QEvent::StyleChange) { + switch (event->type()) { + case QEvent::StyleChange: if (!d->elideModeSetByUser) d->elideMode = Qt::TextElideMode(style()->styleHint(QStyle::SH_TabBar_ElideMode, 0, this)); if (!d->useScrollButtonsSetByUser) d->useScrollButtons = !style()->styleHint(QStyle::SH_TabBar_PreferNoArrows, 0, this); + // fallthrough + case QEvent::FontChange: + d->textSizes.clear(); d->refresh(); - } else if (event->type() == QEvent::FontChange) { - d->refresh(); + break; + default: + break; } + QWidget::changeEvent(event); } @@ -2122,6 +2144,7 @@ void QTabBar::setElideMode(Qt::TextElideMode mode) Q_D(QTabBar); d->elideMode = mode; d->elideModeSetByUser = true; + d->textSizes.clear(); d->refresh(); } diff --git a/src/widgets/widgets/qtabbar_p.h b/src/widgets/widgets/qtabbar_p.h index e58fde160c2..d34f45071db 100644 --- a/src/widgets/widgets/qtabbar_p.h +++ b/src/widgets/widgets/qtabbar_p.h @@ -159,6 +159,7 @@ public: #endif //QT_NO_ANIMATION }; QList tabList; + mutable QHash textSizes; int calculateNewPosition(int from, int to, int index) const; void slide(int from, int to); @@ -192,6 +193,8 @@ public: void setupMovableTab(); void autoHideTabs(); + void initBasicStyleOption(QStyleOptionTab *option, int tabIndex) const; + void makeVisible(int index); QSize iconSize; Qt::TextElideMode elideMode; From c6cfa2270b6d25921373f959b318d89f7098f710 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Tue, 9 Aug 2016 13:33:14 +0200 Subject: [PATCH 14/17] evdevtouch: Avoid crashing on exit 26238aca8c442736f380eb523ef48468f892bdb7 causes double deletion of the QTouchDevice in case the post routine already cleaned up the list by the time the touch handler gets to do it. Just check the list of devices to see if the one we hold is still there. If not, the pointer is likely to be a dangling one so do nothing. This will avoid dying with bus error or similar on application exit. Task-number: QTBUG-51562 Change-Id: I50c1edee7405aad308274538219698388c2cc9f9 Reviewed-by: Shawn Rutledge --- src/gui/kernel/qwindowsysteminterface.cpp | 5 +++++ src/gui/kernel/qwindowsysteminterface.h | 1 + .../input/evdevtouch/qevdevtouchhandler.cpp | 8 ++++++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/gui/kernel/qwindowsysteminterface.cpp b/src/gui/kernel/qwindowsysteminterface.cpp index cae976098cc..f1c43110e34 100644 --- a/src/gui/kernel/qwindowsysteminterface.cpp +++ b/src/gui/kernel/qwindowsysteminterface.cpp @@ -442,6 +442,11 @@ void QWindowSystemInterface::unregisterTouchDevice(const QTouchDevice *device) QTouchDevicePrivate::unregisterDevice(device); } +bool QWindowSystemInterface::isTouchDeviceRegistered(const QTouchDevice *device) +{ + return QTouchDevicePrivate::isRegistered(device); +} + void QWindowSystemInterface::handleTouchEvent(QWindow *w, QTouchDevice *device, const QList &points, Qt::KeyboardModifiers mods) { diff --git a/src/gui/kernel/qwindowsysteminterface.h b/src/gui/kernel/qwindowsysteminterface.h index 69c850ad3e9..b4f6020fe29 100644 --- a/src/gui/kernel/qwindowsysteminterface.h +++ b/src/gui/kernel/qwindowsysteminterface.h @@ -123,6 +123,7 @@ public: static void registerTouchDevice(const QTouchDevice *device); static void unregisterTouchDevice(const QTouchDevice *device); + static bool isTouchDeviceRegistered(const QTouchDevice *device); static void handleTouchEvent(QWindow *w, QTouchDevice *device, const QList &points, Qt::KeyboardModifiers mods = Qt::NoModifier); static void handleTouchEvent(QWindow *w, ulong timestamp, QTouchDevice *device, diff --git a/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp b/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp index 7cb4813c7b5..f863629ff90 100644 --- a/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp +++ b/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp @@ -393,9 +393,13 @@ void QEvdevTouchScreenHandler::unregisterTouchDevice() if (!m_device) return; - QWindowSystemInterface::unregisterTouchDevice(m_device); + // At app exit the cleanup may have already been done, avoid + // double delete by checking the list first. + if (QWindowSystemInterface::isTouchDeviceRegistered(m_device)) { + QWindowSystemInterface::unregisterTouchDevice(m_device); + delete m_device; + } - delete m_device; m_device = Q_NULLPTR; } From 91be1f1b04a527ea363de1dc09ffaf7b8fc46d81 Mon Sep 17 00:00:00 2001 From: Maurice Kalinowski Date: Wed, 6 Jul 2016 09:39:27 +0200 Subject: [PATCH 15/17] win: Disable warning about deprecated ATL modules This warning has been introduced by VS2015 Update 3 and is not in our control as the warning happens inside the system headers. To keep the compile output clean, disable this warning. Change-Id: I96253538c6d6774bb91cd5a4ea80dda2910e74b5 Reviewed-by: Joerg Bornemann Reviewed-by: Thiago Macieira --- mkspecs/common/msvc-base.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkspecs/common/msvc-base.conf b/mkspecs/common/msvc-base.conf index 5bd144faa0f..37f38560e81 100644 --- a/mkspecs/common/msvc-base.conf +++ b/mkspecs/common/msvc-base.conf @@ -52,5 +52,5 @@ greaterThan(MSC_VER, 1899) { QMAKE_CFLAGS_WARN_ON += -w44456 -w44457 -w44458 QMAKE_CFLAGS_AVX2 = -arch:AVX2 QMAKE_CXXFLAGS += -Zc:strictStrings -Zc:throwingNew - QMAKE_CXXFLAGS_WARN_ON += -w44456 -w44457 -w44458 -wd4577 + QMAKE_CXXFLAGS_WARN_ON += -w44456 -w44457 -w44458 -wd4577 -wd4467 } From 885720aa1ba25f996e5afd83a46794294dc563f4 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 5 Aug 2016 14:34:12 +0200 Subject: [PATCH 16/17] Update logo icons in icons example MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTBUG-55137 Change-Id: I51a16a40112f5f5bbea00540178999382752a6f2 Reviewed-by: Topi Reiniö --- .../widgets/widgets/icons/images/designer.png | Bin 4205 -> 3604 bytes .../icons/images/qt_extended_16x16.png | Bin 524 -> 1263 bytes .../icons/images/qt_extended_32x32.png | Bin 892 -> 15518 bytes .../icons/images/qt_extended_48x48.png | Bin 1294 -> 789 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/widgets/widgets/icons/images/designer.png b/examples/widgets/widgets/icons/images/designer.png index 0988fcee3f28eacfbd0cb0722b34093e8eace9a8..9f8578b49e66006f6eea2b36d0bdfaa75d76bce1 100644 GIT binary patch literal 3604 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 literal 4205 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 R6rgh$JYD@<);T3K0RR^b+tmO7 delta 499 zcmaFQ*~2nHxt@_Jz$e7@|Ns9D`yJ{IJJlR?sXy#gcgPXQt~&%o&b5b~>Ve!tjqJQRiO{t-+NPdOX+Gk)>}u_Shl}?8e zPe0%Eo(yj~;_>S1!zEX$9)G&_<=6XD&o<4!RQ%}UmFHh>zyI-K*S%SP|NX5$RPWq* zJgDKY>z{wWzpUDQgn@xUt|Z7Wn1SWG=F&>vi#ygf9=81%`t)zXw+oBPyk#yes}4|M z>O3_e1*meir;B4qMV#-sP`<+kA})c`XU@FGz5L9XGd#cVd)+?KS7hIBa!J5xkKg9g zZ@16jIL#bo*M2qaIs;E&fdBE+k`4h992Gg!pIraFIW^#jAMWWPmf-z;7Qne?~mdF=Iw{&S)8pL nEQETG3cF~}^h)1k>GYfFYPXc2hHYyl(47pPu6{1-oD!M<@jw;! diff --git a/examples/widgets/widgets/icons/images/qt_extended_32x32.png b/examples/widgets/widgets/icons/images/qt_extended_32x32.png index 6e7d000c0470e0f45ae714827ba72f69cc25270a..d609c1e1e5b46d571cc46378cf7ae74b250aa82b 100644 GIT binary patch literal 15518 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 delta 1275 zcmXw%2~d)07{@=!uq^4^tX9j$skN=l(b^8H3Gm2c%{I5wac#}aEp6M##FFnz%SlTy zQzK2+a;z=$$g8w8_`nNA%mYyl5m63B4M7D2_rq%DooC*8p5Oof{NI^31D#@-Y7e4( z{e1)6=jP^OVJr#8nGPMP*jOq)cK#ksKM+gD#=>}{f-n|h94685UrF#gkBkrr3C2U8 z4x3ao95O=gCX9xIVBFP)eIU(bh>(P84+M^4xFT*hzz=TUSAJcL1L@zyra*MuO&UU* zI*1r*@|q8an0`w@GA+hIG#v5cd}m&3NTbO+nR%8bF8J90w46tdV|Zq=LT8P7?d;Upv~+BGcv`Q9#RU=-_gSr~^Gs6H@v^>@5zWB! z&Ks%Bz~bI}cj|rWC58WSpg6`6N?SNYcW;ywz3e7c@*icgE(}d_-w84dM#Io#Z#ge@ zT0co2e3{&Qs<0=%Raz-k^JQvbc6&sd>^-IJqF|g=(woRtHhj^JRDt~Tkty-;BrmNs zxI|=TRoYRu zy!u1`Q-wxUEqo%^^b5z^IHUAIRd<7&vL65dAHr{b#{pNpu|~YF_S}ldzzd1HLIk4w zhSWVr-!H9{|$a!%_dC-zPtK?Y);KjsbMu+q6MewR32FV3%!u2$P z@0FuH#tQDVK}kKSh$wws=NlPzr++D`W))@9;DiQN~t@vcDkiC^qC zdLK@n%3Dm`Rs%^pGl!+X&Y-$7i)6s;Gb#595pdYqXO+5Dw}AcAe$hg%!+LTP+V+%% zNS{1%-EN5}TlQCOr0oo50#9ga-d%x`BnlbVz;aBN+2yw#j97=yw<7@F@rSMtKM?G4 zN(qt;T|u_Ny8*p_f$9~CTVie@$#Ge5pv=sYXmcp71km2G4H?}_7A@B1v%Wk+m0pIO zkHQ&FqpQz(`;!tRD&~&h+@gZleCHp6t#6^sv(HF8bGu|E%%ni*{@g_54)lAq_1Z#$ z`KYDE@5Kp=ocydfk17{A1zENJ7-i>Sb?P(gtP$o71jntw?7E+`w|U)qB`TjdX}vx0ybN6$-P{q{a&m23)j!>e-HQw)RMvK362_y> Q8TpNXm%E=^F)ldnfAj;(>i_@% From 25b72a63fffe800f2005b21d254b0b191d263b10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Nowacki?= Date: Wed, 3 Aug 2016 15:20:09 +0200 Subject: [PATCH 17/17] Fix memory leak in tst_qgraphicsproxywidget QStyle was created but never removed Change-Id: I55011377afd475af28e4ce2cf657e435dd37c96a Reviewed-by: Marc Mutz Reviewed-by: Frederik Gladhorn --- .../qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp index ea2599fcf9d..7375513303f 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp @@ -415,6 +415,7 @@ void tst_QGraphicsProxyWidget::setWidget() QGraphicsScene scene; QGraphicsView view(&scene); view.show(); + QScopedPointer style(QStyleFactory::create(QLatin1String("Fusion"))); QVERIFY(QTest::qWaitForWindowExposed(&view)); QPointer proxy = new SubQGraphicsProxyWidget; SubQGraphicsProxyWidget parentProxy; @@ -437,7 +438,7 @@ void tst_QGraphicsProxyWidget::setWidget() #endif widget->setPalette(QPalette(Qt::magenta)); widget->setLayoutDirection(Qt::RightToLeft); - widget->setStyle(QStyleFactory::create(QLatin1String("Fusion"))); + widget->setStyle(style.data()); widget->setFont(QFont("Times")); widget->setVisible(true); QApplication::setActiveWindow(widget);