Replace BOOTSTRAP option with the single value CORE_LIBRARY argument
in qt_internal_add_tool and qt_internal_add_executable functions.
The introduced argument now may accept 'Bootstap' and 'None' values.
Use 'Bootstap' to link Qt::Boostrap library instead Qt::Core or 'None'
to avoid any core library linking. This is useful for tools that need
to use the CMake deployment routines, but not require the Qt::Core
functionality.
Task-number: QTBUG-87480
Change-Id: I64a8b17f16ac5fe43c6b385252dc21def0c88d2c
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
The operators were exported, but not implemented.
Change-Id: I6c89c1f4b76040d2388b3a10afc6eeeb52638e1b
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Value 220 is already used in the (poorly, but consistently) placed
GraphicsSceneLeave event type.
Change-Id: I2fd90645475a70380e43e906c5f8459b3119f22f
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Window states and their transitions do not currently work
correctly in wasm (eg. showFullScreen -> showNormal).
In order to fix this, we need to conform to Qt's way of
handling windows and their geometry, which involves
deferring much of the actual geometry changes to when
it actually becomes visible, or else the QWidget code
interferes with what we're trying to do.
Change-Id: I8c7da0be76760363e444dc5dc676036e70863f6e
Fixes: QTBUG-102190
Pick-to: 6.3
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
The `inline` keyword does not control inlining, as we all know (use
Q_ALWAYS_INLINE to force inlining, if required). However, it does
control the emission of the out-of-line copy of an inline function, if
the compiler did inline it where it got used: with the keyword, no copy
is required, which is our objective here.
Furthermore, we compile with -fvisibility-inlines-hidden with
GCC-compatible compilers (all but MSVC and Integrity's), which means
those functions will never be in the ABI of QtCore: they'll either have
been inlined with no out-of-line copy, or that out-of-line emission is
hidden.
Change-Id: If2e0f4b2190341ebaa31fffd16e31584561669f2
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
If a QWindow is embedded into a native view it's effectively the
root window, similar to a top level QWindow, and we need to forward
hover events on behalf of itself and all child windows.
Fixes: QTBUG-103084
Pick-to: 6.3
Change-Id: I1e94b9447fb561c1b02db87738de235c5d12b3a4
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Reviewed-by: <stefan.wastl@native-instruments.de>
Apart from being consistent with qtpaths (which uses qVersion()),
this also ensures that Qt Creator loads correct debug helpers for types
like QString when debugging qmake.
As a drive by, remove all QT_VERSION_MAJOR, QT_VERSION_MINOR,
QT_VERSION_PATCH defines which are not used anywhere.
Change-Id: Ibc8f2a6af833e1ec6e6cd6e1937ac3c1ab328555
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
This reverts commit 27c25fc909.
Currently Qt only supports core device of keyboard, not every
real keyboard. Create a new xkb state during
xcb_xkb_new_keyboard_notify_event_t, it will lose the correct
state before the event, for example, when using the second
or later layout than the first one. The new xkb state will
use the first layout. It's difficult to sync the xkb states.
Fixes: QTBUG-102493
Fixes: QTBUG-102640
Task-number: QTBUG-95933
Pick-to: 6.3 6.2 5.15
Change-Id: Iaa5369ff9f5495e194577dcbb8f78303158c9a73
Reviewed-by: Lu YaNing <luyaning@uniontech.com>
Reviewed-by: Zhang Hao <543985125@qq.com>
Reviewed-by: Liang Qi <liang.qi@qt.io>
Reviewed-by: Ilya Fedin <fedin-ilja2010@ya.ru>
We can not alter the value of 'android_sdk' and 'android_ndk' options
when qtbase's package_id is being calculated. We have attempted to
convert the option values (paths to file system) to actual version
strings.
While the conversion itself works the usage of Conan lock files in CI
fails: "Locked options do not match computed options".
Exclude 'android_sdk' and 'android_ndk' from package_id. Instead the
'android_sdk_version' and 'android_ndk_version' will be used for
package_id which affects the binary compatibility.
Pick-to: 6.3
Change-Id: Ia99a69d9b91cebb8dea821fd8b9c6c59091f1a41
Reviewed-by: Toni Saario <toni.saario@qt.io>
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
the generated `-D` and `-I` flags contain quite a number of duplicate
entries. since cmake-3.15 it is easy to strip them via a generator
expression
Change-Id: I83915c9074e0e2e62e79cd932cad2fa07e8a12aa
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
This prevents false-negatives and false-positives, as e.g. Clang
10.0.0 masks as GCC 4.2, so Q_CC_GNU is 402 on that
compiler. Depending on the test (Q_CC_GNU > NNN or Q_CC_GNU < NNN),
the result of the test is almost random.
Q_CC_<comp>_ONLY makes sure we match only GCC or MSVC, not bycatch
such as Clang or ICC.
Pick-to: 6.3 6.2 5.15
Change-Id: I4c550a11ecf85fc9a2216b330b69bd03d45b47e0
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
It's not async-signal-safe, so don't use it. Instead, let's use writev()
(which should write atomically and we won't need to have a buffer) and
std::to_chars to format numbers where available (where not, we roll out
our own implementation with divisions).
Pick-to: 6.3
Change-Id: I5ff8e16fcdcb4ffd9ab6fffd16eb70a158f44864
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
The std variant is faster and more compact.
Use the QtPrivate wrappers to avoid the Integrity mess.
Change-Id: I4a1b1626d29472af059fee55ca26c31d9522b179
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Don't use QSet::toList(), and fix an obvious typo.
Also, core5compat is now needed due to the use of QRegExp.
Change-Id: I766455996c07d354e97a4ed4939f1774fc449331
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Amends cf52d725156811754cd4e094b0984864795d1d58, after which most
indicator styling was no longer taken into account unless some other
item aspects were styled. Calling the baseStyle to draw the entire item
doesn't call back into the style sheet style for the indicator itself.
The QCommonStyle code that breaks the item up into individual sub
elements cannot be called for each element. E.g. turning off the check
indicator feature changes the layout of the item.
So if the indicator is styled, then we have to draw an otherwise empty
item with the style sheet style, and then clip the already painted rect
before calling the base style to draw text and highlighting with the
correct palette.
Add baseline test for QTreeView with different style sheets.
Fixes: QTBUG-102820
Pick-to: 6.3 6.2
Change-Id: I1da5676cc63556230eac525bc550457ebd495a58
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Use the string literals instead.
Change-Id: Ic85d0845c211744a79af7e48b180129797d3d612
Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Move the QtConfigureOption and QtOptionParser to qt-conan-common where
existing shared functionality can be further re-used by these parsers.
Pick-to: 6.3
Task-number: QTIFW-2585
Change-Id: Ief56762f3a27bb0d6d474e8d1668234856afd732
Reviewed-by: Toni Saario <toni.saario@qt.io>
The QWasmCompositor destructor deregisters event handlers, which
means it needs to look up the the canvas element, which again means
that this needs to happen before we clear the canvas from
specialHTMLTargets.
Also, calling destroy() is not needed since the QWasmCompositor
destructor makes this call.
Change-Id: I3004b94d0459c28642d3bd8bf9fe794c9b658477
Reviewed-by: Aleksandr Reviakin <aleksandr.reviakin@qt.io>
Reviewed-by: Lorn Potter <lorn.potter@gmail.com>
With the old value, they were placed above the
header bar. Moving them a few pixels below looks
less broken.
Pick-to: 6.2 6.3 5.15
Change-Id: Iddd9d5e0b5c199fe35a9c8b8a7cac9a472901a21
Reviewed-by: Topi Reiniö <topi.reinio@qt.io>
When linking Qt statically, the image fomats are not separated into
different DSOs. when linking them into the same target, gcc warns
about an ODR violation between icohandler and bmphandler:
```
/usr/src/debug/qtbase/6.3.0-r0/build/include/QtGui/6.3.0/QtGui/private/../../../../../../git/src/gui/image/qbmphandler_p.h:69:8: warning: type ‘struct BMP_INFOHDR’ violates the C++ One Definition Rule [-Wodr]
/usr/src/debug/qtbase/6.3.0-r0/git/src/plugins/imageformats/ico/qicohandler.cpp:98: note: a different type is defined in another translation unit
/usr/src/debug/qtbase/6.3.0-r0/build/include/QtGui/6.3.0/QtGui/private/../../../../../../git/src/gui/image/qbmphandler_p.h:70:13: note: the first difference of corresponding definitions is field ‘biSize’
/usr/src/debug/qtbase/6.3.0-r0/git/src/plugins/imageformats/ico/qicohandler.cpp:87: note: a field of same name but different type is defined in another translation unit
/usr/src/debug/qtbase/6.3.0-r0/build/include/QtGui/6.3.0/QtGui/private/../../../../../../git/src/gui/image/qbmphandler_p.h:69:8: note: type ‘qint32’ should match type ‘struct quint32_le’
```
we therefore wrap the `BMP_INFOHDR` into an anonymous namespace
Change-Id: I0e6ee66dd09ebda0c3e399738b5c172a57beb8f4
Pick-to: 5.15 6.2 6.3
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
This reverts commit 043529c9dc, that
was introduced to keep compatibility with Windows XP. This is not
necessary anymore, as support for Windows XP got dropped.
The now removed code also had an issue in the format of the fifth
argument of FormatMessage, that is supposed to be a pointer to a
pointer for FORMAT_MESSAGE_ALLOCATE_BUFFER.
Pick-to: 6.2 6.3
Change-Id: Ib75b6a53a778801388d71388701340d3b79dacce
Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
Reviewed-by: Ihor Dutchak <ihor.youw@gmail.com>
As the standard compilers on their respective platforms, other
compilers tend to mask as Clang, GCC, or MSVC, leading to complicated
code when you actually mean just one of these compilers:
#if defined(Q_CC_GNU) && !defined(Q_CC_CLANG) && !defined(Q_CC_INTEL)
This is particularly problematic when combined with version checks:
#if defined(Q_CC_GNU) && Q_CC_GNU >= 900
will, e.g., not match Clang 10.0.0, which masks as GCC 4.2. The
correct way (until a new kid on the block starts to mask as GCC, too)
to check for GCC >= 9.0 atm is:
#if defined(Q_CC_CLANG) || defined(Q_CC_INTEL) || !(defined(Q_CC_GNU) && Q_CC_GNU >= 900)
The new macros make such checks intuitive and hard-to-misuse:
#if defined(Q_CC_GNU_ONLY) && Q_CC_GNU >= 900
Use it in qcompilerdetection.h.
Pick-to: 6.3 6.2 5.15
Change-Id: Idcdf973fbc4708f58ed91c800be3d5e599e5b7e6
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This reverts commit 583668005d, and
provides an alternative fix for QTBUG-75106.
Reason: This introduced QTBUG-103009, due to lack of caching. To fix the
original issue, we still reduce the amount of caching we do, by only
considering the first non-dynamic meta-object for QML related objects.
Task-number: QTBUG-75106
Fixes: QTBUG-103009
Pick-to: 6.3 6.2 5.15
Change-Id: Ic76af26a719d1114208be9555286239c6c6df615
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Subtracting denominator - 1 from the numerator ran into trouble if the
numerator was close to its type's minimum representable value. Adding
1 before division, then subtracting it after, avoids that underflow
while getting the same answer.
Change-Id: I0bb85deaa2ad36f8744ed6dbfdb4817442dddebe
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Override the default cursor blink time so that we don't get mismatches
from line edits. We need to set the time to > 0 so that QStyleHints does
not fall back to the platform integration.
Pick-to: 6.3
Change-Id: Ib1d04f7450c01c352c13098886aee032dcb14c72
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
Widgets and styles might use fade effects or other asynchronous mechanisms
as part of hovering. This results in mismatches when the snapshot is
taken before those effects are completed.
Since we can't control all such animations from the outside, process
events for some milliseconds before taking the snapshot.
Pick-to: 6.3
Change-Id: I771658300628238552bddcd14a6751c3f6c0c63d
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
As if QIODevice::readLine() and QIODevice::Text open-mode aren't slow
enough, the old code took the line QByteArray, converted it to a
QString so it could apply a trivial regex to it: '^summary: (\d+)'.
We can, of course, use QByteArray::startsWith("summary: ") followed by
std::from_chars(), these days, to get the same effect, without having
to JIT-compile an RX and convert every line into UTF-16 first.
Change-Id: I20d80ffb469329d3c3efd08c71fcf5abf9f486d3
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
The updated script found some more.
Task-number: QTBUG-102886
Pick-to: 6.3 6.2 5.15
Change-Id: Ic8062e8a441c4d1a3718598a21f7f2e050a17cae
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
There was a problem if default EUDC font is specified in user's
Windows Registry as a font file name instead of full path. In that
case we didn't handle this font properly and the warning was
generated.
Fixes: QTBUG-103003
Pick-to: 6.2 6.3
Change-Id: I946082af8dc31e6cf82cebca94ebbb03726239e0
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Introduce an internal QtJniTypes namespace with types that allow us to
concatenate string literals at compile time. This makes it possible to
generate arbitrary strings based on types, which we can then use as
signatures to JNI method calls.
Move some of the private members of QJniObject into the QtJniTypes
namespace for consistency, and to allow further template specialization
by user code to make other types and their JNI signature string known.
Remove the "Jni" prefix from names.
Use the compile-time generated string in QJniObject methods that created
the signature string at runtime, which involved a temporary memory
allocation.
Treat 'void' as a primitive type (with signature string 'V'), and
remove redundant template specializations.
Add a test case to verify the the strings are constructed correctly
at compile time.
Change-Id: I5e3895a97f7dc1b86961f7a7855b899d9203037d
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Perl is dead and I don't speak Python, so if someone wants to port it,
be my guest. I needed something that I can use to roll out includemocs
across all Qt modules, and this is it. It works for me™, so I don't
expect to do much development with it.
This is an automated committer script I've been using so far:
# SRCDIR=~~~
# BUILDDIR=~~~~
cd $BUILDDIR
find */src -name mocs_compilation.cpp | while read FILE; do
if grep -qsE '^#include' "$FILE"; then
DIR="$(dirname "$FILE")"
LIB="$(basename "$DIR")"
case "$LIB" in
Q*)
LIB="${LIB%%_autogen}"
;;
*)
LIB="Qt${LIB%%_autogen}"
;;
esac
DIR="${DIR%/*}"
path/to/includemocs6.sh "$SRCROOT/$DIR" "$DIR" "$FILE"
(cd "$SRCROOT/$DIR" && git commit -am "$LIB: includemocs
$(cat "$SRCROOT/commit-msg.txt")" --no-edit)
fi
done
If the script cannot associate a moc file with a cpp file, it will
print a warning and continue.
The script tries to include the moc-file right after the
QT_END_NAMESPACE to work around many TUs ending in an #endif from some
#if QT_CONFIG or other. If there's no QT_END_NAMESPACE, it appends
the include and prints a warning.
Fixes: QTBUG-102886
Pick-to: 6.3 6.2
Change-Id: I16c5a9f845777ea2e82f15611b4fdd32f98ce0bb
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Instead of trying to guess which OSes have this functionality.
Change-Id: I5ff8e16fcdcb4ffd9ab6fffd16ebc20fe7eca346
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Commit 1808df9ce5 changed the Linux code
to read the third field in the TCB header instead of the first, because
that matches what FreeBSD does and what the documentation for the ABI
appears to say. But it broke MUSL builds because they apparently don't
obey the ABI. So don't use the inline code with libcs other than glibc.
Pick-to: 6.2 6.3
Task-number: QTBUG-103000
Change-Id: I5ff8e16fcdcb4ffd9ab6fffd16eba7748de50ddd
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Mike Achtelik <mike.achtelik@gmail.com>
Amends a previous workaround used with AMD graphic adapters, which under
some circumstances could incorrectly move pop-up windows and cause
issues with menus.
Fixes: QTBUG-97533
Pick-to: 6.2 6.3
Change-Id: Icc83198913b0e78ae3d7c0679e46f8b46b7015bf
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
In d12afeff40, the default redirect policy was
changed to NoLessSafeRedirectPolicy (from ManualRedirectPolicy), and this was
reworded from:
This signal is emitted if the QNetworkRequest::FollowRedirectsAttribute was
set in the request [...]
(i.e.: Qt handles redirect, no manual handling) to:
This signal is emitted if the QNetworkRequest::ManualRedirectPolicy was
set in the request [...]
(i.e.: User handles redirect, no handling by Qt), which is exactly the wrong way
around. Only if Qt handles the redirect, it's able to send a signal about it.
If the user handles redirects, they would get the RedirectionTargetAttribute in
response to the finished() signal.
Also see tst_QNetworkReply::ioHttpSingleRedirect(): It sets
NoLessSafeRedirectPolicy (default since Qt 6) and then ensures the "redirected"
signal has been emitted.
Pick-to: 6.3 6.2
Change-Id: I7e80ff69b94a4d94eb541b1021b05601d183c733
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
To make it clearer what kind of object is being printed, and also more
consistent with the QDebug output of other classes.
Fixes: QTBUG-103085
Pick-to: 6.3
Change-Id: Ia7441dd373d359be2a87ec618684d27375a1dcf8
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Previously, this was only supported when cross-compiling, but that's an
unnecessary limitation. Instead, make it possible to build the "host"
tools (notably qmake) even when they've been found elsewhere due to
QT_FORCE_FIND_TOOLS=ON and a supplied QT_HOST_PATH.
The combination of QT_FORCE_FIND_TOOLS and QT_FORCE_BUILD_TOOLS set to
ON is useful for developers who touch content that ends up in the
bootstrap library.
QT_BUILD_TOOLS_WHEN_CROSSCOMPILING is deprecated in favor of
QT_FORCE_BUILD_TOOLS.
[ChangeLog][CMake] QT_BUILD_TOOLS_WHEN_CROSSCOMPILING has been
deprecated in favor of QT_FORCE_BUILD_TOOLS. The latter can be used in
combination with QT_FORCE_FIND_TOOLS and QT_HOST_PATH to use tools from
a host Qt even for a non-cross build and still build the tools.
Fixes: QTBUG-99683
Change-Id: I0e5f6bec596a4a78bd3bfffd16c8fb486181f9b6
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
If this is not there, compiling fails for all-warnings-are-errors,
which seems to be enabled by default.
Change-Id: Id4cafaa635be201b649012ce8fc75f7cb5fb88a3
Reviewed-by: Lorn Potter <lorn.potter@gmail.com>
When needs by the QVulkanInstance::setVkInstance to use a existing
VkInstance to a QQuickWindow, the VkInstance maybe is from a non Qt
render system, in the case, the QPlatformVulkanInstance object of
QVulkanInstance is can't create from the QPA, the all vulkan information
is need get from the VkInstance owner(eg, getInstanceProcAddr). But
providing it with a public interface is not a good idea, so by exporting
a private class, you can use a private interface where needed to achieve
the above purpose.
Task-number: QTBUG-103021
Change-Id: I0312adcf55cfd7d49889ed112ab237c0b3ab3ef6
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Then the test-helper is (re)built as part of `ninja tst_qdbusinterface`
or `ninja tst_qdbusinterface_check`
Pick-to: 6.3 6.2
Change-Id: Id129c2fdc5980ea268ef1383f0747589876e2a9f
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
As a drive-by, fix qsizetype -> int narrowing conversion warnings for
the touched lines.
Task-number: QTBUG-98434
Change-Id: I7fadd3cf27ad099028d70f05956303e3af62c0f5
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
Expand the rubberband repaint area with one pixel to account for
rounding on screens with fractional device pixel ratio.
Fixes: QTBUG-102717
Pick-to: 6.3 6.2
Change-Id: Iede638d48dfbc3156b02ada28dfe99719b9d5efa
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Since each .arg() call starts from scratch, a file name containing a
suitable %n would mess up the formatting of the following .arg() call.
Fix by using multiArg(), which requires to pre-format the line into a
QString, but which performs only a single-pass, so doesn't suffer from
the placeholder injection problem that plagues .arg()-chaining.
Pick-to: 6.3 6.2 5.15
Change-Id: I549527643da657fca0bea63d5e3becadac529d4b
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
... by providing also op>> for char16_t.
[ChangeLog][QtCore][QTextStream] Added op>>(char16_t&).
Change-Id: I2f6cc2b2cdacd5190d364f94c1830f6de62d3b7e
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>