aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6
Commit message (Collapse)AuthorAgeFilesLines
...
* Shiboken: Simplify Python Error MessagesChristian Tismer2024-05-109-64/+34
| | | | | | | | | | | | | | | | | | | The function PyErr_SetString is used quite often, which has no return value. The bracketed sequence PyErr_SetString(...); return nullptr; can in most cases be replaced by a single call to return PyErr_Format(...); To simplify matters, PyErr_Format is now used everywhere. Task-number: PYSIDE-2404 Change-Id: I5988fcd2430be700415d14d7a5cc740211e61d08 Pick-to: 6.7 Reviewed-by: Adrian Herrmann <adrian.herrmann@qt.io>
* Fix type hint of QTranslator.translate()Friedemann Kleint2024-05-101-0/+5
| | | | | | | | | The function takes strings like the other translate() functions. Pick-to: 6.7 6.5 Fixes: PYSIDE-2748 Change-Id: I331ba045276192c6f83ddae3f1a24459a9570bfa Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
* shiboken6: Generate polymorphic bases into type discovery functionsFriedemann Kleint2024-05-063-4/+4
| | | | | | | | | In case of a chain QLabel->QWidget->QObject; QWidget should be marked as a polymorphic base and checked for example for functions returning a QWidget *. Change-Id: I44306d6635794119e6f18658a438e64160c5c41c Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
* Fix polymorphic discovery to work without namesFriedemann Kleint2024-05-061-1/+9
| | | | | | | | | | In newObjectWithHeuristics(), try the type discovery graph check for the inherited class also in case the typeName is identical to the base name (which means typeid() was not able to do resolution based on virtual tables). Change-Id: Ia8912a4860a580418438f659b7a854647657ab9a Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
* libshiboken: Split the Shiboken::Object::newObject() functionFriedemann Kleint2024-05-061-1/+1
| | | | | | | | | | | | | | | | | | | Remove the bool exactType parameter from the existing newObject() by splitting it into 3 functions: newObjectForType() creates an instance for the type passed in. newObjectWithHeuristics() takes an additional typeName parameter obtained from typeid().name() on the C++ pointer which may contain the derived class name and also tries to find the most derived class using the type discovery graph. newObjectForPointer() is new and contains a test for multiple inheritance in the inheritance tree (disabling use of the most derived class) which was previously generated into the code. Change-Id: Ic0a25f8ec17dc20364b37062de6f20544cd2f09e Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
* Fix class hierarchies not working with legacy qmlRegisterType()Friedemann Kleint2024-05-026-14/+108
| | | | | | | | | | | | | | | | | | | In order to work with the new QML registration code, the legacy qmlRegisterType() function set QMetaClassInfo items on the meta object of the QObject type to be registered. This caused the meta object to be recreated in PySide's dynamic meta object builder, breaking the class inheritance information. To fix this, use a separate dummy meta object to provide the information. Amends 91bf9aa10faad14de557136664f58005c935d11c. Pick-to: 6.7 Fixes: PYSIDE-2709 Change-Id: Icbd56759279bc8fcf89705af013db560babe4065 Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io> Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
* PySide: Fix QML ListPropertyShyamnath Premnadh2024-04-303-10/+129
| | | | | | | | | | | | - fix broken propListCount() by changing the type of the returned value to qsizetype. Amends f9662f9b4008f683d02c829ea59676a2cf49b2fb. - Add tests to test all the ListProperty features. - Fixes some flake8 errors. Pick-to: 6.2 6.5 6.6 6.7 Task-number: PYSIDE-2698 Change-Id: I356e8af3af965374441f287391dcab9d724b28f9 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
* Enable supressing warnings about signal disconnection failureFriedemann Kleint2024-04-301-2/+2
| | | | | | | | | | Use PyExc_RuntimeWarning instead of PyExc_RuntimeError. Amends d7aa15abe25bd71ea19180743ce9b41e0b788520. Fixes: PYSIDE-2705 Pick-to: 6.7 Change-Id: I04de3eb92468b996e50270b2268e08b3b819e802 Reviewed-by: Adrian Herrmann <adrian.herrmann@qt.io>
* Documentation/QRC tutorial: Fix error in .qrc file snippetFriedemann Kleint2024-04-251-1/+0
| | | | | | | Pick-to: 6.7 6.5 Fixes: PYSIDE-2700 Change-Id: Icc1085cb51508cce35f0722219c9ae395f0b7bc5 Reviewed-by: Adrian Herrmann <adrian.herrmann@qt.io>
* QtAsyncio: Improve readability of _stepAdrian Herrmann2024-04-241-10/+9
| | | | | | | | | | Improve the readability of the QAsyncioTask._step function; avoid nested try/except blocks. Pick-to: 6.7 Task-number: PYSIDE-769 Change-Id: Ibb82c50cf93b084b30dd2a5abcc0197ae25802e0 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
* Documentation: Add QtQml.ListPropertyFriedemann Kleint2024-04-231-0/+24
| | | | | | | Pick-to: 6.7 Task-number: PYSIDE-2698 Change-Id: If9b9af49bb351fcb4e2355277ff84bd0936b5033 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
* Lazy Load: Fix polymorphic classes by identifying lazy groupsFriedemann Kleint2024-04-231-0/+16
| | | | | | | | | | | | | Classes with a polymorphicIdValue have an expression which may reference a related class. We use that to identify a lazy group, which has to be initialized at once. This is now completely solved. Pick-to: 6.7 Fixes: PYSIDE-2675 Change-Id: I957a1b2b95d37b96cc2e98082fc7f92e601322cb Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
* Add some missing classesFriedemann Kleint2024-04-2229-5/+125
| | | | | | | | | | | | Identified by the script added by 1251a23cfd13bb0652f38ef3b36087034f552d57. [ChangeLog][PySide6] A number of missing classes have been added. Task-number: PYSIDE-487 Pick-to: 6.7 Change-Id: Ia62aab2578d46f00540856557474bc394669613f Reviewed-by: Adrian Herrmann <adrian.herrmann@qt.io>
* Documentation: Fix ClassInfo to be a proper decoratorFriedemann Kleint2024-04-221-7/+5
| | | | | | | Pick-to: 6.7 Task-number: PYSIDE-1106 Change-Id: I298769db5455368fca6890571546d4cf74ace957 Reviewed-by: Adrian Herrmann <adrian.herrmann@qt.io>
* QtAsyncio: Round handle timeoutsAdrian Herrmann2024-04-221-1/+2
| | | | | | | | | | | | Handle timeouts should be rounded up or down instead of only up as happens with a plain int() call. Otherwise, a timeout of e.g. 0.9 would be handled as 0, where 1 would be more appropriate. Pick-to: 6.7 Task-number: PYSIDE-2644 Task-number: PYSIDE-769 Change-Id: I19585010c3e007afb6ae83750e4b6ffc9beb5961 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
* QtAsyncio: Fix tasks with loop not cancellingAdrian Herrmann2024-04-222-0/+68
| | | | | | | | | | | | | | | If a task was cancelled, then a new future created from this task should be cancelled as well. Otherwise, in some scenarios like a loop inside the task and with bad timing, if the new future is not cancelled, the task would continue running in this loop despite having been cancelled. This bad timing can occur especially if the first future finishes very quickly. Pick-to: 6.7 Fixes: PYSIDE-2644 Task-number: PYSIDE-769 Change-Id: Icfff6e4ad5da565f50e3d89fbf85d1fecbf93650 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
* shiboken6: Generate Python override code for added virtualsFriedemann Kleint2024-04-222-0/+24
| | | | | | | | | | | | Introduce "Python override" as a special type of user-added function which will cause a function calling a Python override into the native wrapper. This can then be called from a virtual that has a signature which cannot be handled in Python. Fixes: PYSIDE-2602 Pick-to: 6.7 Change-Id: I5fc44ebe3f585078e87d3230d5e6f4faa67a4ee1 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
* Documentation: Fix change describing address sanitizer usageFriedemann Kleint2024-04-191-1/+1
| | | | | | | | Amends 83a93d243dbc1ef6679ee8ac3a35184a6edc43d9. Pick-to: 6.7 Change-Id: Iedb3f4623b3ce487e750b5eacfa42c0771d4f7cc Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
* Tooling: Add pyside6-balsamuiShyamnath Premnadh2024-04-193-0/+28
| | | | | | | | | | - Add documentation for the tool - Add a screenshot of the tool Pick-to: 6.7 6.6 6.5 Task-number: PYSIDE-2629 Change-Id: I63d1d7e65d92ec37012ce40bb319dfeef9c9695b Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
* Tooling: add pyside6-balsamShyamnath Premnadh2024-04-182-1/+74
| | | | | | | | | - Also add the relevant documentation Pick-to: 6.7 6.6 6.5 Task-number: PYSIDE-2629 Change-Id: Ic2e7798a5f0ff7015cb87089dda2420ed6327ca2 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
* Tooling: Add pyside6-qsbShyamnath Premnadh2024-04-183-2/+56
| | | | | | | | | | | - Analogous to the qsb tool in Qt - Add pyside6-qsb tool to the documentation - Update developer documentation Pick-to: 6.7 6.6 6.5 Task-number: PYSIDE-2629 Change-Id: I93058ebb2864491e951f4f828d703d8893fbcbe7 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
* Documentation: Add instructions for using address sanitizerFriedemann Kleint2024-04-181-0/+13
| | | | | | Pick-to: 6.7 Change-Id: I851ffc5a9d421bb3a227594db691f67694ca042a Reviewed-by: Adrian Herrmann <adrian.herrmann@qt.io>
* Documentation: Fix warning about ambiguous link to APIFriedemann Kleint2024-04-181-1/+1
| | | | | | | | | | | | | Use "pyside-api" as in api.rst, fixing: index.rst 102 WARNING: more than one target found for 'any' cross-reference 'api': could be :doc:`API Docs` or :py:meth:`PySide6.Qt3DRender.QGraphicsApiFilter.api` or :py:meth:`PySide6.Qt3DRender.QRenderCapabilities.api` or :py:meth:`PySide6.QtWidgets.QRhiWidget.api` Pick-to: 6.7 6.5 Change-Id: I813ab96bc5afb88e8a3e4dd936bbcd2c80b189c5 Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
* Release dialogs when using QDialog.exec()Friedemann Kleint2024-04-124-1/+64
| | | | | | | | | | | | | | | In the typical pattern ported from C++ dialog = QDialog(mainWin) dialog.exec() one would expected the dialog to be deleted. However, due to the constructor heuristics creating a parent-child relationship, the dialog leaks. Add a modification to remove the relationship in case exec() is called. Change-Id: Ibc6f8c150cbd80a4085af4a5b713ee7c2c62abf3 Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
* Fix potential undefined behavior in type discovery of class hierarchiesFriedemann Kleint2024-04-124-97/+158
| | | | | | | | | | | | | | | | | | | Use the %B-placeholder for base classes always, changing the generated expressions from: reinterpret_cast<QMouseEvent *>(cptr)->type() == QEvent::MouseMove to reinterpret_cast<QEvent *>(cptr)->type() == QEvent::MouseMove Remove the copyable-attributes since object-type is not copyable anyways. Pick-to: 6.7 Task-number: PYSIDE-2675 Change-Id: I89092b0afd6901e0f8cf5144eb1185ab1d80a0d5 Reviewed-by: Christian Tismer <tismer@stackless.com>
* Multimedia: Adapt to revert of QAudio->QtAudio namespace renamingFriedemann Kleint2024-04-124-14/+4
| | | | | | | | | | | | Partially revert 4d761eaaf852f8d82925e111150f25c0dd5f3e83. Adapt to qtmultimedia/7fcea568c9c64f3bcebda21f0df02aa0107dfd0c, reverting qtmultimedia/edaec2bf714c98d65f12c8ed9a2ffbd1603635a7. Task-number: QTBUG-123997 Pick-to: 6.7 Change-Id: Ibd0ad737293f4b9107909f37554c03f64bce5d1e Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
* Fix spurious build errorFriedemann Kleint2024-04-091-1/+1
| | | | | | | | | | Re-add a dependency that was removed. Amends f619b4c45b042c3a656a80b57cb4f154ef15bd1a. Pick-to: 6.7 Task-number: PYSIDE-2649 Change-Id: I8a6d7734fd536438f561edde652ed3e0fe4d828f Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
* Port the QtCore signals tests to modern syntaxFriedemann Kleint2024-04-096-43/+53
| | | | | | | | | | | Use the modern syntax where appropriate. Some tests are left unmodified to at least test the syntax. Pick-to: 6.7 Task-number: PYSIDE-2646 Change-Id: Idb16cda65ab1985f8be5fa5527b5a19e26fcec34 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
* Port signals tests to modern syntaxFriedemann Kleint2024-04-0920-396/+403
| | | | | | | | | | | | | | Use the modern syntax where appropriate. Some tests are left unmodified to at least test the syntax. As a drive-by, remove the hasQtGui import checks since widgets should be built when this is run. Pick-to: 6.7 Task-number: PYSIDE-2646 Change-Id: I9acf07d0b735009f6aff4a55382dae745d855786 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
* Fix building without QtOpenGLFriedemann Kleint2024-04-0912-33/+110
| | | | | | | | | | Introduce a CMake macro to either add the dependency or an entry to the dropped items for typesystem parsing. Pick-to: 6.7 Fixes: PYSIDE-2649 Change-Id: Idb4e6d530075ab8c08c92e2e26d4de1bfd0459cf Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
* shiboken6: Add attributes for global inline namespacesFriedemann Kleint2024-04-0857-57/+114
| | | | | | | Pick-to: 6.7 Fixes: PYSIDE-2590 Change-Id: I36ce25bc759cd888f80b797d4f40864c3d2e2a84 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
* Documentation/Tools: Fix links to pyside6-lrelease, pyside6-lupdateFriedemann Kleint2024-04-081-2/+2
| | | | | | | | Amends d1e268df8406ed1c1d94b95511d3f61a3156d8ed. Pick-to: 6.7 Change-Id: Ie6653aaac127bdd7909f9c4825f4aa7f223e5260 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
* Deployment: Doc UpdateShyamnath Premnadh2024-04-051-0/+22
| | | | | | | | | - Add considerations for dependencies Task-number: PYSIDE-1612 Pick-to: 6.7 6.7.0 Change-Id: Ib6e6bd4f616131961fa29e44e1aa0dda51b6f81c Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
* Build system: Clean Qt libraries linked by the modulesFriedemann Kleint2024-04-0436-202/+75
| | | | | | | | | | | | | | Only the bound Qt library needs to be linked, it will bring its dependencies. Add explanatory comment for the exceptions (QtTest, QtSql). Pick-to: 6.7 Task-number: PYSIDE-2649 Change-Id: Ib84d37248578a76400d307bb5d050005110677c3 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io> Reviewed-by: Christian Tismer <tismer@stackless.com>
* Fix broken comparison of QOperatingSystemVersion::OSTypeFriedemann Kleint2024-04-041-1/+0
| | | | | | | | | Remove duplicated definition of the enumeration. Fixes: PYSIDE-2668 Pick-to: 6.7 6.7.0 6.6 6.5 Change-Id: I46279767c48a8c9d4f454748666937328712212d Reviewed-by: Christian Tismer <tismer@stackless.com>
* Fix crash browsing https://outlook.comFriedemann Kleint2024-04-041-1/+1
| | | | | | | | | | | | | | | A crash occurs when calling QWebEngineRegisterProtocolHandlerRequest.origin() from a signal handler of QWebEngineRegisterProtocolHandlerRequest(QWebEngineRegisterProtocolHandlerRequest). QWebEngineRegisterProtocolHandlerRequest needs to be a value type for this to work. Fixes: PYSIDE-2663 Pick-to: 6.7 6.7.0 6.6 6.5 Change-Id: Iab8c7cb5822455a35c5759137db20b064cb468cc Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
* Fix flake8-warnings in signals testsFriedemann Kleint2024-04-0427-56/+23
| | | | | | | | Pick-to: 6.7 Task-number: PYSIDE-2646 Change-Id: I4f6b5d642f540fb3f5f2e219057c862fe5998a21 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
* Documentation/QmlSingleton: Remove mention of Q_OBJECTFriedemann Kleint2024-04-041-1/+1
| | | | | | | | It does not exist in Python. Pick-to: 6.7 Change-Id: Ib52635df70148f604b066435e50653d1126a80dc Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
* Add a project file for the signals testsFriedemann Kleint2024-04-021-0/+19
| | | | | | Pick-to: 6.7 Change-Id: I8a6b2eb1aa9f7a1a7675424c01127c7db108eaf2 Reviewed-by: Adrian Herrmann <adrian.herrmann@qt.io>
* Documentation: Fix link to Python downloadsFriedemann Kleint2024-04-021-1/+1
| | | | | | Pick-to: 6.7 6.7.0 6.6 6.5 6.2 Change-Id: Ieee77eb36266b6425cb8569b42263532ecbc27a5 Reviewed-by: Jaishree Vyas <jaishree.vyas@qt.io>
* libpyside/Signal manager: Ensure cleanup of main thread targetsFriedemann Kleint2024-04-022-5/+88
| | | | | | | | | | | | | | | | Restore a notification on a sender's QObject::destroy() signal for main thread objects. Instead of triggering instant deletion as was done before (causing issues with recursion and threads), start an idle timer to call the Signal manager cleanup. Amends 1270a9e82e5bc3bd53a1131698ece60403da1192. Pick-to: 6.7 Task-number: PYSIDE-2646 Task-number: PYSIDE-2141 Change-Id: Ifdc28f729cab64d58ac2ab300daece98b167d915 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
* libpyside: Refactor the signal-lambda-testFriedemann Kleint2024-04-021-28/+56
| | | | | | | | | | | | Introduce Sender/Receiver classes for clarity. Prepend tests for the new Signal.connect() syntax before the old string-based connect() tests. Join the 2 tests using QProcess to save one execution. Pick-to: 6.7 6.6 6.5 Task-number: PYSIDE-2646 Change-Id: I41db1be3cf5772df2ed7a89aecf4d9b3ff5b8a51 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
* Implement multiple inheritance correctly, 2nd. amendmentChristian Tismer2024-03-281-5/+35
| | | | | | | | | | | | | When a Python class does _not_ implement __init__, then we might get the default of object.__init__, which must be skipped like the object class alone. Change-Id: I0416c97854e8d1c9edf0b9ac44d3df58223fef84 Fixes: PYSIDE-2654 Task-number: PYSIDE-2294 Pick-to: 6.5 6.6 6.7 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
* Debug operators: Fix handling of longs exceeding long long maxFriedemann Kleint2024-03-261-3/+9
| | | | | | | | | | Use PyLong_AsUnsignedLongLong if an overflow occurs. Use hex for those large values. Task-number: PYSIDE-2652 Pick-to: 6.7 6.6 6.5 6.2 Change-Id: I9c3404cf8b01b1fcda20516c1105797fc512ed53 Reviewed-by: Christian Tismer <tismer@stackless.com>
* libpyside: Clean up lambdas connected to signals earlier in shutdownFriedemann Kleint2024-03-252-1/+21
| | | | | | | | | | | Run a signal handler cleanup in CoreApplication::aboutToQuit() already before the general cleanup. This prevents them from leaking out of a main() function, for example. Task-number: PYSIDE-2646 Pick-to: 6.7 6.6 6.5 Change-Id: I87cce8d131c40c02b44b0102b3774477676b8f89 Reviewed-by: Christian Tismer <tismer@stackless.com>
* libpyside: Fix spelling error in function nameFriedemann Kleint2024-03-253-10/+10
| | | | | | | | | | Amends 1270a9e82e5bc3bd53a1131698ece60403da1192. Task-number: PYSIDE-2646 Task-number: PYSIDE-2141 Pick-to: 6.7 6.6 6.5 Change-Id: Ib8a5146766166ec4fa7ae7b42ce6d52ccae0b3c6 Reviewed-by: Christian Tismer <tismer@stackless.com>
* Documentation: Use single emphasis for Qt toolsFriedemann Kleint2024-03-2514-38/+38
| | | | | | | | Do some minor corrections. Pick-to: 6.7 Change-Id: If5b3f451a7d4005521bc78bc9683bf7b449d02fc Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
* Documentation: Rename Qt Designer to Qt Widgets DesignerFriedemann Kleint2024-03-2515-49/+57
| | | | | | | | | | | | | Use *Qt Widgets Designer* (emphasis/italics) instead of **Qt Widgets Designer** (bold) consistently. Also fix pyside-designer.rst (Qt Widget Designer -> Qt Widgets Designer). Pick-to: 6.7 Task-number: QTBUG-122253 Change-Id: I573264f5b02c62e4b91cfc0f8b0f38da691defed Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
* Documentation: Link the Qt Widgets Designer custom widget examplesFriedemann Kleint2024-03-252-4/+3
| | | | | | | | As a drive-by, fix the headlines and remove a dead link. Pick-to: 6.7 6.6 Change-Id: Ifb92c0ac7e02e04f3cffe1cb0cc8ff82e8fd803e Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
* Doc: Rearrange tools pageShyamnath Premnadh2024-03-202-177/+175
| | | | | Change-Id: I5f8212fe20ea2ec099769005b4a4920d70d86425 Reviewed-by: Adrian Herrmann <adrian.herrmann@qt.io>