aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dependencies.yaml10
-rw-r--r--examples/quickcontrols/chattutorial/doc/src/qtquickcontrols-chattutorial.qdoc4
-rw-r--r--src/qml/doc/src/tools/qtqml-tooling-qmllint.qdoc4
-rw-r--r--src/qml/doc/src/tools/qtqml-tooling-svgtoqml.qdoc6
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper.cpp2
-rw-r--r--src/qml/qml/qqml.cpp2
-rw-r--r--src/qml/qml/qqmlimport.cpp5
-rw-r--r--src/qml/qml/qqmlpropertycachecreator_p.h6
-rw-r--r--src/qml/qml/qqmltype_p_p.h2
-rw-r--r--src/qml/qml/qqmltypecompiler.cpp7
-rw-r--r--src/qml/qml/qqmltypedata.cpp4
-rw-r--r--src/qmlcompiler/qqmljscompiler.cpp8
-rw-r--r--src/qmlcompiler/qqmljstypedescriptionreader.cpp5
-rw-r--r--src/quick/doc/src/cmake/qt_target_qml_from_svg.qdoc7
-rw-r--r--src/quick/items/qquickitem.cpp2
-rw-r--r--src/quickcontrols/doc/src/includes/qquickicon.qdocinc2
-rw-r--r--src/quickcontrols/doc/src/qtquickcontrols-customize.qdoc4
-rw-r--r--src/quickcontrols/doc/src/qtquickcontrols-fileselectors.qdoc12
-rw-r--r--src/quickcontrols/doc/src/qtquickcontrols-qmltypes.qdoc2
-rw-r--r--src/quickcontrols/doc/src/qtquickcontrols-styles.qdoc6
-rw-r--r--src/quickcontrols/macos/SearchField.qml8
-rw-r--r--src/quickdialogs/quickdialogsquickimpl/CMakeLists.txt1
-rw-r--r--src/quickdialogs/quickdialogsquickimpl/qml/+Fusion/ColorDialog.qml2
-rw-r--r--src/quickdialogs/quickdialogsquickimpl/qml/+Imagine/ColorDialog.qml2
-rw-r--r--src/quickdialogs/quickdialogsquickimpl/qml/+Material/ColorDialog.qml2
-rw-r--r--src/quickdialogs/quickdialogsquickimpl/qml/+Universal/ColorDialog.qml2
-rw-r--r--src/quickdialogs/quickdialogsquickimpl/qml/ColorDialog.qml2
-rw-r--r--src/quickdialogs/quickdialogsquickimpl/qml/DelegateBackground.qml17
-rw-r--r--src/quickdialogs/quickdialogsquickimpl/qml/FileDialogDelegate.qml8
-rw-r--r--src/quickdialogs/quickdialogsquickimpl/qml/SideBar.qml42
-rw-r--r--src/quicktemplates/qquickmenu.cpp10
-rw-r--r--src/quicktemplates/qquickpopup.cpp6
-rw-r--r--src/quicktemplates/qquickpopupwindow.cpp8
-rw-r--r--src/quickvectorimage/generator/qquickqmlgenerator.cpp4
-rw-r--r--src/quickvectorimage/qquickvectorimage.cpp31
-rw-r--r--src/quickvectorimage/qquickvectorimage_p.h5
-rw-r--r--src/quickvectorimage/qquickvectorimage_p_p.h1
-rw-r--r--src/quickvectorimage/qquickvectorimageglobal_p.h1
-rw-r--r--tests/auto/qml/qqmlimport/data/Timer.qml5
-rw-r--r--tests/auto/qml/qqmlimport/data/UsingCustomTimer.qml10
-rw-r--r--tests/auto/qml/qqmlimport/tst_qqmlimport.cpp18
-rw-r--r--tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp4
-rw-r--r--tests/auto/quickcontrols/qquickmenu/data/visibleTrue.qml27
-rw-r--r--tests/auto/quickcontrols/qquickmenu/tst_qquickmenu.cpp19
-rw-r--r--tests/auto/quickvectorimage/qquickvectorimage/CMakeLists.txt1
-rw-r--r--tests/auto/quickvectorimage/qquickvectorimage/data/vectorimage-async.qml13
-rw-r--r--tests/auto/quickvectorimage/qquickvectorimage/tst_qquickvectorimage.cpp37
-rw-r--r--tools/svgtoqml/Qt6SvgToQmlMacros.cmake5
-rw-r--r--tools/svgtoqml/main.cpp6
49 files changed, 314 insertions, 83 deletions
diff --git a/dependencies.yaml b/dependencies.yaml
index 748b88830f..fd2faacc1b 100644
--- a/dependencies.yaml
+++ b/dependencies.yaml
@@ -1,16 +1,16 @@
dependencies:
../qtbase:
- ref: c17ae1096e0548041150b692b3458de19df2f534
+ ref: df1292e2b96aab02ad6df778d8336e7958ad5d1c
required: true
../qtimageformats:
- ref: 5a5fc6de7e03367bc522ac2cab6e842e22df516b
+ ref: b106fd9db2f07152637932cb7cb71bbc47f58009
required: false
../qtlanguageserver:
- ref: 8c5e29a9797a89b4b865317a9a9528d6a32538c9
+ ref: b5298656662c9a2434c5634dd999d53b3f86a540
required: false
../qtshadertools:
- ref: 757c905458e5c6d1a810d6c847e8a31476f649b1
+ ref: cff6953e790086bbbc69a05570e99049c98f33fd
required: false
../qtsvg:
- ref: 9e209a6084cea238eb23ae227d7d8d550cb306e6
+ ref: c9e1a1f8ae3a90be4ff3e2ebe15235d9ca4e85cd
required: false
diff --git a/examples/quickcontrols/chattutorial/doc/src/qtquickcontrols-chattutorial.qdoc b/examples/quickcontrols/chattutorial/doc/src/qtquickcontrols-chattutorial.qdoc
index 620877a873..c89873aecf 100644
--- a/examples/quickcontrols/chattutorial/doc/src/qtquickcontrols-chattutorial.qdoc
+++ b/examples/quickcontrols/chattutorial/doc/src/qtquickcontrols-chattutorial.qdoc
@@ -704,7 +704,7 @@ that this information is propagated to its children, allowing them to switch
their text color to something lighter. The simplest way of doing so is to
import the Material style directly and use the Material attached property:
-\code
+\qml
import QtQuick.Controls.Material 2.12
// ...
@@ -714,7 +714,7 @@ import the Material style directly and use the Material attached property:
// ...
}
-\endcode
+\endqml
However, this brings with it a hard dependency to the Material style; the
Material style plugin \e must be deployed with the application, even if the
diff --git a/src/qml/doc/src/tools/qtqml-tooling-qmllint.qdoc b/src/qml/doc/src/tools/qtqml-tooling-qmllint.qdoc
index 1aa59839ea..8ced3cc537 100644
--- a/src/qml/doc/src/tools/qtqml-tooling-qmllint.qdoc
+++ b/src/qml/doc/src/tools/qtqml-tooling-qmllint.qdoc
@@ -16,6 +16,10 @@ for ease of use. It also warns about some QML anti-patterns. If you want to
disable a specific warning type, you can find the appropriate flag for doing so
by passing \c{--help} on the command line.
+\note When using IDE, such as Qt Creator, you don't need to run \c qmllint
+manually. The IDE uses \l {QML Language Server#Linting}{QML Language Server},
+that provides real-time linting output and diagnostics as you type.
+
By default, some issues will result in warnings that will be printed. If there
are more warnings than a limit which can be configured with \c{--max-warnings},
the exit code will be non-zero.
diff --git a/src/qml/doc/src/tools/qtqml-tooling-svgtoqml.qdoc b/src/qml/doc/src/tools/qtqml-tooling-svgtoqml.qdoc
index e64ca28121..637a41a2f8 100644
--- a/src/qml/doc/src/tools/qtqml-tooling-svgtoqml.qdoc
+++ b/src/qml/doc/src/tools/qtqml-tooling-svgtoqml.qdoc
@@ -45,6 +45,10 @@ In addition, it supports the following options:
\li Enables the curve renderer backend for \l{Qt Quick Shapes}. This enables smooth, antialiased
shapes in the scene without multi-sampling, but at some extra cost.
\row
+ \li \c{-a}, \c{--asynchronous-shapes}
+ \li Enables the {QtQuick.Shapes::Shape::asynchronous}{asynchronous} mode on all \l{Shape}
+ elements in the generated scene. This may improve CPU utilization and responsiveness.
+\row
\li \c{-p}, \c{--optimize-paths}
\li Enables optimization of paths before committing them to the QML file, potentially making
them faster to load and render later.
@@ -53,7 +57,7 @@ In addition, it supports the following options:
\li Stroke the outline (contour) of the filled shape instead of the original path.
\row
\li \c{-t}, \c{--type-name <string>}
- \li In place of \l{Shape}, the output will use the type name <string> instead. This is
+ \li In place of \l{Shape}, the output will use the type name <string> instead. This
enables using a custom item to override the default behavior of \l{Shape} items.
\row
\li \c{-v}, \c{--view}
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp
index 950838c11c..1f9429651e 100644
--- a/src/qml/jsruntime/qv4qobjectwrapper.cpp
+++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp
@@ -3167,6 +3167,8 @@ void QObjectMethod::callInternalWithMetaTypes(
QV4::coerceAndCall(
v4, &metaMethod, argv, types, argc,
[v4, thisMeta, object](void **argv, int) {
+ if (!argv[0])
+ return;
*static_cast<QString *>(argv[0])
= QObjectWrapper::objectToString(v4, thisMeta, object.qObject());
});
diff --git a/src/qml/qml/qqml.cpp b/src/qml/qml/qqml.cpp
index 326b252c45..09c8033418 100644
--- a/src/qml/qml/qqml.cpp
+++ b/src/qml/qml/qqml.cpp
@@ -826,7 +826,7 @@ static void doRegisterTypeAndRevisions(
uniqueRevisions(&revisions, type.version, added);
AliasRegistrar aliasRegistrar(&elementNames);
- for (QTypeRevision revision : revisions) {
+ for (QTypeRevision revision : std::as_const(revisions)) {
if (revision.hasMajorVersion() && revision.majorVersion() > type.version.majorVersion())
break;
diff --git a/src/qml/qml/qqmlimport.cpp b/src/qml/qml/qqmlimport.cpp
index ee7e4eb61e..b969b31b44 100644
--- a/src/qml/qml/qqmlimport.cpp
+++ b/src/qml/qml/qqmlimport.cpp
@@ -544,7 +544,10 @@ bool QQmlImportInstance::resolveType(QQmlTypeLoader *typeLoader, const QHashedSt
QQmlImport::RecursionRestriction recursionRestriction,
QList<QQmlError> *errors) const
{
- QQmlType t = QQmlMetaType::qmlType(type, uri, version);
+ // QQmlMetaType assumes that without a URI, it should look for types in any module
+ // But QQmlImportInstance without a URI represents a directory import, and _must not_ find
+ // types from completely unrelated modules
+ QQmlType t = uri.isEmpty() ? QQmlType() : QQmlMetaType::qmlType(type, uri, version);
if (t.isValid()) {
if (version_return)
*version_return = version;
diff --git a/src/qml/qml/qqmlpropertycachecreator_p.h b/src/qml/qml/qqmlpropertycachecreator_p.h
index 267e008466..e2c33776e4 100644
--- a/src/qml/qml/qqmlpropertycachecreator_p.h
+++ b/src/qml/qml/qqmlpropertycachecreator_p.h
@@ -184,12 +184,12 @@ public:
{
switch (reason) {
case OverrideSemantics::Status::MissingBase:
- return tr("Nothing to override. Remove override keyword");
+ return tr("Nothing to override. Remove \"override\" keyword");
case OverrideSemantics::Status::OverridingFinal:
return tr("Cannot override FINAL property");
case OverrideSemantics::Status::OverridingNonVirtual:
- return tr("Cannot override non virtual property. Add virtual to the property of the "
- "base object");
+ return tr("Cannot override non virtual property. Add \"virtual\" to the property of "
+ "the base object");
default:
return tr("unknown");
}
diff --git a/src/qml/qml/qqmltype_p_p.h b/src/qml/qml/qqmltype_p_p.h
index 60081d79b1..4cdb7d1a53 100644
--- a/src/qml/qml/qqmltype_p_p.h
+++ b/src/qml/qml/qqmltype_p_p.h
@@ -39,7 +39,7 @@ public:
{
~ProxyMetaObjects()
{
- for (const QQmlProxyMetaObject::ProxyData &metaObject : data)
+ for (const QQmlProxyMetaObject::ProxyData &metaObject : std::as_const(data))
free(metaObject.metaObject);
}
diff --git a/src/qml/qml/qqmltypecompiler.cpp b/src/qml/qml/qqmltypecompiler.cpp
index ff2cc87ff1..bbbe805e63 100644
--- a/src/qml/qml/qqmltypecompiler.cpp
+++ b/src/qml/qml/qqmltypecompiler.cpp
@@ -387,11 +387,14 @@ bool SignalHandlerResolver::resolveSignalHandlerExpressions(
const QQmlType type = typeRef ? typeRef->type() : QQmlType();
if (type.isValid()) {
COMPILE_EXCEPTION(binding, tr("\"%1.%2\" is not available in %3 %4.%5.")
- .arg(typeName).arg(originalPropertyName).arg(type.module())
+ .arg(typeName, originalPropertyName, type.module())
.arg(type.version().majorVersion())
.arg(type.version().minorVersion()));
} else {
- COMPILE_EXCEPTION(binding, tr("\"%1.%2\" is not available due to component versioning.").arg(typeName).arg(originalPropertyName));
+ COMPILE_EXCEPTION(
+ binding,
+ tr("\"%1.%2\" is not available due to component versioning.")
+ .arg(typeName, originalPropertyName));
}
}
diff --git a/src/qml/qml/qqmltypedata.cpp b/src/qml/qml/qqmltypedata.cpp
index e3947d15df..50e1fb3f4f 100644
--- a/src/qml/qml/qqmltypedata.cpp
+++ b/src/qml/qml/qqmltypedata.cpp
@@ -812,7 +812,7 @@ void QQmlTypeData::continueLoadFromIR()
{
assertTypeLoaderThread();
- for (auto const& object: m_document->objects) {
+ for (auto const& object: std::as_const(m_document->objects)) {
for (auto it = object->inlineComponentsBegin(); it != object->inlineComponentsEnd(); ++it) {
QString const nameString = m_document->stringAt(it->nameIndex);
auto importUrl = finalUrl();
@@ -1181,7 +1181,7 @@ bool QQmlTypeData::resolveType(const QString &typeName, QTypeRevision &version,
error.setDescription(QQmlTypeLoader::tr("Unreported error adding script import to import database"));
}
error.setUrl(m_importCache->baseUrl());
- error.setDescription(QQmlTypeLoader::tr("%1 %2").arg(typeName).arg(error.description()));
+ error.setDescription(QQmlTypeLoader::tr("%1 %2").arg(typeName, error.description()));
}
if (lineNumber != -1)
diff --git a/src/qmlcompiler/qqmljscompiler.cpp b/src/qmlcompiler/qqmljscompiler.cpp
index 916f30b125..2efdb826f6 100644
--- a/src/qmlcompiler/qqmljscompiler.cpp
+++ b/src/qmlcompiler/qqmljscompiler.cpp
@@ -23,6 +23,7 @@
#include <QtCore/qfile.h>
#include <QtCore/qfileinfo.h>
#include <QtCore/qloggingcategory.h>
+#include <QtCore/qelapsedtimer.h>
#include <QtQml/private/qqmlsignalnames_p.h>
@@ -797,15 +798,16 @@ QQmlJSAotFunction QQmlJSAotCompiler::doCompileAndRecordAotStats(
const QV4::Compiler::Context *context, QQmlJSCompilePass::Function *function,
const QString &name, QQmlJS::SourceLocation location)
{
- auto t1 = std::chrono::high_resolution_clock::now();
+ QElapsedTimer timer {};
+ timer.start();
QQmlJSAotFunction result;
if (!m_logger->currentFunctionHasCompileError())
result = doCompile(context, function);
- auto t2 = std::chrono::high_resolution_clock::now();
+ auto elapsed = std::chrono::milliseconds { timer.elapsed() };
if (QQmlJS::QQmlJSAotCompilerStats::recordAotStats()) {
QQmlJS::AotStatsEntry entry;
- entry.codegenDuration = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1);
+ entry.codegenDuration = elapsed;
entry.functionName = name;
entry.message = m_logger->currentFunctionWasSkipped()
? m_logger->currentFunctionCompileSkipMessage()
diff --git a/src/qmlcompiler/qqmljstypedescriptionreader.cpp b/src/qmlcompiler/qqmljstypedescriptionreader.cpp
index 02d3f2b004..4117255158 100644
--- a/src/qmlcompiler/qqmljstypedescriptionreader.cpp
+++ b/src/qmlcompiler/qqmljstypedescriptionreader.cpp
@@ -261,7 +261,7 @@ void QQmlJSTypeDescriptionReader::readComponent(UiObjectDefinition *ast)
"attachedType, "
"valueType, exports, interfaces, isSingleton, isCreatable, "
"isStructured, isComposite, hasCustomParser, enforcesScopedEnums, "
- "aliases, exportMetaObjectRevisions, deferredNames, metaObjectHash,"
+ "aliases, exportMetaObjectRevisions, deferredNames, metaObjectHash, "
"and immediateNames in script bindings, not \"%1\".")
.arg(name));
}
@@ -439,8 +439,7 @@ void QQmlJSTypeDescriptionReader::readProperty(UiObjectDefinition *ast, const QQ
tr("Expected only type, name, lineNumber, revision, isPointer, "
"isTypeConstant, isReadonly, isRequired, "
"isFinal, isList, bindable, read, write, isPropertyConstant, reset, "
- "notify, index, and "
- "privateClass and script bindings."));
+ "notify, index, privateClass and script bindings."));
}
}
diff --git a/src/quick/doc/src/cmake/qt_target_qml_from_svg.qdoc b/src/quick/doc/src/cmake/qt_target_qml_from_svg.qdoc
index 3c72c14ecd..b6e95b6a06 100644
--- a/src/quick/doc/src/cmake/qt_target_qml_from_svg.qdoc
+++ b/src/quick/doc/src/cmake/qt_target_qml_from_svg.qdoc
@@ -24,6 +24,7 @@ find_package(Qt6 REQUIRED COMPONENTS QuickTools)
\badcode
qt_target_qml_from_svg(target
[CURVE_RENDERER]
+ [ASYNCHRONOUS_SHAPES]
[OPTIMIZE_PATHS]
[OUTLINE_STROKE_MODE]
[TYPE_NAME "MyShapeName"]
@@ -61,9 +62,9 @@ the generated file with a custom type. This can be useful to make general custom
the shapes in the provided SVG files. The \c{TYPE_NAME} should refer to a QML type which is
available in the \c{target} QML module.
-The options \c CURVE_RENDERER, \c OPTIMIZE_PATHS and \c OUTLINE_STROKE_MODE correspond to the
-\c{--curve-renderer}, \c{--optimize-paths} and \c{--outline-stroke-mode} in \l{svgtoqml}
-respectively.
+The options \c CURVE_RENDERER, \c ASYNCHRONOUS_SHAPES, \c OPTIMIZE_PATHS and \c OUTLINE_STROKE_MODE
+correspond to the \c{--curve-renderer}, \c{--asynchronous-shapes}, \c{--optimize-paths} and
+\c{--outline-stroke-mode} in \l{svgtoqml} respectively.
*/
diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp
index 0558495332..be89a90bdf 100644
--- a/src/quick/items/qquickitem.cpp
+++ b/src/quick/items/qquickitem.cpp
@@ -5955,7 +5955,7 @@ QRectF QQuickItem::boundingRect() const
QRectF QQuickItem::clipRect() const
{
Q_D(const QQuickItem);
- QRectF ret(0, 0, d->width, d->height);
+ QRectF ret(0, 0, d->width.valueBypassingBindings(), d->height.valueBypassingBindings());
if (flags().testFlag(QQuickItem::ItemObservesViewport)) {
if (QQuickItem *viewport = viewportItem()) {
// if the viewport is already "this", there's nothing to intersect;
diff --git a/src/quickcontrols/doc/src/includes/qquickicon.qdocinc b/src/quickcontrols/doc/src/includes/qquickicon.qdocinc
index eadaea5983..c5427dbdc1 100644
--- a/src/quickcontrols/doc/src/includes/qquickicon.qdocinc
+++ b/src/quickcontrols/doc/src/includes/qquickicon.qdocinc
@@ -47,6 +47,6 @@
For more information, see \l {Image::}{cache}.
- This property was introduced in QtQuick.Controls 2.13.
+ This property was introduced in \l[QML]{QtQuick.Controls} 2.13.
\endtable
//! [grouped-properties]
diff --git a/src/quickcontrols/doc/src/qtquickcontrols-customize.qdoc b/src/quickcontrols/doc/src/qtquickcontrols-customize.qdoc
index 0084861833..768d11262a 100644
--- a/src/quickcontrols/doc/src/qtquickcontrols-customize.qdoc
+++ b/src/quickcontrols/doc/src/qtquickcontrols-customize.qdoc
@@ -556,7 +556,7 @@
ApplicationWindow consists of one visual item:
\l {ApplicationWindow::background}{background}.
- \code
+ \qml
import QtQuick
import QtQuick.Controls.Basic
@@ -570,7 +570,7 @@
}
}
}
- \endcode
+ \endqml
\section2 Customizing BusyIndicator
diff --git a/src/quickcontrols/doc/src/qtquickcontrols-fileselectors.qdoc b/src/quickcontrols/doc/src/qtquickcontrols-fileselectors.qdoc
index a03970d1d8..e8d7352744 100644
--- a/src/quickcontrols/doc/src/qtquickcontrols-fileselectors.qdoc
+++ b/src/quickcontrols/doc/src/qtquickcontrols-fileselectors.qdoc
@@ -34,7 +34,7 @@
\c Material selector will be present and the \c +Material/CustomButton.qml
version will be used instead.
- \code
+ \qml
// main.qml
import QtQuick
import QtQuick.Controls
@@ -48,12 +48,12 @@
anchors.centerIn: parent
}
}
- \endcode
+ \endqml
The base implementation of the custom button is a simple rounded
flat button.
- \code
+ \qml
// CustomButton.qml
import QtQuick
import QtQuick.Controls
@@ -68,13 +68,13 @@
color: control.pressed ? "#ccc" : "#eee"
}
}
- \endcode
+ \endqml
The Material style's implementation of the custom button imports the
Material style, requests a dark theme to get light text, and creates
a drop shadow for the background.
- \code
+ \qml
// +Material/CustomButton.qml
import QtQuick
import QtQuick.Effects
@@ -102,7 +102,7 @@
}
}
}
- \endcode
+ \endqml
\note It is recommended to use \l QQmlApplicationEngine, which internally
creates a \l QQmlFileSelector instance. This is all that is needed to take
diff --git a/src/quickcontrols/doc/src/qtquickcontrols-qmltypes.qdoc b/src/quickcontrols/doc/src/qtquickcontrols-qmltypes.qdoc
index f1ff074b57..5bf879c1cd 100644
--- a/src/quickcontrols/doc/src/qtquickcontrols-qmltypes.qdoc
+++ b/src/quickcontrols/doc/src/qtquickcontrols-qmltypes.qdoc
@@ -34,7 +34,7 @@
type in Qt Quick Templates. Each \l {Definition of a Style}{style} that
wants to provide a Menu must have a Menu.qml available, and the root
item in that file must be the Menu from Qt Quick Templates. When you
- import QtQuick.Controls and create a Menu in QML, the type you get is
+ import \c {QtQuick.Controls} and create a Menu in QML, the type you get is
actually the QML Menu defined by the style's Menu.qml.
In order to use a control as the type in a property declaration, you should
diff --git a/src/quickcontrols/doc/src/qtquickcontrols-styles.qdoc b/src/quickcontrols/doc/src/qtquickcontrols-styles.qdoc
index cfb7099eb3..d22e95212f 100644
--- a/src/quickcontrols/doc/src/qtquickcontrols-styles.qdoc
+++ b/src/quickcontrols/doc/src/qtquickcontrols-styles.qdoc
@@ -113,7 +113,7 @@
}
\endqml
- Notice that QtQuick.Controls (which is responsible for run-time style
+ Notice that \c {QtQuick.Controls} (which is responsible for run-time style
selection) is not imported. The fallback style is specified by the qmldir
of the style:
@@ -127,7 +127,7 @@
\l {The QML script compiler}{QML compiler} knows which specific style
is in use and can generate C++ code for bindings.
- Another benefit is that the QtQuick.Controls plugin is not used and
+ Another benefit is that the \c {QtQuick.Controls} plugin is not used and
therefore does not need to be deployed with the application.
Explicit imports are also necessary if your application is built
@@ -148,7 +148,7 @@
import QtQuick.Controls
\endqml
- The QtQuick.Controls plugin will import the style that was set at runtime
+ The \c{QtQuick.Controls} plugin will import the style that was set at runtime
via one of the following approaches:
\list
diff --git a/src/quickcontrols/macos/SearchField.qml b/src/quickcontrols/macos/SearchField.qml
index b81d83e95b..40b5e898b0 100644
--- a/src/quickcontrols/macos/SearchField.qml
+++ b/src/quickcontrols/macos/SearchField.qml
@@ -31,8 +31,8 @@ NativeStyle.DefaultSearchField {
id: search
control: control
subControl: NativeStyle.SearchField.Search
- x: searchIndicator.indicator.x
- y: searchIndicator.indicator.y
+ x: searchIndicator.indicator ? searchIndicator.indicator.x : 0
+ y: searchIndicator.indicator ? searchIndicator.indicator.y : 0
useNinePatchImage: false
}
@@ -49,8 +49,8 @@ NativeStyle.DefaultSearchField {
visible: control.text.length > 0
control: control
subControl: NativeStyle.SearchField.Clear
- x: clearIndicator.indicator.x
- y: clearIndicator.indicator.y
+ x: clearIndicator.indicator ? clearIndicator.indicator.x : 0
+ y: clearIndicator.indicator ? clearIndicator.indicator.y : 0
useNinePatchImage: false
}
diff --git a/src/quickdialogs/quickdialogsquickimpl/CMakeLists.txt b/src/quickdialogs/quickdialogsquickimpl/CMakeLists.txt
index 2c6d8fc5a1..61fedf8272 100644
--- a/src/quickdialogs/quickdialogsquickimpl/CMakeLists.txt
+++ b/src/quickdialogs/quickdialogsquickimpl/CMakeLists.txt
@@ -8,6 +8,7 @@
set(qml_files
"qml/ColorDialog.qml"
"qml/ColorInputs.qml"
+ "qml/DelegateBackground.qml"
"qml/FileDialog.qml"
"qml/FileDialogDelegate.qml"
"qml/FileDialogDelegateLabel.qml"
diff --git a/src/quickdialogs/quickdialogsquickimpl/qml/+Fusion/ColorDialog.qml b/src/quickdialogs/quickdialogsquickimpl/qml/+Fusion/ColorDialog.qml
index 585aee6b9d..0c23ffe00e 100644
--- a/src/quickdialogs/quickdialogsquickimpl/qml/+Fusion/ColorDialog.qml
+++ b/src/quickdialogs/quickdialogsquickimpl/qml/+Fusion/ColorDialog.qml
@@ -80,7 +80,7 @@ ColorDialogImpl {
Layout.alignment: Qt.AlignRight
Layout.rightMargin: 6
- Accessible.name: qsTr("Eye dropper")
+ Accessible.name: qsTr("Eyedropper")
}
}
diff --git a/src/quickdialogs/quickdialogsquickimpl/qml/+Imagine/ColorDialog.qml b/src/quickdialogs/quickdialogsquickimpl/qml/+Imagine/ColorDialog.qml
index 1a9ebe69f1..81cd1b83f6 100644
--- a/src/quickdialogs/quickdialogsquickimpl/qml/+Imagine/ColorDialog.qml
+++ b/src/quickdialogs/quickdialogsquickimpl/qml/+Imagine/ColorDialog.qml
@@ -84,7 +84,7 @@ ColorDialogImpl {
Layout.alignment: Qt.AlignRight
Layout.rightMargin: 16
- Accessible.name: qsTr("Eye dropper")
+ Accessible.name: qsTr("Eyedropper")
}
}
diff --git a/src/quickdialogs/quickdialogsquickimpl/qml/+Material/ColorDialog.qml b/src/quickdialogs/quickdialogsquickimpl/qml/+Material/ColorDialog.qml
index 024da80b8b..e2a18e6b7c 100644
--- a/src/quickdialogs/quickdialogsquickimpl/qml/+Material/ColorDialog.qml
+++ b/src/quickdialogs/quickdialogsquickimpl/qml/+Material/ColorDialog.qml
@@ -77,7 +77,7 @@ ColorDialogImpl {
Layout.alignment: Qt.AlignRight
Layout.rightMargin: 24
- Accessible.name: qsTr("Eye dropper")
+ Accessible.name: qsTr("Eyedropper")
}
}
diff --git a/src/quickdialogs/quickdialogsquickimpl/qml/+Universal/ColorDialog.qml b/src/quickdialogs/quickdialogsquickimpl/qml/+Universal/ColorDialog.qml
index f4ec10a7c8..514e47d466 100644
--- a/src/quickdialogs/quickdialogsquickimpl/qml/+Universal/ColorDialog.qml
+++ b/src/quickdialogs/quickdialogsquickimpl/qml/+Universal/ColorDialog.qml
@@ -80,7 +80,7 @@ ColorDialogImpl {
Layout.alignment: Qt.AlignRight
Layout.rightMargin: 18
- Accessible.name: qsTr("Eye dropper")
+ Accessible.name: qsTr("Eyedropper")
}
}
diff --git a/src/quickdialogs/quickdialogsquickimpl/qml/ColorDialog.qml b/src/quickdialogs/quickdialogsquickimpl/qml/ColorDialog.qml
index 48e57ad625..c311898598 100644
--- a/src/quickdialogs/quickdialogsquickimpl/qml/ColorDialog.qml
+++ b/src/quickdialogs/quickdialogsquickimpl/qml/ColorDialog.qml
@@ -77,7 +77,7 @@ ColorDialogImpl {
Layout.alignment: Qt.AlignRight
Layout.rightMargin: 6
- Accessible.name: qsTr("Eye dropper")
+ Accessible.name: qsTr("Eyedropper")
}
}
}
diff --git a/src/quickdialogs/quickdialogsquickimpl/qml/DelegateBackground.qml b/src/quickdialogs/quickdialogsquickimpl/qml/DelegateBackground.qml
new file mode 100644
index 0000000000..d0da7e8410
--- /dev/null
+++ b/src/quickdialogs/quickdialogsquickimpl/qml/DelegateBackground.qml
@@ -0,0 +1,17 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
+
+import QtQuick
+import QtQuick.Controls.impl
+import QtQuick.Templates as T
+
+Rectangle {
+ required property T.Control control
+
+ implicitWidth: 100
+ implicitHeight: 40
+ visible: control.down || control.highlighted || control.visualFocus
+ color: Color.blend(control.down ? control.palette.midlight : control.palette.light,
+ control.palette.highlight, control.highlighted ? 0.15 : 0.0)
+}
diff --git a/src/quickdialogs/quickdialogsquickimpl/qml/FileDialogDelegate.qml b/src/quickdialogs/quickdialogsquickimpl/qml/FileDialogDelegate.qml
index a38d64daf0..1600dbcf12 100644
--- a/src/quickdialogs/quickdialogsquickimpl/qml/FileDialogDelegate.qml
+++ b/src/quickdialogs/quickdialogsquickimpl/qml/FileDialogDelegate.qml
@@ -49,11 +49,7 @@ DialogsQuickImpl.FileDialogDelegate {
fileDetailRowWidth: control.fileDetailRowWidth
}
- background: Rectangle {
- implicitWidth: 100
- implicitHeight: 40
- visible: control.down || control.highlighted || control.visualFocus
- color: Color.blend(control.down ? control.palette.midlight : control.palette.light,
- control.palette.highlight, control.highlighted ? 0.15 : 0.0)
+ background: DelegateBackground {
+ control: control
}
}
diff --git a/src/quickdialogs/quickdialogsquickimpl/qml/SideBar.qml b/src/quickdialogs/quickdialogsquickimpl/qml/SideBar.qml
index 2080100814..d10041edaa 100644
--- a/src/quickdialogs/quickdialogsquickimpl/qml/SideBar.qml
+++ b/src/quickdialogs/quickdialogsquickimpl/qml/SideBar.qml
@@ -33,25 +33,32 @@ DialogsQuickImpl.SideBar {
buttonDelegate: Button {
id: buttonDelegateRoot
+
+ required property int index
+ required property string folderName
+
flat: true
highlighted: control.currentIndex === index
width: listView.width
-
+ text: folderName
+ spacing: 5
+ icon.color: highlighted ? palette.highlightedText : palette.text
contentItem: IconLabel {
- spacing: 5
leftPadding: 10
topPadding: 3
bottomPadding: 3
+ alignment: Qt.AlignLeft
+ spacing: buttonDelegateRoot.spacing
icon: buttonDelegateRoot.icon
- text: buttonDelegateRoot.folderName
+ text: buttonDelegateRoot.text
font: buttonDelegateRoot.font
- // same as the icon color
- color: buttonDelegateRoot.icon.color
- alignment: Qt.AlignLeft
+ defaultIconColor: buttonDelegateRoot.icon.color
+ color: defaultIconColor
}
- required property int index
- required property string folderName
+ background: DelegateBackground {
+ control: buttonDelegateRoot
+ }
Accessible.name: folderName
}
@@ -71,23 +78,30 @@ DialogsQuickImpl.SideBar {
addFavoriteDelegate: Button {
id: addFavoriteDelegateRoot
+
+ required property string labelText
+ required property bool dragHovering
+
flat: true
width: control.width
+ spacing: 5
+ icon.color: highlighted ? palette.highlightedText : palette.text
contentItem: IconLabel {
- spacing: 5
leftPadding: 10
topPadding: 3
bottomPadding: 3
+ alignment: Qt.AlignLeft
+ spacing: addFavoriteDelegateRoot.spacing
icon: addFavoriteDelegateRoot.icon
text: addFavoriteDelegateRoot.labelText
font: addFavoriteDelegateRoot.font
- // same as the icon color
- color: addFavoriteDelegateRoot.icon.color
- alignment: Qt.AlignLeft
+ defaultIconColor: addFavoriteDelegateRoot.icon.color
+ color: defaultIconColor
opacity: addFavoriteDelegateRoot.dragHovering ? 0.2 : 1.0
}
- required property string labelText
- required property bool dragHovering
+ background: DelegateBackground {
+ control: addFavoriteDelegateRoot
+ }
}
}
diff --git a/src/quicktemplates/qquickmenu.cpp b/src/quicktemplates/qquickmenu.cpp
index 38f226bd08..2ec652ef5a 100644
--- a/src/quicktemplates/qquickmenu.cpp
+++ b/src/quicktemplates/qquickmenu.cpp
@@ -1733,15 +1733,11 @@ void QQuickMenu::setVisible(bool visible)
Q_D(QQuickMenu);
if (visible == d->visible)
return;
- if (visible && !parentItem()) {
- qmlWarning(this) << "cannot show menu: parent is null";
- return;
- }
- if (visible) {
+
+ auto *window = this->window();
+ if (visible && window) {
// If a right mouse button event opens a menu, don't synthesize QContextMenuEvent
// (avoid opening redundant menus, e.g. in parent items).
- auto *window = this->window();
- Q_ASSERT(window);
QQuickWindowPrivate::get(window)->rmbContextMenuEventEnabled = false;
// Also, if users have their own custom non-ContextMenu-based text editing context menus,
// we want those to take priority over our own. The check above handles that when
diff --git a/src/quicktemplates/qquickpopup.cpp b/src/quicktemplates/qquickpopup.cpp
index 24eb5cf284..a928015ff3 100644
--- a/src/quicktemplates/qquickpopup.cpp
+++ b/src/quicktemplates/qquickpopup.cpp
@@ -2497,6 +2497,7 @@ void QQuickPopup::setVisible(bool visible)
// d->visible is true.
if (d->visible && visible && d->transitionState != QQuickPopupPrivate::ExitTransition)
return;
+
if (!d->visible && !visible)
return;
@@ -2505,6 +2506,11 @@ void QQuickPopup::setVisible(bool visible)
return;
}
+ if (visible && !parentItem()) {
+ qmlWarning(this) << "cannot show popup: parent is null";
+ return;
+ }
+
if (visible)
d->transitionManager.transitionEnter();
else
diff --git a/src/quicktemplates/qquickpopupwindow.cpp b/src/quicktemplates/qquickpopupwindow.cpp
index cc19777aff..e576755ae4 100644
--- a/src/quicktemplates/qquickpopupwindow.cpp
+++ b/src/quicktemplates/qquickpopupwindow.cpp
@@ -264,7 +264,9 @@ bool QQuickPopupWindowPrivate::filterPopupSpecialCases(QEvent *event)
// Note that A QQuickPopupWindow can be bigger than the
// menu itself, to make room for a drop-shadow. But if the press was on top
// of the shadow, targetMenu will still be nullptr.
- closePopupAndParentMenus();
+ // On WASM in particular, it's possible for dialogs to receive the event, when clicking in the non-client area. Don't close in those cases.
+ if (event->type() != QEvent::NonClientAreaMouseButtonPress && event->type() != QEvent::NonClientAreaMouseButtonDblClick)
+ closePopupAndParentMenus();
return false;
}
} else if (pe->isUpdateEvent()){
@@ -300,7 +302,9 @@ bool QQuickPopupWindowPrivate::filterPopupSpecialCases(QEvent *event)
} else if (pe->isEndEvent()) {
if (!targetPopup && !targetMenuBar && closePolicy.testAnyFlags(QQuickPopup::CloseOnReleaseOutside | QQuickPopup::CloseOnReleaseOutsideParent)) {
// Released outside either a popup window, or a menu or menubar that owns a menu using popup windows.
- closePopupAndParentMenus();
+ // This should normally close the current popup window, unless it's inside the non-client area, which can happen in WASM dialogs.
+ if (event->type() != QEvent::NonClientAreaMouseButtonRelease)
+ closePopupAndParentMenus();
return false;
}
diff --git a/src/quickvectorimage/generator/qquickqmlgenerator.cpp b/src/quickvectorimage/generator/qquickqmlgenerator.cpp
index a7bafb2be5..319d8be36c 100644
--- a/src/quickvectorimage/generator/qquickqmlgenerator.cpp
+++ b/src/quickvectorimage/generator/qquickqmlgenerator.cpp
@@ -534,6 +534,8 @@ void QQuickQmlGenerator::generatePath(const PathNodeInfo &info, const QRectF &ov
if (m_flags.testFlag(QQuickVectorImageGenerator::GeneratorFlag::CurveRenderer))
stream() << "preferredRendererType: Shape.CurveRenderer";
+ if (m_flags.testFlag(QQuickVectorImageGenerator::GeneratorFlag::AsyncShapes))
+ stream() << "asynchronous: true";
optimizePaths(info, overrideBoundingRect);
//qCDebug(lcQuickVectorGraphics) << *node->qpath();
generateNodeEnd(info);
@@ -1031,6 +1033,8 @@ void QQuickQmlGenerator::generatePathContainer(const StructureNodeInfo &info)
m_indentLevel++;
if (m_flags.testFlag(QQuickVectorImageGenerator::GeneratorFlag::CurveRenderer))
stream() << "preferredRendererType: Shape.CurveRenderer";
+ if (m_flags.testFlag(QQuickVectorImageGenerator::GeneratorFlag::AsyncShapes))
+ stream() << "asynchronous: true";
m_indentLevel--;
m_inShapeItemLevel++;
diff --git a/src/quickvectorimage/qquickvectorimage.cpp b/src/quickvectorimage/qquickvectorimage.cpp
index a55cc0d705..681f52472b 100644
--- a/src/quickvectorimage/qquickvectorimage.cpp
+++ b/src/quickvectorimage/qquickvectorimage.cpp
@@ -83,6 +83,8 @@ void QQuickVectorImagePrivate::loadFile()
flags.setFlag(QQuickVectorImageGenerator::CurveRenderer);
if (assumeTrustedSource)
flags.setFlag(QQuickVectorImageGenerator::AssumeTrustedSource);
+ if (m_asyncShapes)
+ flags.setFlag(QQuickVectorImageGenerator::AsyncShapes);
if (!m_qmlContext || m_qmlContext->engine() != qmlContext(q)->engine())
m_qmlContext.reset(new QQmlContext(qmlContext(q)->engine()));
@@ -301,6 +303,35 @@ void QQuickVectorImage::setPreferredRendererType(RendererType newPreferredRender
}
/*!
+ \qmlproperty bool QtQuick.VectorImage::VectorImage::asynchronousShapes
+ \since 6.11
+
+ This property controls the {QtQuick.Shapes::Shape::asynchronous}{asynchronous} property of the
+ \l Shape items in the Quick scene that VectorImage builds to represent the image.
+
+ Setting this property to \c true will offload the CPU part of the rendering processing of the
+ shapes to separate worker threads. This can improve CPU utilization and user interface
+ responsiveness.
+
+ By default this property is \c false.
+*/
+
+bool QQuickVectorImage::asynchronousShapes() const
+{
+ Q_D(const QQuickVectorImage);
+ return d->m_asyncShapes;
+}
+
+void QQuickVectorImage::setAsynchronousShapes(bool asynchronous)
+{
+ Q_D(QQuickVectorImage);
+ if (d->m_asyncShapes == asynchronous)
+ return;
+ d->m_asyncShapes = asynchronous;
+ emit asynchronousShapesChanged();
+}
+
+/*!
\qmlproperty bool QtQuick.VectorImage::VectorImage::assumeTrustedSource
\since 6.10
diff --git a/src/quickvectorimage/qquickvectorimage_p.h b/src/quickvectorimage/qquickvectorimage_p.h
index f5d3aa0f51..796dfcb937 100644
--- a/src/quickvectorimage/qquickvectorimage_p.h
+++ b/src/quickvectorimage/qquickvectorimage_p.h
@@ -33,6 +33,7 @@ class Q_QUICKVECTORIMAGE_EXPORT QQuickVectorImage : public QQuickItem
Q_PROPERTY(RendererType preferredRendererType READ preferredRendererType WRITE setPreferredRendererType NOTIFY preferredRendererTypeChanged)
Q_PROPERTY(QQuickVectorImageAnimations *animations READ animations CONSTANT REVISION(6, 10) FINAL)
Q_PROPERTY(bool assumeTrustedSource READ assumeTrustedSource WRITE setAssumeTrustedSource NOTIFY assumeTrustedSourceChanged FINAL)
+ Q_PROPERTY(bool asynchronousShapes READ asynchronousShapes WRITE setAsynchronousShapes NOTIFY asynchronousShapesChanged REVISION(6, 11) FINAL)
QML_NAMED_ELEMENT(VectorImage)
public:
@@ -61,6 +62,9 @@ public:
RendererType preferredRendererType() const;
void setPreferredRendererType(RendererType newPreferredRendererType);
+ bool asynchronousShapes() const;
+ void setAsynchronousShapes(bool asynchronous);
+
QQuickVectorImageAnimations *animations();
bool assumeTrustedSource() const;
@@ -73,6 +77,7 @@ signals:
void fillModeChanged();
void preferredRendererTypeChanged();
+ void asynchronousShapesChanged();
void assumeTrustedSourceChanged();
private slots:
diff --git a/src/quickvectorimage/qquickvectorimage_p_p.h b/src/quickvectorimage/qquickvectorimage_p_p.h
index 5c7a552fdf..5599c414d7 100644
--- a/src/quickvectorimage/qquickvectorimage_p_p.h
+++ b/src/quickvectorimage/qquickvectorimage_p_p.h
@@ -43,6 +43,7 @@ public:
QQuickVectorImage::RendererType preferredRendererType = QQuickVectorImage::GeometryRenderer;
QQuickVectorImageAnimations *animations = nullptr;
bool assumeTrustedSource = false;
+ bool m_asyncShapes = false;
std::unique_ptr<QQmlContext> m_qmlContext;
};
diff --git a/src/quickvectorimage/qquickvectorimageglobal_p.h b/src/quickvectorimage/qquickvectorimageglobal_p.h
index 61c673b04d..4515cf077d 100644
--- a/src/quickvectorimage/qquickvectorimageglobal_p.h
+++ b/src/quickvectorimage/qquickvectorimageglobal_p.h
@@ -33,6 +33,7 @@ namespace QQuickVectorImageGenerator
CurveRenderer = 0x02,
OutlineStrokeMode = 0x04,
AssumeTrustedSource = 0x08,
+ AsyncShapes = 0x10
};
Q_DECLARE_FLAGS(GeneratorFlags, GeneratorFlag);
diff --git a/tests/auto/qml/qqmlimport/data/Timer.qml b/tests/auto/qml/qqmlimport/data/Timer.qml
new file mode 100644
index 0000000000..c907cbad60
--- /dev/null
+++ b/tests/auto/qml/qqmlimport/data/Timer.qml
@@ -0,0 +1,5 @@
+import QtQml
+
+QtObject {
+ property string customValue: "okay"
+}
diff --git a/tests/auto/qml/qqmlimport/data/UsingCustomTimer.qml b/tests/auto/qml/qqmlimport/data/UsingCustomTimer.qml
new file mode 100644
index 0000000000..fceab7d95c
--- /dev/null
+++ b/tests/auto/qml/qqmlimport/data/UsingCustomTimer.qml
@@ -0,0 +1,10 @@
+import QtQml
+import "." as Custom
+
+QtObject {
+ property bool success: custom.customValue === "okay"
+
+ property var v: Custom.Timer {
+ id: custom
+ }
+}
diff --git a/tests/auto/qml/qqmlimport/tst_qqmlimport.cpp b/tests/auto/qml/qqmlimport/tst_qqmlimport.cpp
index 8d4cf5f4ba..0094c2acca 100644
--- a/tests/auto/qml/qqmlimport/tst_qqmlimport.cpp
+++ b/tests/auto/qml/qqmlimport/tst_qqmlimport.cpp
@@ -64,6 +64,7 @@ private slots:
void partialImportVersions();
void registerModuleImport();
void importDependenciesPrecedence();
+ void importFromNamespacedDirctoryResolvesCorrectly();
void cleanup();
void envResourceImportPath();
void preferResourcePath_data();
@@ -670,6 +671,23 @@ void tst_QQmlImport::importDependenciesPrecedence()
QCOMPARE(instance->property("b").toString(), QString::fromLatin1("b"));
}
+void tst_QQmlImport::importFromNamespacedDirctoryResolvesCorrectly()
+{
+ QQmlEngine engine;
+ engine.addImportPath(dataDirectory());
+ QQmlComponent component(&engine);
+ component.loadFromModule("QtQml", "Timer"); // ensure Timer is resolved once to QtQml already
+ QHashedString module {};
+ QHashedString typeName { QLatin1String("Timer") };
+ QVERIFY(QQmlMetaType::qmlType(typeName, module, {}).isValid());
+
+ component.loadUrl(testFileUrl("UsingCustomTimer.qml"));
+ QVERIFY2(component.isReady(), qPrintable(component.errorString()));
+ QScopedPointer<QObject> root(component.create());
+ QVERIFY(root);
+ QVERIFY(root->property("success").toBool());
+}
+
QTEST_MAIN(tst_QQmlImport)
diff --git a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp
index 1127081fe8..b7adb78a65 100644
--- a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp
+++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp
@@ -9758,10 +9758,10 @@ void tst_qqmllanguage::overrideSemantics_invalid_data() {
const Phrase property_var_p = {QQmlJSGrammar::T_PROPERTY, QQmlJSGrammar::T_VAR, propName};
const Phrase override_property_var_p = QQmlJSGrammar::T_OVERRIDE + property_var_p;
- addTestRow({}, override_property_var_p, "Nothing to override. Remove override keyword");
+ addTestRow({}, override_property_var_p, "Nothing to override. Remove \"override\" keyword");
addTestRow(property_var_p, override_property_var_p,
- "Cannot override non virtual property. Add virtual to the property of the base object");
+ "Cannot override non virtual property. Add \"virtual\" to the property of the base object");
const Phrase final_property_var_p = QQmlJSGrammar::T_FINAL + property_var_p;
addTestRow(final_property_var_p, override_property_var_p, "Cannot override FINAL property");
diff --git a/tests/auto/quickcontrols/qquickmenu/data/visibleTrue.qml b/tests/auto/quickcontrols/qquickmenu/data/visibleTrue.qml
new file mode 100644
index 0000000000..673477a701
--- /dev/null
+++ b/tests/auto/quickcontrols/qquickmenu/data/visibleTrue.qml
@@ -0,0 +1,27 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick
+import QtQuick.Controls
+
+ApplicationWindow {
+ width: 600
+ height: 400
+
+ property alias menu: contextMenu
+
+ Item {
+ width: 100
+ height: 100
+ anchors.centerIn: parent
+ Menu {
+ id: contextMenu
+ title: "Some Menu"
+ visible: true
+ MenuItem {
+ text: "Action 1"
+ }
+ }
+ }
+}
+
diff --git a/tests/auto/quickcontrols/qquickmenu/tst_qquickmenu.cpp b/tests/auto/quickcontrols/qquickmenu/tst_qquickmenu.cpp
index 3a739c2508..58f31d2bba 100644
--- a/tests/auto/quickcontrols/qquickmenu/tst_qquickmenu.cpp
+++ b/tests/auto/quickcontrols/qquickmenu/tst_qquickmenu.cpp
@@ -130,6 +130,7 @@ private slots:
void animationOnHeight();
void dontDeleteDelegates();
void loadMenuAsynchronously();
+ void visibleTrue();
private:
bool nativeMenuSupported = false;
@@ -1363,8 +1364,6 @@ void tst_QQuickMenu::openParentlessMenu()
window->show();
QVERIFY(QTest::qWaitForWindowExposed(window));
- QTest::ignoreMessage(QtWarningMsg, QRegularExpression("cannot show menu: parent is null"));
-
QQuickMenu *menu = window->property("menu").value<QQuickMenu *>();
QVERIFY(menu);
menu->setParentItem(nullptr);
@@ -3606,6 +3605,22 @@ void tst_QQuickMenu::loadMenuAsynchronously()
QTest::ignoreMessage(QtWarningMsg, QRegularExpression("There are still \\\\\"(\\d+)\\\\\" items in the process of being created at engine destruction\\."));
}
+void tst_QQuickMenu::visibleTrue()
+{
+ QQuickControlsApplicationHelper helper(this, QLatin1String("visibleTrue.qml"));
+ QVERIFY2(helper.ready, helper.failureMessage());
+ QQuickApplicationWindow *window = helper.appWindow;
+ window->show();
+ QVERIFY(QTest::qWaitForWindowExposed(window));
+
+ auto *menu = window->property("menu").value<QQuickMenu*>();
+ QVERIFY(menu);
+
+ QTRY_VERIFY(menu->isOpened());
+
+ menu->close();
+}
+
QTEST_QUICKCONTROLS_MAIN(tst_QQuickMenu)
#include "tst_qquickmenu.moc"
diff --git a/tests/auto/quickvectorimage/qquickvectorimage/CMakeLists.txt b/tests/auto/quickvectorimage/qquickvectorimage/CMakeLists.txt
index 564640041e..7b9be770c0 100644
--- a/tests/auto/quickvectorimage/qquickvectorimage/CMakeLists.txt
+++ b/tests/auto/quickvectorimage/qquickvectorimage/CMakeLists.txt
@@ -23,6 +23,7 @@ qt_internal_add_test(tst_qquickvectorimage
Qt::Qml
Qt::QmlPrivate
Qt::QuickPrivate
+ Qt::QuickShapesPrivate
Qt::QuickTestUtilsPrivate
TESTDATA
${test_data}
diff --git a/tests/auto/quickvectorimage/qquickvectorimage/data/vectorimage-async.qml b/tests/auto/quickvectorimage/qquickvectorimage/data/vectorimage-async.qml
new file mode 100644
index 0000000000..334c5404aa
--- /dev/null
+++ b/tests/auto/quickvectorimage/qquickvectorimage/data/vectorimage-async.qml
@@ -0,0 +1,13 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick
+import QtQuick.Shapes
+import QtQuick.VectorImage
+
+VectorImage {
+ width: 440
+ height: 220
+ source: fileName
+ asynchronousShapes: true
+}
diff --git a/tests/auto/quickvectorimage/qquickvectorimage/tst_qquickvectorimage.cpp b/tests/auto/quickvectorimage/qquickvectorimage/tst_qquickvectorimage.cpp
index 300bda51bc..a2f3382b2e 100644
--- a/tests/auto/quickvectorimage/qquickvectorimage/tst_qquickvectorimage.cpp
+++ b/tests/auto/quickvectorimage/qquickvectorimage/tst_qquickvectorimage.cpp
@@ -9,6 +9,7 @@
#include <QtQml/qqmlengine.h>
#include <QtQml/qqmlcomponent.h>
#include <QtQuick/qquickitem.h>
+#include <QtQuickShapes/private/qquickshape_p.h>
#include <QtQuickTestUtils/private/qmlutils_p.h>
#include <QtQuickTestUtils/private/viewtestutils_p.h>
@@ -24,6 +25,8 @@ private slots:
void parseFiles_data();
void parseFiles();
void parseBrokenFile();
+ void asyncShapes_data();
+ void asyncShapes();
};
tst_QQuickVectorImage::tst_QQuickVectorImage()
@@ -83,6 +86,40 @@ void tst_QQuickVectorImage::parseBrokenFile()
QVERIFY(item->childItems().first()->size().isNull());
}
+void tst_QQuickVectorImage::asyncShapes_data()
+{
+ QTest::addColumn<QString>("testFile");
+ QTest::addColumn<bool>("isAsync");
+
+ QTest::newRow("sync") << "vectorimage.qml" << false;
+ QTest::newRow("async") << "vectorimage-async.qml" << true;
+}
+
+void tst_QQuickVectorImage::asyncShapes()
+{
+ QFETCH(QString, testFile);
+ QFETCH(bool, isAsync);
+
+ QQmlEngine engine;
+ engine.rootContext()->setContextProperty(QStringLiteral("fileName"), QStringLiteral("qrc:/svgs/gradientxform.svg"));
+
+ QQmlComponent c(&engine, testFileUrl(testFile));
+ QQuickItem *item = qobject_cast<QQuickItem *>(c.create());
+ auto cleanup = qScopeGuard([&item] {
+ delete item;
+ item = nullptr;
+ });
+
+ QVERIFY(item != nullptr);
+ QVERIFY(!item->childItems().isEmpty());
+ QVERIFY(!item->childItems().first()->size().isNull());
+
+ const QList<const QQuickShape *> shapes = item->findChildren<const QQuickShape *>();
+ QVERIFY(!shapes.isEmpty());
+ for (const QQuickShape *shape : shapes)
+ QCOMPARE(shape->asynchronous(), isAsync);
+}
+
QTEST_MAIN(tst_QQuickVectorImage)
#include "tst_qquickvectorimage.moc"
diff --git a/tools/svgtoqml/Qt6SvgToQmlMacros.cmake b/tools/svgtoqml/Qt6SvgToQmlMacros.cmake
index fa60f91692..1474e61d64 100644
--- a/tools/svgtoqml/Qt6SvgToQmlMacros.cmake
+++ b/tools/svgtoqml/Qt6SvgToQmlMacros.cmake
@@ -4,6 +4,7 @@
function(qt6_target_qml_from_svg target)
set(opt_args
CURVE_RENDERER
+ ASYNCHRONOUS_SHAPES
OPTIMIZE_PATHS
OUTLINE_STROKE_MODE)
set(single_args
@@ -39,6 +40,10 @@ function(qt6_target_qml_from_svg target)
list(APPEND svgtoqml_args "-c")
endif()
+ if (arg_ASYNCHRONOUS_SHAPES)
+ list(APPEND svgtoqml_args "-a")
+ endif()
+
if (arg_OPTIMIZE_PATHS)
list(APPEND svgtoqml_args "-p")
endif()
diff --git a/tools/svgtoqml/main.cpp b/tools/svgtoqml/main.cpp
index 5f269d2908..323429d155 100644
--- a/tools/svgtoqml/main.cpp
+++ b/tools/svgtoqml/main.cpp
@@ -31,6 +31,10 @@ int main(int argc, char *argv[])
QCoreApplication::translate("main", "Use the curve renderer in generated QML."));
parser.addOption(curveRendererOption);
+ QCommandLineOption asyncOption({ "a", "asynchronous-shapes" },
+ QCoreApplication::translate("main", "Enable asynchronous mode in the generated Shape items."));
+ parser.addOption(asyncOption);
+
QCommandLineOption optimizeOption({ "p", "optimize-paths" },
QCoreApplication::translate("main", "Optimize paths for the curve renderer."));
parser.addOption(optimizeOption);
@@ -117,6 +121,8 @@ int main(int argc, char *argv[])
flags |= QQuickVectorImageGenerator::GeneratorFlag::AssumeTrustedSource;
if (parser.isSet(curveRendererOption))
flags |= QQuickVectorImageGenerator::GeneratorFlag::CurveRenderer;
+ if (parser.isSet(asyncOption))
+ flags |= QQuickVectorImageGenerator::GeneratorFlag::AsyncShapes;
if (parser.isSet(optimizeOption))
flags |= QQuickVectorImageGenerator::GeneratorFlag::OptimizePaths;
if (parser.isSet(outlineModeOption))