summaryrefslogtreecommitdiffstats
path: root/tests/auto
Commit message (Collapse)AuthorAgeFilesLines
* Improve std::tuple handling in testsSamuel Gaist2018-06-0310-0/+228
| | | | | | | | | | | | | Currently when doing comparison with std::tuple the fallback toString method is called which returns a Q_NULLPTR thus not allowing proper diagnostic of the values that triggered an error. This patch adds support for std::tuple to improve the tests output readability. [ChangeLog][QtTest][QCOMPARE] Now outputs contents of std::tuple on failure. Change-Id: I046a55e2ce44c3f7728d51e4745120d38aa5e007 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QLineEdit: Add an inputRejected() signal for when a key is not allowedAndy Shaw2018-06-011-1/+40
| | | | | | | | | | [ChangeLog][QtWidgets][QLineEdit] Added inputRejected() signal for when a key press is not accepted by the QLineEdit. For instance, when an invalid key is pressed for a validator set. Task-number: QTBUG-57448 Change-Id: I39182a78b07b37c6da01905b8da4c57930e3454b Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
* Eliminate an un-needed #includeEdward Welbourne2018-05-311-1/+0
| | | | | | | Nothing in this test references date-times. Change-Id: I4005cda550d54abe46370963b1e91fab9829298d Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
* Provide presets for QGradientTor Arne Vestbø2018-05-311-0/+21
| | | | | | | | | | | | | Similar to Qt::GlobalColor, the presets allow the user to create brushes based on predefined gradients, quickly getting pretty pixels on screen. The presets are based on the linear gradients from WebGradients, a free collection of gradients, hosted at https://webgradients.com/. The few radial and blended gradient presets have been excluded. Change-Id: I1ce8f2210a6045c9edb8829ab3eddcc313549127 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
* tst_qstandardpaths: #if-out a function only used within #if-eryEdward Welbourne2018-05-311-0/+2
| | | | | | | | Avoids an unused function warning. Change-Id: Id221595920e9a34eb83b66fe123d664f60fcae05 Reviewed-by: Mikhail Svetkin <mikhail.svetkin@qt.io> Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
* Show the display role inside the editor for the relation in a QComboBoxAndy Shaw2018-05-292-0/+175
| | | | | | | | | | | | | | | When a QComboBox is used as the editor for a relation inside a view then it could end up showing the contents of the EditRole. This would be the field which is used to represent the entry as opposed to the DisplayRole which is what the user would expect to see is. Therefore, setEditorData() is overridden to ensure that it is showing the right data to the user. When the model gets updated, it will take the corresponding EditRole value as before to ensure it is updated correctly. Task-number: QTBUG-59632 Change-Id: Ibbccc3e9477de1cdefb654051b97dd111df36382 Reviewed-by: Jesus Fernandez <Jesus.Fernandez@qt.io>
* Merge remote-tracking branch 'origin/5.11' into devQt Forward Merge Bot2018-05-291-4/+14
|\ | | | | | | Change-Id: I8d8b03ea46c537b091b72dc7b68aa6aa3a627ba6
| * QSortFilterProxyModel: don't assert when old model gets destroyedChristian Ehrlicher2018-05-261-4/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | When a new model was set with setSourceModel() and the mapping was built up, the destruction of the old model caused a reset in the QSortFilterProxyModel which lead to an empty view or an assertion. Now we properly disconnect the old model again and also clean up the old mapping/persistent indexes when a new source model is set. Task-number: QTBUG-44962 Task-number: QTBUG-67948 Task-number: QTBUG-68427 Change-Id: I2e0612899c210bde3ac0cfa59aefd78269deee5b Reviewed-by: David Faure <david.faure@kdab.com>
* | Tests: replace deprecated QDesktopWidget::screenGeometry()Christian Ehrlicher2018-05-287-36/+28
| | | | | | | | | | | | | | | | QDesktopWidget::screenGeometry() and similar was deprecated in 5.11 and replaced by QScreen::geometry() Change-Id: Ic630d022bc6461af78f49684c8ac9d1836d738bc Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
* | winrt: Skip/blacklist failing opengl testsOliver Wolff2018-05-283-3/+3
| | | | | | | | | | | | Task-number: QTBUG-68297 Change-Id: I1396b658b49baf5a8d4b97e35c22ddc25727b68a Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
* | winrt: fix tst_QFocusEventOliver Wolff2018-05-281-2/+3
| | | | | | | | | | Change-Id: Ib2e82554c09a88a20fd789213a3040d6c6e42383 Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
* | winrt: Make tst_qfocusevent pass in CIOliver Wolff2018-05-281-0/+1
| | | | | | | | | | | | Task-number: QTBUG-68297 Change-Id: I72d668103b86e26b15c0b818f87a58ae2ffe2d31 Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
* | Fix tst_qtextedit for configurations with builtin testdataOliver Wolff2018-05-281-0/+2
| | | | | | | | | | Change-Id: Ic692acd8053a02270416deb1be3d58a5f0424526 Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
* | Fix tst_qcombobox for configurations with builtin testdataOliver Wolff2018-05-281-0/+2
| | | | | | | | | | Change-Id: Id3a1166428873618b253989da98ccdbe13afd1a0 Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
* | winrt: make graphicsview auto tests passOliver Wolff2018-05-284-1/+24
| | | | | | | | | | | | Task-number: QTBUG-68297 Change-Id: I627f9be20670d8e00f824ae85139fb1c4088033c Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
* | winrt: Remove qfiledialog and qmessagebox auto tests for nowOliver Wolff2018-05-281-0/+1
| | | | | | | | | | | | Task-number: QTBUG-68297 Change-Id: Ie126d07edfcdcec179c38d03e79079339d29020b Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
* | Long live QCborStreamReader!Thiago Macieira2018-05-273-0/+947
| | | | | | | | | | | | | | | | | | | | This is the counterpart of the previous commit. [ChangeLog][QtCore] Added QCborStreamReader and QCborStreamWriter, classes for low-level reading and writing of CBOR streams. Change-Id: Ia0aac2f09e9245339951ffff13c72e4bffdf4a56 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
* | Long live QCborStreamWriter!Thiago Macieira2018-05-273-0/+322
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | CBOR is the Concise Binary Object Representation, a very compact form of binary data encoding that is compatible with JSON. It was created by the IETF Constrained RESTful Environments (CoRE) WG[1] and has since been used in many new RFCs by that group, especially COSE[2], and is meant to be used alongside CoAP[3]. This API is a very simple, thin wrapper around TinyCBOR[4]. See RFC 7049 <http://tools.ietf.org/html/rfc7049>. [1] https://datatracker.ietf.org/wg/core/charter/ [2] https://tools.ietf.org/html/rfc8152 [3] https://tools.ietf.org/html/rfc7252 [4] https://github.com/intel/tinycbor Change-Id: Ia0aac2f09e9245339951ffff13c651cfeab77d3b Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
* | Deregister QTextCodec on destructionIgor Mironchik2018-05-261-1/+6
| | | | | | | | | | | | | | | | | | | | | | QTextCodec automatically deregisters on destruction now. [ChangeLog][QtCore][QTextCodec] QTextCodec automatically deregisters on destruction now. Task-number: QTBUG-56203 Change-Id: Ic9a66c512642c9913aa27ea5167b9f7341e7f0fe Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* | tst_qapplication: Fix test for configs without process supportOliver Wolff2018-05-251-0/+2
| | | | | | | | | | Change-Id: If591183cd246b852821fcf8e354f5247aa7ba373 Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
* | winrt: Make widgets/util auto tests passOliver Wolff2018-05-251-0/+9
| | | | | | | | | | | | Task-number: QTBUG-68297 Change-Id: I12d2a431f927b29c4df2b3a6ddd3e5978916e136 Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
* | tst_qapplication: Fix auto test for configs with builtin_testdataOliver Wolff2018-05-252-1/+7
| | | | | | | | | | Change-Id: Ie5b4dad19387c18e0d11d44b9b1a735269ec5e04 Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
* | winrt: Make widgets/styles auto tests passOliver Wolff2018-05-251-2/+8
| | | | | | | | | | Change-Id: I5224d1cb4bb9ccc82d6c36ccacbd8af7a9bec0ad Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
* | winrt: skip accessibility testOliver Wolff2018-05-251-1/+1
| | | | | | | | | | | | Task-number: QTBUG-68297 Change-Id: Idfe86a21842982a775c9774f3e431789a7dc07a8 Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
* | Merge remote-tracking branch 'origin/5.11' into devLiang Qi2018-05-2413-86/+87
|\| | | | | | | | | | | | | | | | | | | Conflicts: mkspecs/features/qt_common.prf src/corelib/tools/qstring.cpp src/plugins/platforms/windows/qwindowsmousehandler.cpp src/widgets/widgets/qmainwindowlayout_p.h Change-Id: I5df613008f6336f69b257d08e49a133d033a9d65
| * Fix tst_QDoubleSpinBox::editingFinished failing after other testsKari Oikarinen2018-05-181-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | Wait for the spinbox to show become active in the previous test. Also use QWidget::activateWindow() instead of QApplication::setActiveWindow(). Use of the latter seemed to result in some confusion where QWidget::isActiveWindow() returned true but QWindow::isActive() on the underlying window returned false, leading qWaitForWindowActive() to fail. Also remove superfluous setting of focus. It was just set and verified. Change-Id: I023cdc2d272e23b2537b32606b7a3bf35bf671ac Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
| * Add support for QSharedPointer<cv qualified>::create()Thiago Macieira2018-05-171-0/+8
| | | | | | | | | | | | | | | | | | | | [ChangeLog][QtCore][QSharedPointer] Fixed a problem that made create() on a type with const qualification fail to compile. Task-number: QTBUG-68300 Change-Id: I0825ff5b5f6f4c85939ffffd152f3e55e5b9caae Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io> Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Remove a reference to a no longer used database serverAndy Shaw2018-05-161-2/+0
| | | | | | | | | | | | Task-number: QTBUG-32390 Change-Id: I7556507267be04ca50c4ad0c7d49f3aa5fe31a90 Reviewed-by: Jesus Fernandez <Jesus.Fernandez@qt.io>
| * sqlite: Allow for duplicated placeholders with just one placeholderAndy Shaw2018-05-161-0/+10
| | | | | | | | | | | | | | | | | | | | This accounts for a case of a placeholder being duplicated in the prepare query, but where only one placeholder was used. This amends e4e87a2ece1e0c9901514fea094f31863b64b570 Task-number: QTBUG-68299 Change-Id: Ia92ee912facd51a13e7222886debb219b24442b0 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * tst_QCommandLinkButton: Add back wait to the beginning of setAutoRepeat()Kari Oikarinen2018-05-161-6/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | setAutoRepeat() is failing on macOS and Windows when run together with defaultAndAutoDefault(). It succeeds when run on its own. Adding the wait allows it to succeed when run with the other tests as well. Amends 0cb940b1d3b9a1ba50f2d1973fca411706da266d, which removed the wait. The comment is the same as before. I couldn't see a better way to replace the wait (QApplication::topLevelWidgets() already returns only the testWidget and testWidget->isActiveWindow() returns true). Another theory I had was something waiting for the KeyRelease so I changed QApplication::sendEvent() uses to QTest::keyClick(). It did not help but that still seems preferable. Change-Id: If87d1e6e018751f3068ea4c913ae6731aba41ff0 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
| * Skip tst_QProcess::processesInMultipleThreads under QEMUKari Oikarinen2018-05-142-0/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | tst_QProcess hangs sometimes in QEMU. Based on my experiments in a debug VM the offending test seems to be processesInMultipleThreads(), since that was were I was able to reproduce the hanging in. Since the whole test executable hangs, blacklisting is not enough, so skip the test. Task-number: QTBUG-67760 Change-Id: I34f8852be955a8612deac22b369f68d79a139d11 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
| * Treat the Content-Disposition header as a known headerAndy Shaw2018-05-141-0/+3
| | | | | | | | | | Change-Id: I307f67b10759d17f603a340b14266ab47d195497 Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
| * QJsonDocument: Avoid overflow of string lengthsJüri Valdmann2018-05-142-0/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The added test case contains the binary JSON equivalent of ["ž"] with the modification that the string's length has been set to INT_MAX. In Value::usedStorage this length is used through the pointer d like so s = sizeof(int) + sizeof(ushort) * qFromLittleEndian(*(int *)d); Because 2 * INT_MAX is UINT_MAX-1, the expression as a whole evaluates to 2, which is considered a valid storage size. However, when converting this binary JSON into ordinary JSON we will attempt to construct a QString of length INT_MAX. Fixed by using String::isValid instead of Value::usedStorage. This method already takes care to avoid the overflow problem. Additionally, I've tried in this patch to clarify the behavior of Value::isValid a bit by writing it in a style that is hopefully more amenable to structural induction. Finally, the test case added in my previous patch had the wrong file extension and is renamed in this one. Task-number: QTBUG-61969 Change-Id: I45d891f2467a71d8d105822ef7eb1a73c3efa67a Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
| * tests/auto/widgets/dialogs: Avoid unconditional qWait()sKari Oikarinen2018-05-144-76/+50
| | | | | | | | | | | | | | | | Task-number: QTBUG-63992 Change-Id: I679a0f482ec2c3ed5d896f1c40c67d9932c6fc18 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
* | tst_qpicture: Remove dependency on widgetsFriedemann Kleint2018-05-242-27/+12
| | | | | | | | | | | | | | | | Use the screen resolution obtained from QScreen instead of QDesktopWidget. Change-Id: If27bcf1c94a783c4c617d5364846b95a625bb93d Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
* | Apply Qt::ControlModifier to all spin box interactionsNathan Collins2018-05-243-28/+1247
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | A step modifier already existed when scrolling with the Qt::ControlModifier held. This patch applies this functionality to other methods of stepping a spin box. Holding the modifier increases the step rate when: - scrolling; - pressing the up/down keys; - pressing the spin box up/down buttons. [ChangeLog][QtWidgets][QAbstractSpinBox] The Qt::ControlModifier increases the number of steps a QAbstractSpinBox takes for the following interactions: scrolling, up/down keyboard keys and the spin box buttons. Previously, Qt::ControlModifier only affected scrolling. Task-number: QTBUG-67380 Change-Id: Icc8754d5c007da0771bfaef113603a2f334dd494 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | Fix build with --no-feature-wheeleventNathan Collins2018-05-231-0/+4
| | | | | | | | | | | | | | | | tst_QListView::horizontalScrollingByVerticalWheelEvents failed to compile with this qmake argument. Change-Id: I35dd4ad4c9ee92c06c94b21dd7325aee00fc98d4 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | Improve bounding rect of QStaticText with Qt::PlainTextAllan Sandfeld Jensen2018-05-231-0/+67
| | | | | | | | | | | | | | | | | | The bounding rect was not including positive leading of the last line. This patch solves it by changing using QTextLine's setLeadingIncluded, and adds handling of negative leading to keep rendering unchanged in that case. Change-Id: I4d18b81892184bb85cd7949a5dc3fb9cfa270a26 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
* | Optimize unpremultiply using SSE rcpAllan Sandfeld Jensen2018-05-231-1/+19
| | | | | | | | | | Change-Id: I255031d354b0fde7abe8366ea2c86a35f9f24afd Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* | Add attribute to indicate a widget was the target of a style sheetAaron Kennedy2018-05-231-0/+55
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Qt already has the widget attribute WA_StyleSheet to which indicates that a widget was subject to a style sheet, but it doesn't indicate that the widget was actually affected by the style sheet. For example, an application style sheet will set the WA_StyleSheet attribute on all widgets, even if it only targets QPushButtons. The WA_StyleSheetTarget new attribute pairs with WA_StyleSheet to give this extra information. [ChangeLog][QtWidgets] Added the Qt::WA_StyleSheetTarget attribute to indicate that a widget was affected by a style sheet. Change-Id: I7cca18ddec8fbb69f294ae2ef990672a5f4f1d83 Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@qt.io> Reviewed-by: Sérgio Martins <sergio.martins@kdab.com>
* | Stabilize tst_QFileDialog2::QTBUG4419_lineEditSelectAllKari Oikarinen2018-05-211-1/+1
| | | | | | | | | | | | | | | | | | | | On macOS the selected text was empty when run together with other tests. Change QApplication::setActiveWindow() to QWidget::activateWindow() to get keyboard focus as well. After that the expected temporary file name is selected. Change-Id: I3b0c2bfca8008cb89b7e666a362beb15a851d8e0 Reviewed-by: Sami Nurmenniemi <sami.nurmenniemi@qt.io> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
* | tst_QGraphicsEffect: Allow multiple paint events in itemHasNoContents()Kari Oikarinen2018-05-211-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | Right now itemHasNoContents() is flaky when run together with others on macOS. The failing assertion seems to be just checking that an effect added to an item with the QGraphicsEffect::ItemHasNoContents flag is painted, so relax it to allow multiple repaints. Change-Id: Iecf445ce1bce672e7cd180a148cd53f9c60e40fe Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
* | Windows: Add support for invisible window marginsAndre de la Rocha2018-05-181-3/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Windows 10 windows contain an invisible area within the NC window frame on which the mouse cursor is enabled to perform resizing. This change captures the geometry of the invisible margins and considers it when moving a window, so that, for instance, a move(0,0) does not generate gap between the window and the beginning of screen. [ChangeLog][Windows] The dimensions of invisible margins inside the frames of Windows 10 windows will now be disregarded in the positioning of Qt windows to avoid a misplaced look (offset by a few pixels from the expected position). Task-number: QTBUG-55762 Change-Id: I1f537756eb1a093f78b919de9d44992528199700 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
* | Merge "Merge remote-tracking branch 'origin/5.11' into dev" into ↵Liang Qi2018-05-1418-355/+177
|\ \ | | | | | | | | | refs/staging/dev
| * | Merge remote-tracking branch 'origin/5.11' into devLiang Qi2018-05-1418-355/+177
| |\| | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: mkspecs/features/qt_module_headers.prf tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp tests/auto/widgets/kernel/qwidget/BLACKLIST Change-Id: I2a08952d28d1d0e3d73f521a3d44700ce79ff16c
| | * tests/auto/widgets/graphicsview: Avoid unconditional qWait()sKari Oikarinen2018-05-146-188/+70
| | | | | | | | | | | | | | | | | | | | | | | | Task-number: QTBUG-63992 Change-Id: Ibbcf5bf968fcf1b1c3a043c805bdcc23a4005f00 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Gatis Paeglis <gatis.paeglis@qt.io>
| | * OpenSSL v1.1.1: fix qtbug18498_peekMårten Nordheim2018-05-111-2/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously the test worked because the client was the last party to know when encryption was established. However, due to changes in the TLSv1.3 handshake the server is now the last one. In either case, relying on both to be encrypted when one of them is finished is not great, so now we only quit the event loop when both client and server have emitted 'encrypted'. Change-Id: Ic1fc75671206d866f7ea983805fd58a99657aac6 Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
| | * Blacklist tst_QWidget::raise on openSUSEKari Oikarinen2018-05-091-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | The test occasionally gets an unexpected paint event on openSUSE. Task-number: QTBUG-68175 Change-Id: I998d79dd12aac1f924c14d7ff7e864c4f081983c Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Gatis Paeglis <gatis.paeglis@qt.io>
| | * Stabilize tst_QMdiArea::subWindowListKari Oikarinen2018-05-091-6/+4
| | | | | | | | | | | | | | | | | | | | | | | | Flakily failed on openSUSE. Task-number: QTBUG-68170 Change-Id: Ic75e081238ccf4bad54de39e6bdaa892796b599e Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
| | * tests/auto/widgets/itemviews: Avoid unconditional qWait()sKari Oikarinen2018-05-099-170/+90
| | | | | | | | | | | | | | | | | | | | | Task-number: QTBUG-63992 Change-Id: Id4fcb0c2e4f83edd9508565468e16f57e100c780 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>