aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* Doc: fixed link issuesNico Vertriest2015-10-302-2/+2
| | | | | | Task-number: QTBUG-43810 Change-Id: I9f989cd59780ab325cd3f8ddb824868763e369b3 Reviewed-by: Topi Reiniö <topi.reinio@digia.com>
* Remove uses of QT_POINTER_SIZE, replacing with proper constructsThiago Macieira2015-10-293-6/+6
| | | | | | | | | | | Where the size of void* was really wanted, use sizeof(void*). There's only one use of QT_POINTER_SIZE in qtdeclarative now, in fdegen/ main.cpp selecting the ELF size constants. It's easier to keep it like that than to use C++ selecting constructs. The tool isn't built anyway. Change-Id: I1d0f78915b5942aab07cffff140fa0f99ce7d7d4 Reviewed-by: Erik Verbruggen <erik.verbruggen@theqtcompany.com>
* Use the correct macro to detect 64-bit value encodingThiago Macieira2015-10-295-12/+12
| | | | | | | We have a macro for it, so let's use it. Change-Id: I1d0f78915b5942aab07cffff140fa0ac23392362 Reviewed-by: Erik Verbruggen <erik.verbruggen@theqtcompany.com>
* Fix qmlcompiler build on win32.Erik Verbruggen2015-10-291-2/+2
| | | | | Change-Id: Ie1239b6ba5f5ba77dd081ad6392d962822d124dc Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
* virtual QQuickAnimatorJob::afterNodeSync()J-P Nurmi2015-10-292-3/+4
| | | | | | | | This is a suitable hook for custom animator jobs to access QQuickItemPrivate::containerChildNode(). Change-Id: Ie23fd9d6fe053843dd9ac2e8153fabd36873883a Reviewed-by: Gunnar Sletta <gunnar@sletta.org>
* Move QQuickTextDocumentWithImageResources out of qquicktext_p_p.hJ-P Nurmi2015-10-2910-186/+258
| | | | | | | | | | | | | | QQuickTextDocumentWithImageResources was autotest-exported in b63185. The problem is that the QQuickLabel in qtquickcontrols2 inherits QQuickText, and therefore includes the private header. An autotest- exported class with Q_OBJECT macro leads to a linking error: qquickcontrol.obj : error LNK2019: unresolved external symbol "public: static struct TestNamespace::QMetaObject const TestNamespace::QQuickTextDocumentWithImageResources::staticMetaObject" (?staticMetaObject@QQuickTextDocumentWithImageResources@TestNamespace@@2UQMetaObject@2@B) referenced in function "public: static class TestNamespace::QString __cdecl TestNamespace::QQuickTextDocumentWithImageResources::tr(char const *,char const *,int)" (?tr@QQuickTextDocumentWithImageResources@TestNamespace@@SA?AVQString@2@PBD0H@Z) qquicklabel.obj : error LNK2001: unresolved external symbol "public: static struct TestNamespace::QMetaObject const TestNamespace::QQuickTextDocumentWithImageResources::staticMetaObject" (?staticMetaObject@QQuickTextDocumentWithImageResources@TestNamespace@@2UQMetaObject@2@B) ..\..\lib\Qt5LabsTemplatesTestInfix.dll : fatal error LNK1120: 1 unresolved externals Change-Id: I7e8731973c4ad67fca40f87bf009dc55336c3d6f Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
* Export QQmlLocale privatelyJ-P Nurmi2015-10-281-1/+1
| | | | | | | | Allows QQuickSpinBox to call QQmlLocale::wrap() to be able to pass QLocale to QJSValue::call(). Change-Id: I01e4daccdc8bfe6a5c591819ac54bc51603268aa Reviewed-by: Liang Qi <liang.qi@theqtcompany.com>
* Doc: create link to enum list fillModeNico Vertriest2015-10-271-3/+2
| | | | | | Task-number: QTBUG-45880 Change-Id: I99b2b000179d22553113a4ea5dd505094a3e08be Reviewed-by: Topi Reiniö <topi.reinio@digia.com>
* QML: Fix typeof context property.Erik Verbruggen2015-10-2713-2/+119
| | | | | | | | This was missing from f21e8c641af6b2d10f0d7e7e0fc6a755dab3673c. Task-number: QTBUG-48524 Change-Id: I5cc6a979d965a1ef6b7fbc916a7ca9df868b459a Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
* Merge remote-tracking branch 'origin/5.5' into 5.6Liang Qi2015-10-2622-69/+290
|\ | | | | | | | | | | | | | | Conflicts: tests/auto/qml/qml.pro tools/qmlprofiler/qmlprofilerclient.cpp Change-Id: Id47f15a5ab38f8ec79f0a26c92805acba62caac4
| * qmllint: Add unit-testsSérgio Martins2015-10-259-1/+123
| | | | | | | | | | Change-Id: Ia3eb33e89597e3811112ce78d8a59a822cc9190c Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
| * Make it possible to change sources of ShaderEffect again.Gunnar Sletta2015-10-202-30/+34
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 92433623b31388e2e8c4d532033dad6189eaab24 introduced a bug where an unused material would clear its typeid pointer. This resulted in that a changed shadereffect would in all likelyhood get the same pointer for its changed shader which would result in using the same GL shader inside the renderer. This change rewrites the logic so that the cache is per render thread and the cache is cleaned up along with other GL/SG resources as part of scene graph invalidation. Task-number: QTBUG-48856 Change-Id: Id2feb14f584b5f5c176e8176cc9f1b54abd0d079 Reviewed-by: Michael Brasser <michael.brasser@live.com> Reviewed-by: Robert Griebl <robert.griebl@pelagicore.com>
| * Scene Graph: Fixed memory leak in QSGBatchRenderer::Renderer::map()Martin Banky2015-10-191-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In the uncommon case (m_context->hasBrokenIndexBufferObjects() || m_visualizeMode != VisualizeNothing) of mapping a buffer, malloc is called without first freeing the previous malloc. Regression was introduced with: qt5 commit: 9347499e78f03710eaf24af3c1e7ac650d0ef81d qtdeclarative commit: a371bac3fba73f92aaa63a68d8ab1ae81a1d1031 [ChangeLog][QtQuick][Scene Graph] Fixed memory leak in QSGBatchRenderer::Renderer::map() Task-number: QTBUG-48799 Change-Id: I5ef4b7301d390463845aeb192851f86655962499 Reviewed-by: Gunnar Sletta <gunnar@sletta.org>
| * Fix QQuickTextDocumentWithImageResources image loadingRoman Pasechnik2015-10-153-22/+34
| | | | | | | | | | | | | | | | | | | | | | QQuickTextDocumentWithImageResources always tries to load images itself and not using QTextDocument internal resources. What it should do: 1) Check if QTextDocument already has image resource and use it. 2) If not, try to load resource manually. Change-Id: Ifc4d919fc4a08b4efae50e06a42f1af7cee67af3 Task-number: QTBUG-32525 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@theqtcompany.com>
| * qmlprofiler: Use server's datastream version for communicationUlf Hermann2015-10-151-0/+2
| | | | | | | | | | | | | | | | As qmlprofiler doesn't support datastream version negotiation we have to use the data stream version the server uses by default: QT_4_7. Change-Id: I0fa89f82f0f6c651e8e377bd578f8d7ae61045ab Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
| * AnimatedSprite: avoid unnecessary redrawsTim Blechmann2015-10-142-4/+17
| | | | | | | | | | | | | | | | | | AnimatedSprite currently triggers a redraw for every update. however this should only be done, when the next frame will actually be different to the current one. Change-Id: I550bd32c02807e4c3f4847fb2608f5ad0cf0a59a Reviewed-by: Jan Arve Sæther <jan-arve.saether@theqtcompany.com>
| * QQuickItem: detect loop in KeyNavigation chainLiang Qi2015-10-143-1/+66
| | | | | | | | | | | | Task-number: QTBUG-47229 Change-Id: I22dbe5ee1fff4e9a8de4fa69b43e4d9a87677192 Reviewed-by: J-P Nurmi <jpnurmi@theqtcompany.com>
| * Correct some areas of QQuickItem's documentationMitch Curtis2015-10-131-8/+8
| | | | | | | | | | Change-Id: I2a2c684cd3f55a5a4311fd28b893e6a93c022ace Reviewed-by: Topi Reiniö <topi.reinio@digia.com>
| * Fixed 'plataforms' typo in WheelEvent documentationDaniel Levin2015-10-061-1/+1
| | | | | | | | | | | | Change-Id: I08907f6c0d435c2a056f759ba58f616a5b0368d2 Signed-off-by: Daniel Levin <dendy.ua@gmail.com> Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@theqtcompany.com>
* | Quick: Sanitize reading environment variables.Friedemann Kleint2015-10-2612-70/+74
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Where possible, use qEnvironmentVariableIsSet()/ qEnvironmentVariableIsEmpty() instead of checking on the return value of qgetenv(). Where the value is required, add a check using one of qEnvironmentVariableIsSet()/Empty(). Move QSGAtlasTexture::qsg_envInt() to qsgrenderer.cpp for reuse as qt_sg_envInt() and add qt_sg_envFloat(). Change-Id: I4c93f16c228d4f537154f389a0fa1427654485f7 Reviewed-by: Gunnar Sletta <gunnar@sletta.org>
* | Binding: document that property can be grouped if it's a value typeMitch Curtis2015-10-231-0/+17
| | | | | | | | | | Change-Id: Ie33410027556857fefb87517ebb336c2714bc6c6 Reviewed-by: Topi Reiniö <topi.reinio@digia.com>
* | V4: do not run optimizer for functions of >300 statements.Erik Verbruggen2015-10-231-2/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The time it takes to run the optimizer depends on both the number of IR statements, and the number of basic-blocks. Many functions that have more than 300 statements are either the %entry point, or methods that set a large number of member variables. Both are not performance sensitive, so skipping them won't hurt execution speed. Actually, not optimizing them does improve startup speed. Basic blocks need to contain at least one statement (the terminator), so a large number basic blocks always results in at least an equal number of IR statements. Therefore they do not need to be taken into account. (An example of an excessive amount of basic blocks is a switch with 9000 cases: this will generate ~27000 basic blocks.) Change-Id: Iabf809d8ad293f4f27ece06d136aa281991a1b0f Reviewed-by: Frank Meerkoetter <frank.meerkoetter@basyskom.com> Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
* | Update plugins.qmltypes for QtQuick importKai Koehne2015-10-232-1757/+325
| | | | | | | | | | Change-Id: I943eef590a759f4cf8d546ce153d8d259d36e762 Reviewed-by: Alex Blasche <alexander.blasche@theqtcompany.com>
* | Update plugins.qmltypesKai Koehne2015-10-2310-30/+832
| | | | | | | | | | | | | | | | Update all plugins.qmltypes except for QtQuick2. Change-Id: If79b82fa54d159171f45a1bd2e9432c76b3c5686 Reviewed-by: Marco Benelli <marco.benelli@theqtcompany.com> Reviewed-by: Alex Blasche <alexander.blasche@theqtcompany.com>
* | QML: file leak of QFileSelector.Erik Verbruggen2015-10-222-0/+8
| | | | | | | | | | | | | | | | When no "custom" file selector is set, the QQmlFileSelector would not delete the QFileSelector it created/owned. Change-Id: I0235d0dabdb8522db0b8b74a2a2d69ee5a20abb6 Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
* | QML: Sanitize reading environment variables.Friedemann Kleint2015-10-229-31/+52
| | | | | | | | | | | | | | | | | | | | | | Where possible, use qEnvironmentVariableIsSet()/ qEnvironmentVariableIsEmpty() instead of checking on the return value of qgetenv(). Where the value is required, add a check using one of qEnvironmentVariableIsSet()/Empty(). Change-Id: Ia8b7534e6f5165bd8a6b4e63ccc139c42dd03056 Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
* | Doc: corrected mistake in documentation Using TransitionsNico Vertriest2015-10-221-5/+4
| | | | | | | | | | | | Task-number: QTWEBSITE-565 Change-Id: I669aee1acbc76a98e481f9b107f2d104b0fb60bd Reviewed-by: Topi Reiniö <topi.reinio@digia.com>
* | Fix QQuickPathViewPrivate::snapToIndex()J-P Nurmi2015-10-223-7/+16
| | | | | | | | | | | | | | | | | | | | QQuickPathView::setCurrentIndex() set moveReason to "SetIndex", but snapToIndex() overrode it to "Other". This caused updateCurrent() to change the current index during snap animation and caused binding loops in Qt Quick Controls 2. Change-Id: I6c5f34c69886cb5c234ed78535bb356fbb38b3a6 Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
* | QQuickItem: Make setParent() error message more usefulGabriel de Dietrich2015-10-222-2/+5
| | | | | | | | | | Change-Id: Ie39b7ee91024b6b090fce2b58bb240cbae724b8f Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
* | QQmlNativeDebugConnector: Do not translate warning.Friedemann Kleint2015-10-221-2/+2
| | | | | | | | | | | | | | qWarnings() usually are not translated. Change-Id: I0375e0e21054d33349d3f56ee9ac6f580e366736 Reviewed-by: Ulf Hermann <ulf.hermann@theqtcompany.com>
* | Several cases of s/decelerating from/decelerating to/.Edward Welbourne2015-10-211-8/+8
| | | | | | | | | | | | | | | | | | The relevant easing curves all start out fast and end stationery; so it's at the *end* that they attain zero "velocity", so they're decelerating *to* zero, not from it. Change-Id: Ia691e39ef59708828a7e7f8af46b775abbff86fd Reviewed-by: Topi Reiniö <topi.reinio@digia.com>
* | Missing early n in co[n]version.Edward Welbourne2015-10-211-1/+1
| | | | | | | | | | Change-Id: I7ca28b42797a8f0781706af4ffd3e8f0dac41aa3 Reviewed-by: Topi Reiniö <topi.reinio@digia.com>
* | Revert "Doc: corrected not working snippet"Topi Reinio2015-10-212-2/+1
| | | | | | | | | | | | | | | | | | This reverts commit f8bde8841631c6e4fa64a56f77522567455f8709, and fixes the original problem of a snippet not being found by using a relative path for the \snippet command. Change-Id: Ie932beea1ba07cf5b298528ba61b5a45b84cb19b Reviewed-by: Martin Smith <martin.smith@digia.com>
* | Doc: Corrected qdoc errors \generatelist{related}Nico Vertriest2015-10-214-11/+4
| | | | | | | | | | | | | | | | Task-number: QTBUG-43810 Change-Id: I9ffb78dc02453590008416ba74f3d1a7f56b36fa Reviewed-by: Venugopal Shivashankar <venugopal.shivashankar@digia.com> Reviewed-by: Martin Smith <martin.smith@digia.com> Reviewed-by: Topi Reiniö <topi.reinio@digia.com>
* | QQuickItemPrivate: added a accessibleRole()Liang Qi2015-10-213-4/+22
| | | | | | | | | | | | | | Which is used in QAccessibleQuickItem. Change-Id: Ie9c9d59783c4af0c53a3ffe88046132fb6b5c0fd Reviewed-by: J-P Nurmi <jpnurmi@theqtcompany.com>
* | Doc: Update examplesinstallpath to include the repository nameTopi Reinio2015-10-212-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | The examplesinstallpath variable in .qdocconf files defines the path under QT_INSTALL_EXAMPLES where examples are found. To match the way examples are packaged in Qt 5.6, prefix each install path with the repository name. Task-number: QTBUG-48736 Change-Id: Ic081654ad3dfb87d3053772fabd5546c75070a7c Reviewed-by: Venugopal Shivashankar <venugopal.shivashankar@digia.com>
* | QQuickItem: fully document stackBefore() and stackAfter()Mitch Curtis2015-10-201-2/+18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Some of the following behavior initially came as a surprise to me: int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); QObject *window = engine.rootObjects().first(); // Assume that a and b are rectangles declared in that order, respectively. QQuickItem *a = window->property("a").value<QQuickItem*>(); QQuickItem *b = window->property("b").value<QQuickItem*>(); // a is rendered below b (assume that rendering happens here) qDebug() << "a.z =" << a->z() << "b.z =" << b->z(); // a.z = 0 b.z = 0 a->stackAfter(b); // a is rendered above b qDebug() << "a.z =" << a->z() << "b.z =" << b->z(); // a.z = 0 b.z = 0 b->setZ(1); // a is rendered below b qDebug() << "a.z =" << a->z() << "b.z =" << b->z(); // a.z = 0 b.z = 1 a->stackAfter(b); // a is rendered below b qDebug() << "a.z =" << a->z() << "b.z =" << b->z(); // a.z = 0 b.z = 1 return app.exec(); } I would have thought that stackBefore()/stackAfter() would also change the z value, but it makes sense that it doens't, as z is never really validated, as such. Still, we should document the exact behavior, including information about tab focus ordering. Change-Id: Iafc45aec402d8461e7b53525f81195171f659dff Reviewed-by: J-P Nurmi <jpnurmi@theqtcompany.com>
* | JS: Math.random(): fix range to not include 1.0.Erik Verbruggen2015-10-201-2/+7
| | | | | | | | | | | | | | | | | | | | | | [15.8.2.14] specifies that the Math.random() returns a number greator or equal to 0, but less than 1. Libc however defines it to be less than or equal to 1, so we have to divide the returned value by RAND_MAX+1. Of course, in order to do this, we need to widen them to 64bits ints. Task-number: QTBUG-48753 Change-Id: Ia4d808014dbf2a5575f4226779214bf0d5981f49 Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
* | Doc: solved various qdoc errors qtdeclarativeNico Vertriest2015-10-202-25/+7
| | | | | | | | | | | | Task-number: QTBUG-43810 Change-Id: I2e9fa91d63c5998df50f3678e485135e8518916d Reviewed-by: Venugopal Shivashankar <venugopal.shivashankar@digia.com>
* | Doc: corrected qdoc error missing topic commandNico Vertriest2015-10-202-29/+2
| | | | | | | | | | | | | | | | | | | | Removed 3 unnecessary ingroup statements plus accompanying generatelist statement Task-number: QTBUG-43810 Change-Id: I54f1e13b7b80afc2529765a177c0fca5090de1e0 Reviewed-by: Topi Reiniö <topi.reinio@digia.com> Reviewed-by: Martin Smith <martin.smith@digia.com>
* | Properly resolve the context to create mutable bindings onLars Knoll2015-10-201-4/+13
| | | | | | | | | | | | | | | | | | This fixes a regression introduced in 5.5, where eval() calls in strict mode would still modify outer properties. Change-Id: I3ab70b45217eea16da68a4537e3c107b76794f2c Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com> Reviewed-by: Erik Verbruggen <erik.verbruggen@theqtcompany.com>
* | Fix a crash when copying array dataLars Knoll2015-10-201-1/+1
| | | | | | | | | | | | | | | | | | | | | | Regression from 5.5. d()->arrayData->alloc can be larger, but never smaller than the allocation of the other's array data. Change-Id: I7d2265768f9d6e6298bfbba0d674a4d0e642422f Task-number: QTBUG-48727 Reviewed-by: Liang Qi <liang.qi@theqtcompany.com> Reviewed-by: Nikita Krupenko <krnekit@gmail.com> Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
* | qmlscene: Split argument parsing.Friedemann Kleint2015-10-191-31/+38
| | | | | | | | | | | | | | | | | | | | | | Loop over argv to filter out the arguments that need to be set before Q[Gui]Application creation and use QCoreApplication::arguments() for the remaining arguments. This prevents Qt's arguments (-geometry/-platform...) from interfering with the URL argument check. Change-Id: I2a88478534179b79578f7fb979a6b264a4fae44d Reviewed-by: Robin Burchell <robin.burchell@viroteck.net>
* | Skip designer-related directories while scanning imports.Marco Benelli2015-10-191-4/+31
| | | | | | | | | | | | | | | | | | | | | | The qtcreator's qmldesigner plugin contains some directories that are not reacheable during the import scan, resulting in qmlplugindump complaing for missing dependencies. Since these components are not needed, let the scanner just ignore them. Change-Id: Icdf7c9e841cf5bcc1e737a0fc75a63b1e02f87f9 Reviewed-by: Kai Koehne <kai.koehne@theqtcompany.com>
* | QmlDebug: Add a debug service for use with native debuggershjk2015-10-1610-2/+1051
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This service provides information about the state of the most recently used QmlEngine in a way that can be integrated with "native" debuggers (GDB, LLDB, potentially CDB). Unlike the existing QV4 debugger service, the data extraction is triggered by direct calls from the native debuggers, i.e. has the examined QmlEngine stopped at the time of inspection. Since roundtrips through the native debuggers are expensive, an additional goal is to minimize roundtrips. Change-Id: Ic420129bbc15162197e35b52d92e882c027c9f6d Reviewed-by: Ulf Hermann <ulf.hermann@theqtcompany.com>
* | QmlDebug: Don't duplicate Qt namespace when importing debug pluginsUlf Hermann2015-10-161-1/+3
| | | | | | | | | | | | | | | | | | | | Q_IMPORT_PLUGIN already adds the Qt namespace to the symbols. Task-number: QTBUG-48415 Change-Id: I25b4ffdcddd0bdd52bfd390964b9c1a333a79b30 Reviewed-by: hjk <hjk@theqtcompany.com> Reviewed-by: Maurice Kalinowski <maurice.kalinowski@theqtcompany.com> Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
* | QmlDebug: Add a debug connector for use with native debuggershjk2015-10-165-3/+411
| | | | | | | | | | | | | | | | | | | | This debug connector offers a few simple C functions a native debugger can hook into to communicate with QML debug services. It is the base of the 'native mixed' debugging mode in Qt Creator. Change-Id: I32ce1f21be8e3522dccf1210d4de3b131b819bc5 Reviewed-by: Ulf Hermann <ulf.hermann@theqtcompany.com>
* | Support alpha in QQuickWindow::grabWindow().Gunnar Sletta2015-10-165-10/+31
| | | | | | | | | | | | Change-Id: I2dd69745427d8f5e882303d2a4de3935ddca02e9 Task-number: QTBUG-48787 Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
* | Make obj2's text consistent between qtBinding.[23].qmlEdward Welbourne2015-10-161-1/+1
| | | | | | | | | | | | | | | | The expected text output sides with .3.qml, so fix .2.qml Task-number: QTBUG-48652 Change-Id: I91ac0ab0854df95e06225938d195cd5e3be5abc3 Reviewed-by: Alex Blasche <alexander.blasche@theqtcompany.com>
* | Only set V4 debugger when service is enabledUlf Hermann2015-10-154-10/+34
| | | | | | | | | | | | | | Otherwise different debug services could steal each other's debugers. Change-Id: Ic0a50333d21c7d20a7124240ea598f8446400ae3 Reviewed-by: hjk <hjk@theqtcompany.com>