aboutsummaryrefslogtreecommitdiffstats
path: root/tests
Commit message (Collapse)AuthorAgeFilesLines
* Merge remote-tracking branch 'origin/5.9' into 5.10J-P Nurmi2017-09-115-0/+228
|\ | | | | | | | | | | | | | | | | Conflicts: src/quicktemplates2/qquicklabel.cpp src/quicktemplates2/qquicktextarea.cpp src/quicktemplates2/qquicktextfield.cpp Change-Id: Ibbf6bc48972f58fbc6779a87ac9e2434c56c4db8
| * Fix font inheritanceJ-P Nurmi2017-09-112-0/+123
| | | | | | | | | | | | | | | | | | | | In item views, it can happen during incubation that a control doesn't yet have a window associated when the parent item changes. Therefore we must make sure to resolve the font when the window changes. Task-number: QTBUG-63119 Change-Id: I890f70ae6faa232dcc2c094ccec02e76b371d2cb Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
| * Fix non-modal drawer drag/swipe open and closeMichal Policht2017-09-061-0/+83
| | | | | | | | | | | | | | | | | | | | Function QQuickPopupPrivate::blockInput() has been overridden in QQuickDrawerPrivate to accept events that occur while mouse/touch is grabbed and events within drag area. Task-number: QTBUG-59652 Change-Id: Icf4129e702a351b266ea9c4544830185c315fc37 Reviewed-by: J-P Nurmi <jpnurmi@qt.io>
| * QQuickSpinBox: fix initial value validationJ-P Nurmi2017-08-291-0/+6
| | | | | | | | | | | | Task-number: QTBUG-62508 Change-Id: I8981968c02b65d4b005eb9b54b0228fd51a3abda Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
| * Fix a crash with ScrollView + TextAreaJ-P Nurmi2017-08-291-0/+16
| | | | | | | | | | | | | | | | | | TextArea was not cleaning up its geometry change listener on the Flickable it was attached to. Task-number: QTBUG-62292 Change-Id: I31223d4fcf0b46235b18e8eb05bab686a32f5481 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | Update benchmarks for the new stylesJ-P Nurmi2017-09-114-0/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fusion was missing from tst_creationtime, and Imagine was missing from tst_objectcount. Furthermore, they were both missing from the list of dependencies declared in data/dependencies.qml, which is necessary in static builds and also expected to help with a random failure spotted in the CI logs: QWARN : tst_ObjectCount::qobjects(fusion/ApplicationWindow.qml) QQmlComponent: Component is not ready FAIL! : tst_ObjectCount::qobjects(fusion/ApplicationWindow.qml) 'object.data()' returned FALSE. (file:///C:/Users/qt/work/install/qml/QtQuick/Controls.2/Fusion/ApplicationWindow.qml:40 module "QtQuick.Controls.Fusion" version 2.3 is not installed) tst_objectcount.cpp(141) : failure location Change-Id: Ibb85b3024f1bb9d1e2a9654aeba39adb378fdec6 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | benchmarks: avoid "Empty filename passed to function" warningsJ-P Nurmi2017-09-072-6/+12
| | | | | | | | | | | | | | | | Add isEmpty() checks to avoid annoying warnings from QFileSystemEngine for Unix. Change-Id: I20b4f07605692271468dfc26b3c968406323de98 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* | tst_creationtime: exclude ApplicationWindowJ-P Nurmi2017-09-071-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | Creating huge amounts of Q(Quick)Window instances puts an unreasonable stress on the system and we start facing issues such as that OpenGL context creation starts failing and things explode: qt.scenegraph.renderloop QSGGuiThreadRenderLoop::windowDestroyed - cleanup without an OpenGL context Change-Id: Iaf4725633af5def7fbb2df1f12ff61e4b543e5e2 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | Bump QtQuick 2.9 imports to 2.10Mitch Curtis2017-09-0654-55/+55
| | | | | | | | | | Change-Id: I274146911cd8a204fcbf439da9259b0a38c8092e Reviewed-by: J-P Nurmi <jpnurmi@qt.io>
* | Merge "Merge remote-tracking branch 'origin/5.10' into dev" into ↵J-P Nurmi2017-09-011-1/+15
|\ \ | | | | | | | | | refs/staging/dev
| * \ Merge remote-tracking branch 'origin/5.10' into devJ-P Nurmi2017-09-011-1/+15
| |\ \ | | | | | | | | | | | | Change-Id: I581d64b0c3fbf98750756c9386c6166051834252
| | * | Fix accessibility-related performance regressionsJ-P Nurmi2017-08-311-1/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Before 089dd16f, we had a QQuickControlPrivate::accessibleAttached member that indicated whether accessibility was active. Since 4be38ab in qtdeclarative, it was possible to access QQuickAccessibleAttached:: attachedProperties() directly, but we ended up accidentally accessing it even when accessibility was not active, which added noticeable overhead. This improves those qmlbench test cases that call accessibility-aware setters such as QQuickAbstractButton::setChecked() a lot. For example, the test cases for CheckBox and RadioButton create large amounts of controls with a "checked: index % 2" binding. - CheckBox: 84 => 93 frames - RadioButton: 98 => 113 frames QAccessible::setActive(true) only notifies the observers, but does not really make accessibility active in the sense that the consequent calls to QAccessible::isActive() still return false. tst_accessible had to be changed to use QPlatformAccessible::setActive() instead. Change-Id: I8fd0fe2dddfd5633ce22a080bcda459f2d6e443e Reviewed-by: Liang Qi <liang.qi@qt.io>
* | | | tst_combobox: remove bogus mouse highlight checksJ-P Nurmi2017-09-011-12/+0
|/ / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ComboBox gained mouse hover support in Qt 5.9. The highlighted() signal is now emitted during the test, because 4c46dce8f in qtdeclarative made QuickTest use QTest::mouseXxx(), which in turn calls the window system interface to deliver mouse events, and consequently, items in the combo box receive hover events. Before, QuickTest was sending mouse events directly, so there were no hover events involved. There is a separate test_mouseHighlight() function for the mouse highlighting functionality, so these tests can be simply removed. Task-number: QTBUG-62926 Change-Id: I7e5e0df993a9c2f78bae641bdfa9189f3cd0cc67 Reviewed-by: Albert Astals Cid <albert.astals.cid@kdab.com> Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
* / / Add ApplicationWindow::menuBarJ-P Nurmi2017-08-312-1/+15
|/ / | | | | | | | | | | | | A follow-up commit to 66faa149. Change-Id: I94c92752d54ae0ca4878da72915b3d83461a4124 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | SwipeDelegate: grab the mouse when accepting a press eventShawn Rutledge2017-08-255-100/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | After 1f4bfc099b7e48e2cc3dd9488b7b42a96122b299 in qtdeclarative, QQuickWindow does not cause the Item to which it's about to attempt to deliver an event to pre-grab. (That caused a lot of thrashing of the grabber, so not doing that is a nice simplification, and also avoids the need to ungrab later, and also makes mouse event handling more like touch event handling.) So whenever SwipeDelegate knows at the time of mouse press that it wants to see the release too, it should grab. The grabber can be either the Item for which it's filtering events, or the SwipeDelegate itself, whichever is more appropriate in any given scenario. For now I assume it should be the delivery-target Item, because that's what would have had the grab before. Task-number: QTBUG-62412 Task-number: QTBUG-62631 Change-Id: Ie01276508c6602b10f9d7996a748ffe90efa36b5 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io> Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
* | Blacklist tst_popup temporarilyFrederik Gladhorn2017-08-231-0/+10
| | | | | | | | | | | | | | | | We need to get the 5.10 alpha out and know that there are issues with the pointer handlers. Let's fix them while letting everyone else progress. Change-Id: I3624a7548d9a4fd00b8ef473d2b7a64302552cbe Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | tst_Drawer: blacklist several test functionsLiang Qi2017-08-221-0/+14
| | | | | | | | | | | | | | | | | | | | | | | | This test started failing after the recent wip/pointerhandler to dev merge in declarative. Until a fix can be found, we'll blacklist the test so that integration isn't blocked. The issue will need to be fixed before the release. Task-number: QTBUG-62628 Change-Id: I1be77c6b2080f388ecd36aeb502e36e448c5ad62 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | Fix tests for boot2qtSami Nurmenniemi2017-08-227-6/+31
| | | | | | | | | | | | | | | | | | | | | | | | | | | | The tests for boot2qt were disabled with commit 28063805bf22b77a93f22a4289ca8afa9f1cb201. The tests can be enabled since qtdeclarative now fallbacks to software renderer if OpenGL is not supported. Some tests involving mouse behavior and window grabbing need to be skipped on minimal/offscreen platforms. Task-number: QTBUG-60268 Change-Id: Ib468638df8d5001bf127dd17aee7dcfe38b11780 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | skip tst_dialog::reject() instead of blacklisting itMitch Curtis2017-08-226-20/+2
| | | | | | | | | | | | | | | | | | | | | | | | Running this test causes tests after it to fail, mainly those related to hover. Since we need to fix the root cause of the recent failures before the release, it shouldn’t matter too much that this test isn’t run for a bit. Task-number: QTBUG-62549 Change-Id: Id8fd00e9049890ae47504c3e4b4ea3dda8ac60ef Reviewed-by: Jani Heikkinen <jani.heikkinen@qt.io> Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | tst_dialog: blacklist test_reject()Mitch Curtis2017-08-195-0/+20
| | | | | | | | | | | | | | | | | | | | | | | | This test started failing after the recent wip/pointerhandler to dev merge in declarative. Until a fix can be found, we'll blacklist the test so that integration isn't blocked. The issue will need to be fixed before the release. Task-number: QTBUG-62549 Change-Id: Ib72c39ca74c69cf33bd995f9572bf4a9a5b2f680 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | tst_swipedelegate: blacklist failing testsMitch Curtis2017-08-195-0/+100
| | | | | | | | | | | | | | | | | | | | | | | | Some tests started failing after the recent wip/pointerhandler to dev merge in declarative. Until a fix can be found, we'll blacklist the tests so that integration isn't blocked. The issues will need to be fixed before the release. Task-number: QTBUG-62412 Change-Id: Idfa887f979c946311136a4ee1438ee2921267214 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Merge remote-tracking branch 'origin/5.9' into devLiang Qi2017-08-153-0/+127
|\| | | | | | | | | | | | | Conflicts: tests/auto/popup/tst_popup.cpp Change-Id: I32e6c6b646a00f8805cb82d181417db60a6fe6c8
| * StackView: Resolve relative urls in initialItemAlessandro Portale2017-08-071-0/+6
| | | | | | | | | | | | | | Check whether a URL is relative and try to resolve that. Change-Id: I6b0f7bca2011356aca5071d20dbd270eb5d115bf Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
| * Popups: take Window::contentOrientation into accountJ-P Nurmi2017-07-272-0/+108
| | | | | | | | | | | | Task-number: QTBUG-62158 Change-Id: I0bcf5b02da6a3500e4324462d5f1249a6178c9fd Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
| * Fix QQuickStackViewPrivate::viewItemTransitionFinished()J-P Nurmi2017-07-261-0/+13
| | | | | | | | | | | | | | | | | | | | | | ~QQuickStackElement() emits QQuickStackViewAttached::removed(), which may be used to modify the stack. Set the status first and make a copy of the destroyable stack elements to exclude any modifications that may happen during the loop. Task-number: QTBUG-62153 Change-Id: I144acd693519e637b78f9a2d910e83da8f2d779e Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | Fix failing tests in tst_menu and tst_qquickmenubarMitch Curtis2017-08-096-11/+23
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | As mentioned in the bug report for the failing tst_qquickmenubar test, the window is sometimes opened at the bottom right corner of the screen on the Ubuntu CI machines. However, even after centering the window on the screen, the old setPos() call still caused the tests to fail. So, we position the cursor past a different corner of the window, which works.. though I don't know why. Task-number: QTBUG-62363 Task-number: QTBUG-62383 Change-Id: I3649230002eaac5a6391daff24427e6f9f58cfa5 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Blacklist tst_menu::mouse on Ubuntu 16.04 CI machinesMitch Curtis2017-08-081-0/+5
| | | | | | | | | | | | | | Task-number: QTBUG-62383 Change-Id: Icabecdeebf1e00a5828dc16a091ca9503202bb1a Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Blacklist qquickmenubar::mouse on Ubuntu 16.04 CI machinesMitch Curtis2017-08-071-0/+5
| | | | | | | | | | | | | | Task-number: QTBUG-62363 Change-Id: I325b567ed32d6d584d31466fa67479b253ca5a66 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | tst_switch: fix test_mouse/test_touch failuresMitch Curtis2017-08-021-4/+4
| | | | | | | | | | | | | | | | Use the correct coordinates for the middle of the switch. Task-number: QTBUG-62241 Change-Id: Ibb3f21d72731d0d1a227a0af98e537cc80536953 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
* | Add Imagine styleJ-P Nurmi2017-07-3131-5/+354
| | | | | | | | | | | | | | | | | | | | | | | | | | The Imagine style is based on image assets. The style comes with a default set of images, but the images can be easily changed by providing a directory with images using a predefined naming convention. [ChangeLog][Controls] Added the Imagine style, which is based on image assets that can be provided using a predefined naming convention. Task-number: QTPM-517 Change-Id: I550d7dac9a9686d60bec15655ac92dea9f36149c Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | Introduce MenuBarJ-P Nurmi2017-07-265-1/+738
| | | | | | | | | | | | | | | | | | | | | | | | | | | | MenuBar is an ordinary Item. It can be located basically anywhere, but the idea is to introduce a new ApplicationWindow::menuBar property in a follow-up commit. Currently the example snippets are using the header property. [ChangeLog][Controls][MenuBar] Introduced a MenuBar control. Task-number: QTBUG-60350 Change-Id: Ie66dc457a3d8edbe8362fab2a591dc49442c95e2 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | tst_popup::test_margins(): use T.PopupJ-P Nurmi2017-07-211-1/+1
| | | | | | | | | | | | | | | | The test assumes that the background doesn't have implicit size => doesn't pass with the Imagine style that uses an image element. Change-Id: Id40eb9b7093fdd6ef80c474c97a18d8cea27a493 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | Auto tests: incorporate the QEvent::Leave trick to moveMouseAway()J-P Nurmi2017-07-212-6/+7
| | | | | | | | | | | | | | | | | | | | | | 6f1eba89 used QEvent::Leave to make QQuickWindow clear its last known mouse position, which ensures that QQuickWindow won't send unexpected hover events from flushFrameSynchronousEvents(). The same hover events are causing trouble in tst_qquickmenubar too, so incorporate the leave event trick to moveMouseAway() to benefit from it in other tests too. Change-Id: I25a285d008d1cb639c7be09d714e482d472b4e50 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | Merge remote-tracking branch 'origin/5.9' into devJ-P Nurmi2017-07-212-0/+197
|\| | | | | | | Change-Id: Idb1895dae2870dbed860ba3106fe52b01d733504
| * QQuickDrawer: fix multi-touch leaking through modal overlayJ-P Nurmi2017-07-142-0/+197
| | | | | | | | | | | | | | | | | | | | The first touch point was blocked as appropriate, but the consequent touch points were leaking through to other popups below Drawers' modal overlay. Task-number: QTBUG-61581 Change-Id: I1c3e28e3d25b7489c4a9b684107fd1b5158e1674 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | Fix tst_pageindicator::test_interactive()J-P Nurmi2017-07-211-1/+1
| | | | | | | | | | | | | | | | | | | | The Imagine style has to set top/left/right/bottom paddings separately. When the individual paddings are explicitly set, the generic padding property has no effect. Make the test set the required paddings so that it works also with the Imagine style. Change-Id: I8c4139917f397c8729817a54ad68c88d960dd479 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | Fix tst_popup::test_size()J-P Nurmi2017-07-211-0/+4
| | | | | | | | | | | | | | The same fix we applied to tst_tabbar::test_layout() earlier. Change-Id: Id6d67aef66f01c14275c86dbd9ed0a7fa4244640 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | Fix tst_tumblerJ-P Nurmi2017-07-201-1/+3
| | | | | | | | | | | | | | | | | | findView() was iterating recursively the children of the control's first child, but excluding the siblings. If the background item was the first child, the contentItem was ignored. Change-Id: I570361e65fc649234b25eb869c6533660a79a2c7 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | Fix tst_textfieldJ-P Nurmi2017-07-201-4/+8
| | | | | | | | | | | | | | | | | | Don't assume writable implicit size for the background, and check that the PlaceholderText element has a text property to allow Image elements as children. Change-Id: Ia5cadc2a0e289c2aaa0bc8c06b900487decead9e Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | Fix tst_tabbar::test_layout()J-P Nurmi2017-07-201-4/+3
| | | | | | | | | | | | | | | | | | The implicit size of the background can be read-only (the Imagine style has a background image), so reset the whole background instead of trying to reset its implicit size. Change-Id: I499f7ade13094064709a5a25153ad39ee14205d3 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | Fix tst_page::test_twoChildren()J-P Nurmi2017-07-201-2/+4
| | | | | | | | | | | | | | | | Allow the background to have an implicit size. The Imagine style has a background image so it has an implicit size. Change-Id: I39b41d265cb36959b198e6dac6024f6b91f3c5c6 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | testbench: add dialog, flat buttons, make toolbar scalableMitch Curtis2017-07-191-11/+62
| | | | | | | | | | Change-Id: If29604b8131ded53bd947097b00e5fab4d41dd2e Reviewed-by: J-P Nurmi <jpnurmi@qt.io>
* | Add QQuickMenu::countJ-P Nurmi2017-07-121-0/+30
| | | | | | | | | | | | | | [ChangeLog][Controls][Menu] Added "count" property. Change-Id: I42971a6bf8fd74b9f2d3df52f191b66cd7022b81 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | QQuickMenu::popup(): allow a parent argumentJ-P Nurmi2017-07-122-13/+110
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The parent argument is handy for sharing a single context menu instance for multiple listview items: ListView { delegate: ItemDelegate { onPressAndHold: contextMenu.popup(this) } Menu { id: contextMenu } } Change-Id: I77ff87ee03d2d1b53485863ab9c99f3226496dfc Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | QQuickPopup: add reset-method for parentJ-P Nurmi2017-07-121-0/+22
| | | | | | | | | | Change-Id: Ia7d205bacf4da4cb13e31ab34fb62d13a77f7ddd Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | Merge remote-tracking branch 'origin/5.9' into devJ-P Nurmi2017-07-119-9/+250
|\| | | | | | | | | | | | | | | Conflicts: .qmake.conf tests/auto/controls/data/tst_scrollindicator.qml Change-Id: I1f5581ae7814c0d4152e4c9b79a30a8af5a3a17b
| * Fix focus handling for popupsJ-P Nurmi2017-07-112-4/+55
| | | | | | | | | | | | | | | | | | | | | | | | When a popup is closed, if there are multiple popups open, restore focus to the next popup in chain instead of transferring focus to the window content. This allows us to cleanup the custom focus handling for sub-menus in dev. There is no more need to manually transfer focus to the parent menu or to a sub-menu, but calling open() or close() is enough and the focus is automatically transferred as expected. Change-Id: I54406c7c6b8dd25af261e00ebb1ae00ccbea8b9f Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
| * Drawer: ignore and warn about invalid edge valuesMitch Curtis2017-07-071-0/+10
| | | | | | | | | | | | | | | | | | This fixes an issue where an application would crash when opening a drawer by dragging it after an invalid edge value had been set. Task-number: QTBUG-61843 Change-Id: Ie9b9ea0276b356b92927b858f2be355bfc042afb Reviewed-by: J-P Nurmi <jpnurmi@qt.io>
| * Tumbler: fix regression with currentIndex and currentItemMitch Curtis2017-07-072-1/+39
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 2c4b2d48 made Tumbler's wrap property follow its count by default, but did so using updatePolish() to account for the use case where a items are appended to the model in a for loop, as is done in TumblerDatePicker.qml in Tumbler's auto tests. This (appending items one at a time in a for loop) is not a good idea, but it should work. The problem with the solution is that the delay means that the use cases mentioned in the referenced bug report were broken. This patch removes the delay. The recursion guards are necessary due to the complex nature of TumblerView (and its non-standard use of the Qt Quick views), as they prevent a memory leak in QQuickListView::createHighlight() from being introuduced. We now call deleteLater() to ensure we do not interfere with the views' internal operations, and hence we also perform a few extra operations at the same time as insurance (although it appears that simply unparenting the internal view from QQuickTumblerView is enough to get the tests to pass). Task-number: QTBUG-61374 Change-Id: Ifef9e99522ea183b282ac862f346beaed12d0c09 Reviewed-by: J-P Nurmi <jpnurmi@qt.io>
| * Fix modal overlay to block multi-touchJ-P Nurmi2017-07-041-0/+34
| | | | | | | | | | | | Task-number: QTBUG-61698 Change-Id: I46db5e9816190ac7afd6b671198dff11089bc4f3 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>