Christophe Marin 2025-02-01 08:45:15 +00:00 committed by Git OBS Bridge
commit 8f1805f932
23 changed files with 4151 additions and 0 deletions

23
.gitattributes vendored Normal file
View File

@ -0,0 +1,23 @@
## Default LFS
*.7z filter=lfs diff=lfs merge=lfs -text
*.bsp filter=lfs diff=lfs merge=lfs -text
*.bz2 filter=lfs diff=lfs merge=lfs -text
*.gem filter=lfs diff=lfs merge=lfs -text
*.gz filter=lfs diff=lfs merge=lfs -text
*.jar filter=lfs diff=lfs merge=lfs -text
*.lz filter=lfs diff=lfs merge=lfs -text
*.lzma filter=lfs diff=lfs merge=lfs -text
*.obscpio filter=lfs diff=lfs merge=lfs -text
*.oxt filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.rpm filter=lfs diff=lfs merge=lfs -text
*.tbz filter=lfs diff=lfs merge=lfs -text
*.tbz2 filter=lfs diff=lfs merge=lfs -text
*.tgz filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.txz filter=lfs diff=lfs merge=lfs -text
*.whl filter=lfs diff=lfs merge=lfs -text
*.xz filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.osc

View File

@ -0,0 +1,42 @@
From eff776c676b042bd75604105a3876f999b9808d5 Mon Sep 17 00:00:00 2001
From: Joerg Bornemann <joerg.bornemann@qt.io>
Date: Mon, 23 Dec 2024 12:47:21 +0100
Subject: [PATCH] CMake: Fix find_package call in Qt6QmlFindQmlscInternal.cmake
Qt6QmlFindQmlscInternal.cmake tries to find the
Qt6QmlCompilerPlusPrivateTools package and specifies a version. That
version was PROJECT_VERSION, which is the version of the user project.
It should be the Qt's version instead.
Read the package version of the Qt6::Qml target and use that in the
find_package call. The target is guaranteed to exist, because the
Qt6QmlFindQmlscInternal.cmake inclusion is guarded by a check for this
target.
This amends commit b0f1ec4e394dcee82400964225be485a7cdd3c53.
Pick-to: 6.8 6.9
Fixes: QTBUG-132421
Change-Id: I04402296b351ef8df991ade697c633594b0b17b5
Reviewed-by: Alexey Edelev <alexey.edelev@qt.io>
---
src/qml/Qt6QmlFindQmlscInternal.cmake | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/qml/Qt6QmlFindQmlscInternal.cmake b/src/qml/Qt6QmlFindQmlscInternal.cmake
index f02103f45f..3f549c7cbe 100644
--- a/src/qml/Qt6QmlFindQmlscInternal.cmake
+++ b/src/qml/Qt6QmlFindQmlscInternal.cmake
@@ -30,7 +30,8 @@ endif()
# This can't use the find_package(Qt6 COMPONENTS) signature, because Qt6Config uses NO_DEFAULT and
# won't look at the prepended extra find root paths.
-find_package(Qt6QmlCompilerPlusPrivateTools ${PROJECT_VERSION} QUIET CONFIG
+get_target_property(_qt_qml_package_version Qt6::Qml _qt_package_version)
+find_package(Qt6QmlCompilerPlusPrivateTools ${_qt_qml_package_version} QUIET CONFIG
PATHS
${_qt_additional_host_packages_prefix_paths}
)
--
2.47.1

View File

@ -0,0 +1,45 @@
From e6e3da4de8fac7f52eb2591cb95a04ab413f8ace Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olivier=20De=20Canni=C3=A8re?= <olivier.decanniere@qt.io>
Date: Wed, 9 Oct 2024 09:41:27 +0200
Subject: [PATCH] Compiler: Wrap raw string literals in QStringLiteral in
generated code
Amends e7146cd98700c29802214a39a4cefd9db146c97a
Fixes: QTBUG-129797
Change-Id: I5dc48412cf29bd2de877dd681ea309a6e74d75c5
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
(cherry picked from commit d63c560ec4ce79c1bb24e1a01a20de41706dd039)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
---
src/qmlcompiler/qqmljscodegenerator.cpp | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/qmlcompiler/qqmljscodegenerator.cpp b/src/qmlcompiler/qqmljscodegenerator.cpp
index 807168ca09..e5622fe6f9 100644
--- a/src/qmlcompiler/qqmljscodegenerator.cpp
+++ b/src/qmlcompiler/qqmljscodegenerator.cpp
@@ -77,16 +77,16 @@ QString QQmlJSCodeGenerator::compositeListMetaType(const QString &elementName) c
{
return u"QQmlPrivate::compositeListMetaType(aotContext->compilationUnit, "_s
+ (m_jsUnitGenerator->hasStringId(elementName)
- ? QString::number(m_jsUnitGenerator->getStringId(elementName))
- : u'"' + elementName + u'"') + u")"_s;
+ ? QString::number(m_jsUnitGenerator->getStringId(elementName)) + u')'
+ : u"QStringLiteral(\"%1\"))"_s.arg(elementName));
}
QString QQmlJSCodeGenerator::compositeMetaType(const QString &elementName) const
{
return u"QQmlPrivate::compositeMetaType(aotContext->compilationUnit, "_s
+ (m_jsUnitGenerator->hasStringId(elementName)
- ? QString::number(m_jsUnitGenerator->getStringId(elementName))
- : u'"' + elementName + u'"') + u")"_s;
+ ? QString::number(m_jsUnitGenerator->getStringId(elementName)) + u')'
+ : u"QStringLiteral(\"%1\"))"_s.arg(elementName));
}
QString QQmlJSCodeGenerator::metaObject(const QQmlJSScope::ConstPtr &objectType)
--
2.47.0

View File

@ -0,0 +1,53 @@
From 4a99ac0df29689664dcfd2e4f3cf079911c7cb24 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olivier=20De=20Canni=C3=A8re?= <olivier.decanniere@qt.io>
Date: Mon, 11 Nov 2024 13:23:39 +0100
Subject: [PATCH] Engine: Mark created wrapped objects after
GCState::MarkWeakValues
Pick-to: 6.8
Change-Id: I2fd7c8829267a2e3de1ac374859a4d21d948dd8f
---
src/qml/jsruntime/qv4qobjectwrapper_p.h | 20 ++++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/src/qml/jsruntime/qv4qobjectwrapper_p.h b/src/qml/jsruntime/qv4qobjectwrapper_p.h
index 826930cd25..fbb673c650 100644
--- a/src/qml/jsruntime/qv4qobjectwrapper_p.h
+++ b/src/qml/jsruntime/qv4qobjectwrapper_p.h
@@ -233,7 +233,15 @@ inline ReturnedValue QObjectWrapper::wrap(ExecutionEngine *engine, QObject *obje
return ddata->jsWrapper.value();
}
- return wrap_slowPath(engine, object);
+ const auto rv = wrap_slowPath(engine, object);
+ const auto gcState = engine->memoryManager->gcStateMachine->state;
+ if (gcState != GCStateMachine::Invalid && gcState >= GCState::MarkWeakValues) {
+ auto *m = StaticValue::fromReturnedValue(rv).m();
+ QV4::WriteBarrier::markCustom(engine, [m](QV4::MarkStack *ms) {
+ m->mark(ms);
+ });
+ }
+ return rv;
}
// Unfortunately we still need a non-const QObject* here because QQmlData needs to register itself in QObjectPrivate.
@@ -242,7 +250,15 @@ inline ReturnedValue QObjectWrapper::wrapConst(ExecutionEngine *engine, QObject
if (Q_UNLIKELY(QQmlData::wasDeleted(object)))
return QV4::Encode::null();
- return wrapConst_slowPath(engine, object);
+ const auto rv = wrapConst_slowPath(engine, object);
+ const auto gcState = engine->memoryManager->gcStateMachine->state;
+ if (gcState != GCStateMachine::Invalid && gcState >= GCState::MarkWeakValues) {
+ auto *m = StaticValue::fromReturnedValue(rv).m();
+ QV4::WriteBarrier::markCustom(engine, [m](QV4::MarkStack *ms) {
+ m->mark(ms);
+ });
+ }
+ return rv;
}
inline bool canConvert(const QQmlPropertyCache *fromMo, const QQmlPropertyCache *toMo)
--
2.47.0

View File

@ -0,0 +1,338 @@
From 104b0d6e88ce6781c9d31cf0dd14dfe99988b789 Mon Sep 17 00:00:00 2001
From: Luca Di Sera <luca.disera@qt.io>
Date: Fri, 30 Aug 2024 17:44:16 +0200
Subject: [PATCH] Log state transitions for the GC
Add a new logging category, "qt.qml.gc.stateTransitions", that can be
enabled to receive some simple log lines about the GC being on the
verge of executing the current state and about the new state that it
transitioned to after the execution.
As the new logs print the current state, which is stored through the
`GCState` enum, slightly modify the code to allow for registering the
enumeration with `Q_ENUM`.
In particular, move `GCState` and `GCStateInfo`, the latter due to the
dependencies between the types, under `GCStateMachine`.
Make `GCStateMachine` a `Q_GADGET` and `GCState` a `Q_ENUM` and provide
some using statements to reduce the impact of the changes.
Finally, fix the unqualified accesses to the variants of `GCState` to
support the new structure.
Task-number: QTBUG-128357
Change-Id: I9d469ddb745f70b9c4553379f6d96719b3a2bb09
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
(cherry picked from commit c048f8337c7b0aa8a31c93e559aa8a5bf286c29e)
---
src/qml/memory/qv4mm.cpp | 60 ++++++++++++++++++++++---------------
src/qml/memory/qv4mm_p.h | 64 +++++++++++++++++++++++-----------------
2 files changed, 73 insertions(+), 51 deletions(-)
diff --git a/src/qml/memory/qv4mm.cpp b/src/qml/memory/qv4mm.cpp
index 0ef32d5273..d9f4541aec 100644
--- a/src/qml/memory/qv4mm.cpp
+++ b/src/qml/memory/qv4mm.cpp
@@ -60,6 +60,8 @@ Q_LOGGING_CATEGORY(lcGcStats, "qt.qml.gc.statistics")
Q_DECLARE_LOGGING_CATEGORY(lcGcStats)
Q_LOGGING_CATEGORY(lcGcAllocatorStats, "qt.qml.gc.allocatorStats")
Q_DECLARE_LOGGING_CATEGORY(lcGcAllocatorStats)
+Q_LOGGING_CATEGORY(lcGcStateTransitions, "qt.qml.gc.stateTransitions")
+Q_DECLARE_LOGGING_CATEGORY(lcGcStateTransitions)
using namespace WTF;
@@ -680,27 +682,27 @@ GCState markStart(GCStateMachine *that, ExtraData &)
//Initialize the mark stack
that->mm->m_markStack = std::make_unique<MarkStack>(that->mm->engine);
that->mm->engine->isGCOngoing = true;
- return MarkGlobalObject;
+ return GCState::MarkGlobalObject;
}
GCState markGlobalObject(GCStateMachine *that, ExtraData &)
{
that->mm->engine->markObjects(that->mm->m_markStack.get());
- return MarkJSStack;
+ return GCState::MarkJSStack;
}
GCState markJSStack(GCStateMachine *that, ExtraData &)
{
that->mm->collectFromJSStack(that->mm->markStack());
- return InitMarkPersistentValues;
+ return GCState::InitMarkPersistentValues;
}
GCState initMarkPersistentValues(GCStateMachine *that, ExtraData &stateData)
{
if (!that->mm->m_persistentValues)
- return InitMarkWeakValues; // no persistent values to mark
+ return GCState::InitMarkWeakValues; // no persistent values to mark
stateData = GCIteratorStorage { that->mm->m_persistentValues->begin() };
- return MarkPersistentValues;
+ return GCState::MarkPersistentValues;
}
static constexpr int markLoopIterationCount = 1024;
@@ -717,35 +719,35 @@ bool wasDrainNecessary(MarkStack *ms, QDeadlineTimer deadline)
GCState markPersistentValues(GCStateMachine *that, ExtraData &stateData) {
auto markStack = that->mm->markStack();
if (wasDrainNecessary(markStack, that->deadline) && that->deadline.hasExpired())
- return MarkPersistentValues;
+ return GCState::MarkPersistentValues;
PersistentValueStorage::Iterator& it = get<GCIteratorStorage>(stateData).it;
// avoid repeatedly hitting the timer constantly by batching iterations
for (int i = 0; i < markLoopIterationCount; ++i) {
if (!it.p)
- return InitMarkWeakValues;
+ return GCState::InitMarkWeakValues;
if (Managed *m = (*it).as<Managed>())
m->mark(markStack);
++it;
}
- return MarkPersistentValues;
+ return GCState::MarkPersistentValues;
}
GCState initMarkWeakValues(GCStateMachine *that, ExtraData &stateData)
{
stateData = GCIteratorStorage { that->mm->m_weakValues->begin() };
- return MarkWeakValues;
+ return GCState::MarkWeakValues;
}
GCState markWeakValues(GCStateMachine *that, ExtraData &stateData)
{
auto markStack = that->mm->markStack();
if (wasDrainNecessary(markStack, that->deadline) && that->deadline.hasExpired())
- return MarkWeakValues;
+ return GCState::MarkWeakValues;
PersistentValueStorage::Iterator& it = get<GCIteratorStorage>(stateData).it;
// avoid repeatedly hitting the timer constantly by batching iterations
for (int i = 0; i < markLoopIterationCount; ++i) {
if (!it.p)
- return MarkDrain;
+ return GCState::MarkDrain;
QObjectWrapper *qobjectWrapper = (*it).as<QObjectWrapper>();
++it;
if (!qobjectWrapper)
@@ -766,25 +768,25 @@ GCState markWeakValues(GCStateMachine *that, ExtraData &stateData)
if (keepAlive)
qobjectWrapper->mark(that->mm->markStack());
}
- return MarkWeakValues;
+ return GCState::MarkWeakValues;
}
GCState markDrain(GCStateMachine *that, ExtraData &)
{
if (that->deadline.isForever()) {
that->mm->markStack()->drain();
- return MarkReady;
+ return GCState::MarkReady;
}
auto drainState = that->mm->m_markStack->drain(that->deadline);
return drainState == MarkStack::DrainState::Complete
- ? MarkReady
- : MarkDrain;
+ ? GCState::MarkReady
+ : GCState::MarkDrain;
}
GCState markReady(GCStateMachine *, ExtraData &)
{
//Possibility to do some clean up, stat printing, etc...
- return InitCallDestroyObjects;
+ return GCState::InitCallDestroyObjects;
}
/** \!internal
@@ -801,9 +803,9 @@ GCState initCallDestroyObjects(GCStateMachine *that, ExtraData &stateData)
// as we don't have a deletion barrier, we need to rescan the stack
redrain(that);
if (!that->mm->m_weakValues)
- return FreeWeakMaps; // no need to call destroy objects
+ return GCState::FreeWeakMaps; // no need to call destroy objects
stateData = GCIteratorStorage { that->mm->m_weakValues->begin() };
- return CallDestroyObjects;
+ return GCState::CallDestroyObjects;
}
GCState callDestroyObject(GCStateMachine *that, ExtraData &stateData)
{
@@ -816,7 +818,7 @@ GCState callDestroyObject(GCStateMachine *that, ExtraData &stateData)
// avoid repeatedly hitting the timer constantly by batching iterations
for (int i = 0; i < markLoopIterationCount; ++i) {
if (!it.p)
- return FreeWeakMaps;
+ return GCState::FreeWeakMaps;
Managed *m = (*it).managed();
++it;
if (!m || m->markBit())
@@ -826,7 +828,7 @@ GCState callDestroyObject(GCStateMachine *that, ExtraData &stateData)
if (QObjectWrapper *qobjectWrapper = m->as<QObjectWrapper>())
qobjectWrapper->destroyObject(/*lastSweep =*/false);
}
- return CallDestroyObjects;
+ return GCState::CallDestroyObjects;
}
void freeWeakMaps(MemoryManager *mm)
@@ -843,7 +845,7 @@ void freeWeakMaps(MemoryManager *mm)
GCState freeWeakMaps(GCStateMachine *that, ExtraData &)
{
freeWeakMaps(that->mm);
- return FreeWeakSets;
+ return GCState::FreeWeakSets;
}
void freeWeakSets(MemoryManager *mm)
@@ -861,13 +863,13 @@ void freeWeakSets(MemoryManager *mm)
GCState freeWeakSets(GCStateMachine *that, ExtraData &)
{
freeWeakSets(that->mm);
- return HandleQObjectWrappers;
+ return GCState::HandleQObjectWrappers;
}
GCState handleQObjectWrappers(GCStateMachine *that, ExtraData &)
{
that->mm->cleanupDeletedQObjectWrappersInSweep();
- return DoSweep;
+ return GCState::DoSweep;
}
GCState doSweep(GCStateMachine *that, ExtraData &)
@@ -891,7 +893,7 @@ GCState doSweep(GCStateMachine *that, ExtraData &)
mm->updateUnmanagedHeapSizeGCLimit();
- return Invalid;
+ return GCState::Invalid;
}
}
@@ -1491,8 +1493,12 @@ void GCStateMachine::transition() {
*/
redrain(this);
}
+ qCDebug(lcGcStateTransitions) << "Preparing to execute the"
+ << QMetaEnum::fromType<GCState>().key(state) << "state";
GCStateInfo& stateInfo = stateInfoMap[int(state)];
state = stateInfo.execute(this, stateData);
+ qCDebug(lcGcStateTransitions) << "Transitioning to the"
+ << QMetaEnum::fromType<GCState>().key(state) << "state";
if (stateInfo.breakAfter)
break;
}
@@ -1505,8 +1511,12 @@ void GCStateMachine::transition() {
} else {
deadline = QDeadlineTimer::Forever;
while (state != GCState::Invalid) {
+ qCDebug(lcGcStateTransitions) << "Preparing to execute the"
+ << QMetaEnum::fromType<GCState>().key(state) << "state";
GCStateInfo& stateInfo = stateInfoMap[int(state)];
state = stateInfo.execute(this, stateData);
+ qCDebug(lcGcStateTransitions) << "Transitioning to the"
+ << QMetaEnum::fromType<GCState>().key(state) << "state";
}
}
}
@@ -1514,3 +1524,5 @@ void GCStateMachine::transition() {
} // namespace QV4
QT_END_NAMESPACE
+
+#include "moc_qv4mm_p.cpp"
diff --git a/src/qml/memory/qv4mm_p.h b/src/qml/memory/qv4mm_p.h
index ef0cd0c36c..9cdebdb1f4 100644
--- a/src/qml/memory/qv4mm_p.h
+++ b/src/qml/memory/qv4mm_p.h
@@ -28,40 +28,48 @@ QT_BEGIN_NAMESPACE
namespace QV4 {
-enum GCState {
- MarkStart = 0,
- MarkGlobalObject,
- MarkJSStack,
- InitMarkPersistentValues,
- MarkPersistentValues,
- InitMarkWeakValues,
- MarkWeakValues,
- MarkDrain,
- MarkReady,
- InitCallDestroyObjects,
- CallDestroyObjects,
- FreeWeakMaps,
- FreeWeakSets,
- HandleQObjectWrappers,
- DoSweep,
- Invalid,
- Count,
-};
-
struct GCData { virtual ~GCData(){};};
struct GCIteratorStorage {
PersistentValueStorage::Iterator it{nullptr, 0};
};
-struct GCStateMachine;
-
-struct GCStateInfo {
- using ExtraData = std::variant<std::monostate, GCIteratorStorage>;
- GCState (*execute)(GCStateMachine *, ExtraData &) = nullptr; // Function to execute for this state, returns true if ready to transition
- bool breakAfter{false};
-};
struct GCStateMachine {
+ Q_GADGET_EXPORT(Q_QML_EXPORT)
+
+public:
+ enum GCState {
+ MarkStart = 0,
+ MarkGlobalObject,
+ MarkJSStack,
+ InitMarkPersistentValues,
+ MarkPersistentValues,
+ InitMarkWeakValues,
+ MarkWeakValues,
+ MarkDrain,
+ MarkReady,
+ InitCallDestroyObjects,
+ CallDestroyObjects,
+ FreeWeakMaps,
+ FreeWeakSets,
+ HandleQObjectWrappers,
+ DoSweep,
+ Invalid,
+ Count,
+ };
+ Q_ENUM(GCState)
+
+ struct StepTiming {
+ qint64 rolling_sum = 0;
+ qint64 count = 0;
+ };
+
+ struct GCStateInfo {
+ using ExtraData = std::variant<std::monostate, GCIteratorStorage>;
+ GCState (*execute)(GCStateMachine *, ExtraData &) = nullptr; // Function to execute for this state, returns true if ready to transition
+ bool breakAfter{false};
+ };
+
using ExtraData = GCStateInfo::ExtraData;
GCState state{GCState::Invalid};
std::chrono::microseconds timeLimit{};
@@ -94,6 +102,8 @@ struct GCStateMachine {
}
};
+using GCState = GCStateMachine::GCState;
+using GCStateInfo = GCStateMachine::GCStateInfo;
struct ChunkAllocator;
struct MemorySegment;
--
2.47.0

View File

@ -0,0 +1,116 @@
From 71a9938f4e093c77fc7b9f1cf8043e6d3552aff3 Mon Sep 17 00:00:00 2001
From: Aleix Pol <aleixpol@kde.org>
Date: Tue, 22 Oct 2024 02:47:48 +0200
Subject: [PATCH] QQuickAccessibleAttached: Let implicit names work when
there's a proxy
QQuickAccessibleAttached has infrastructure to provide an implicit name
that we were bypassing now that we have proxies (introduced in 6.8).
We should only use the name of the proxy when it's being set, otherwise
we better provide the implicit name.
Amends 7bdeea2c309150c8b49558b135232926d6a89c50.
Fixes: QTBUG-130360
Pick-to: 6.8
Change-Id: I37470e1f28e837bdbb304726ee85f45ba6577621
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
---
src/quick/items/qquickaccessibleattached_p.h | 2 +-
.../data/actionAccessibility/button2.qml | 9 +++++
.../accessibility/tst_accessibility.cpp | 36 +++++++++++++++++++
3 files changed, 46 insertions(+), 1 deletion(-)
create mode 100644 tests/auto/quickcontrols/accessibility/data/actionAccessibility/button2.qml
diff --git a/src/quick/items/qquickaccessibleattached_p.h b/src/quick/items/qquickaccessibleattached_p.h
index aa15b43..2d44000 100644
--- a/src/quick/items/qquickaccessibleattached_p.h
+++ b/src/quick/items/qquickaccessibleattached_p.h
@@ -87,7 +87,7 @@ public:
QString name() const {
if (m_state.passwordEdit)
return QString();
- if (m_proxying)
+ if (!m_nameExplicitlySet && m_proxying && m_proxying->wasNameExplicitlySet())
return m_proxying->name();
return m_name;
}
diff --git a/tests/auto/quickcontrols/accessibility/data/actionAccessibility/button2.qml b/tests/auto/quickcontrols/accessibility/data/actionAccessibility/button2.qml
new file mode 100644
index 0000000..1cd1c81
--- /dev/null
+++ b/tests/auto/quickcontrols/accessibility/data/actionAccessibility/button2.qml
@@ -0,0 +1,9 @@
+import QtQuick
+import QtQuick.Controls
+
+Button {
+ action: Action {
+ text: "Pears"
+ Accessible.description: "Show pears some love"
+ }
+}
diff --git a/tests/auto/quickcontrols/accessibility/tst_accessibility.cpp b/tests/auto/quickcontrols/accessibility/tst_accessibility.cpp
index 8bdd945..2018c0e 100644
--- a/tests/auto/quickcontrols/accessibility/tst_accessibility.cpp
+++ b/tests/auto/quickcontrols/accessibility/tst_accessibility.cpp
@@ -33,6 +33,8 @@ private slots:
void ordering();
void actionAccessibility();
+ void actionAccessibilityImplicitName();
+
private:
QQmlEngine engine;
};
@@ -279,6 +281,13 @@ void tst_accessibility::ordering()
void tst_accessibility::actionAccessibility()
{
#if QT_CONFIG(accessibility)
+ if (!QAccessible::isActive()) {
+ QPlatformAccessibility *accessibility = platformAccessibility();
+ if (!accessibility)
+ QSKIP("No QPlatformAccessibility available.");
+ accessibility->setActive(true);
+ }
+
QQmlComponent component(&engine);
component.loadUrl(testFileUrl("actionAccessibility/button.qml"));
@@ -296,6 +305,33 @@ void tst_accessibility::actionAccessibility()
#endif
}
+void tst_accessibility::actionAccessibilityImplicitName()
+{
+#if QT_CONFIG(accessibility)
+ if (!QAccessible::isActive()) {
+ QPlatformAccessibility *accessibility = platformAccessibility();
+ if (!accessibility)
+ QSKIP("No QPlatformAccessibility available.");
+ accessibility->setActive(true);
+ }
+
+ QQmlComponent component(&engine);
+ component.loadUrl(testFileUrl("actionAccessibility/button2.qml"));
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY2(!object.isNull(), qPrintable(component.errorString()));
+
+ QQuickItem *item = qobject_cast<QQuickItem *>(object.data());
+ QVERIFY(item);
+ const QString description = "Show pears some love";
+ QCOMPARE(item->property("text"), "Pears");
+ QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(item);
+ QVERIFY(iface);
+ QCOMPARE(iface->text(QAccessible::Name), "Pears"); // We get the action.text implicitly
+ QCOMPARE(iface->text(QAccessible::Description), description);
+#endif
+}
+
QTEST_MAIN(tst_accessibility)
#include "tst_accessibility.moc"
--
2.47.0

View File

@ -0,0 +1,126 @@
From 0ae3697cf40bcd3ae1de20621abad17cf6c5f52d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= <tor.arne.vestbo@qt.io>
Date: Wed, 2 Oct 2024 17:04:25 +0200
Subject: [PATCH] QQuickItem::map{To,From}Item: Account for not having a window
yet
Prior to 06ace3e226b2394362e27d1bc4743c1170777af1 we would not
account for items in different scenes, and would map them as if
they were part of the same scene.
After 06ace3e226b2394362e27d1bc4743c1170777af1 we took the scenes
into account, but failed to guard against one or both of the items
not having a scene (yet), causing potential crashes.
We now properly check that both items have a scene before trying
any scene to scene mapping.
The semantics if one or both of the items are not in a scene is
kept as it was before 06ace3e226b2394362e27d1bc4743c1170777af1,
where we assume the two items are part of the same scene, and an
item without a parent is assumed to be the root of its scene.
Fixes: QTBUG-129500
Change-Id: I897faf73d04dddd68a7a8797e5238743efdd4f73
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
(cherry picked from commit 08b0e3e39e899bea013057a7ac038b8878809712)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
---
src/quick/items/qquickitem.cpp | 14 +++++-----
.../data/mapCoordinatesWithWindows.qml | 11 ++++++++
.../auto/quick/qquickitem2/tst_qquickitem.cpp | 27 +++++++++++++++++++
3 files changed, 46 insertions(+), 6 deletions(-)
diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp
index 9288df17a4..802f4dad55 100644
--- a/src/quick/items/qquickitem.cpp
+++ b/src/quick/items/qquickitem.cpp
@@ -8755,9 +8755,10 @@ QPointF QQuickItem::mapToItem(const QQuickItem *item, const QPointF &point) cons
{
QPointF p = mapToScene(point);
if (item) {
- const QQuickWindow *itemWindow = item->window();
- if (itemWindow != nullptr && itemWindow != window())
- p = itemWindow->mapFromGlobal(window()->mapToGlobal(p));
+ const auto *itemWindow = item->window();
+ const auto *thisWindow = window();
+ if (thisWindow && itemWindow && itemWindow != thisWindow)
+ p = itemWindow->mapFromGlobal(thisWindow->mapToGlobal(p));
p = item->mapFromScene(p);
}
@@ -8862,9 +8863,10 @@ QPointF QQuickItem::mapFromItem(const QQuickItem *item, const QPointF &point) co
QPointF p = point;
if (item) {
p = item->mapToScene(point);
-
- if (item->window() != window())
- p = window()->mapFromGlobal(item->window()->mapToGlobal(p));
+ const auto *itemWindow = item->window();
+ const auto *thisWindow = window();
+ if (thisWindow && itemWindow && itemWindow != thisWindow)
+ p = thisWindow->mapFromGlobal(itemWindow->mapToGlobal(p));
}
return mapFromScene(p);
}
diff --git a/tests/auto/quick/qquickitem2/data/mapCoordinatesWithWindows.qml b/tests/auto/quick/qquickitem2/data/mapCoordinatesWithWindows.qml
index 98fc0e77af..1696699a75 100644
--- a/tests/auto/quick/qquickitem2/data/mapCoordinatesWithWindows.qml
+++ b/tests/auto/quick/qquickitem2/data/mapCoordinatesWithWindows.qml
@@ -48,4 +48,15 @@ QtObject {
color: "cyan"
}
}
+
+ property Item itemWithoutWindowA: Item {
+ x: 20; y: 20
+ }
+ property Item itemWithoutWindowB: Item {
+ x: 40; y: 40
+ Item {
+ objectName: "childItemWithoutWindow"
+ x: 30; y: 30
+ }
+ }
}
diff --git a/tests/auto/quick/qquickitem2/tst_qquickitem.cpp b/tests/auto/quick/qquickitem2/tst_qquickitem.cpp
index 154c4a661f..eb4f62e65f 100644
--- a/tests/auto/quick/qquickitem2/tst_qquickitem.cpp
+++ b/tests/auto/quick/qquickitem2/tst_qquickitem.cpp
@@ -2945,6 +2945,33 @@ void tst_QQuickItem::mapCoordinatesWithWindows()
globalItemOffset(childItemInChildWindow, childItemInOtherWindow));
QCOMPARE(childItemInChildWindow->mapFromItem(childItemInOtherWindow, {0, 0}),
globalItemOffset(childItemInOtherWindow, childItemInChildWindow));
+
+ // If one or both of the items are not in a scene (yet), they are assumed
+ // to eventually be in the same scene.
+
+ auto *itemWithoutWindowA = root->property("itemWithoutWindowA").value<QQuickItem*>();
+ QVERIFY(itemWithoutWindowA);
+ auto *itemWithoutWindowB = root->property("itemWithoutWindowB").value<QQuickItem*>();
+ QVERIFY(itemWithoutWindowB);
+ auto *childItemWithoutWindow = itemWithoutWindowB->findChild<QQuickItem*>("childItemWithoutWindow");
+ QVERIFY(childItemWithoutWindow);
+
+ QPoint itemWithoutWindowAPos = itemWithoutWindowA->position().toPoint();
+ QPoint itemWithoutWindowBPos = itemWithoutWindowB->position().toPoint();
+
+ QCOMPARE(itemWithoutWindowA->mapToItem(childItemWithoutWindow, {0, 0}),
+ itemWithoutWindowAPos - (itemWithoutWindowBPos + childItemWithoutWindow->position()));
+ QCOMPARE(itemWithoutWindowA->mapFromItem(childItemWithoutWindow, {0, 0}),
+ (itemWithoutWindowBPos + childItemWithoutWindow->position()) - itemWithoutWindowAPos);
+
+ QCOMPARE(itemWithoutWindowA->mapToItem(childItem, {0, 0}),
+ itemWithoutWindowAPos - itemPos);
+ QCOMPARE(itemWithoutWindowA->mapFromItem(childItem, {0, 0}),
+ itemPos - itemWithoutWindowAPos);
+ QCOMPARE(childItem->mapToItem(itemWithoutWindowA, {0, 0}),
+ itemPos - itemWithoutWindowAPos);
+ QCOMPARE(childItem->mapFromItem(itemWithoutWindowA, {0, 0}),
+ itemWithoutWindowAPos - itemPos);
}
void tst_QQuickItem::transforms_data()
--
2.47.0

View File

@ -0,0 +1,127 @@
From c343a0bb2a8f87758bf97241223224770e5c4687 Mon Sep 17 00:00:00 2001
From: Mitch Curtis <mitch.curtis@qt.io>
Date: Tue, 22 Oct 2024 13:26:08 +0800
Subject: [PATCH] QQuickItemView: fix crash with zero-size SwipeView that uses
Repeater
When running the minimal example from the bug report, the order of
events is:
1. deletables are iterated in QQuickRepeater::clear(), and deleteLater
is called on the delegate item.
2. deletables are unparented. This causes Container (SwipeView) to be
notified of the parent change and it removes the item. Part of this
involves changing the currentIndex, since the removed item was current.
3. SwipeView's contentItem (ListView) has its currentIndex bound to the
container's, so QQuickItemView::setCurrentIndex is called.
4. setCurrentIndex calls updateCurrent, which detects that the
currentIndex (which is -1, because there was only one item) is out of
range and so releases the item. This causes it to be added to
unrequestedItems, even though it has been scheduled for deletion.
This patch makes QQuickItemView detect that the item is going to be
deleted and not add it to the list of deletables.
Fixes: QTBUG-129622
Pick-to: 6.5 6.8
Change-Id: I999aedbdfafc61ff6d33eb6579331f470e9c1454
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
---
src/quick/items/qquickitemview.cpp | 4 +-
.../controls/data/tst_swipeview.qml | 59 +++++++++++++++++++
2 files changed, 62 insertions(+), 1 deletion(-)
diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp
index 19e5b7f..dabd563 100644
--- a/src/quick/items/qquickitemview.cpp
+++ b/src/quick/items/qquickitemview.cpp
@@ -2499,7 +2499,9 @@ bool QQuickItemViewPrivate::releaseItem(FxViewItem *item, QQmlInstanceModel::Reu
// One case where this can happen is moving an item out of one ObjectModel and into another.
QQuickItemPrivate::get(item->item)->setCulled(true);
}
- if (!isClearing)
+ // If deleteLater was called, the item isn't long for this world and so we shouldn't store references to it.
+ // This can happen when a Repeater is used to populate items in SwipeView's ListView contentItem.
+ if (!isClearing && !QObjectPrivate::get(item->item)->deleteLaterCalled)
unrequestedItems.insert(item->item, model->indexOf(item->item, q));
} else if (flags & QQmlInstanceModel::Destroyed) {
item->item->setParentItem(nullptr);
diff --git a/tests/auto/quickcontrols/controls/data/tst_swipeview.qml b/tests/auto/quickcontrols/controls/data/tst_swipeview.qml
index 3a7558c..a3dd16c 100644
--- a/tests/auto/quickcontrols/controls/data/tst_swipeview.qml
+++ b/tests/auto/quickcontrols/controls/data/tst_swipeview.qml
@@ -4,6 +4,7 @@
import QtQuick
import QtTest
import QtQuick.Controls
+import QtQuick.Layouts
TestCase {
id: testCase
@@ -760,4 +761,62 @@ TestCase {
tryCompare(swipeListView, "contentX", swipeListView.width, 1000)
compare(item2.x, swipeListView.width)
}
+
+ Component {
+ id: zeroSizeSwipeViewWithRepeatersComponent
+
+ Item {
+ objectName: "rootItem"
+ anchors.fill: parent
+
+ property alias swipeView: swipeView
+ property int d
+
+ Timer {
+ interval: 2
+ running: true
+ repeat: false
+ onTriggered: d = 2
+ }
+
+ SwipeView {
+ id: swipeView
+ contentItem.objectName: "swipeViewListView"
+
+ Repeater {
+ objectName: "swipeViewContentItemRepeater"
+ model: [
+ {
+ title: d
+ }
+ ]
+
+ delegate: GridLayout {
+ objectName: "gridLayoutDelegate"
+
+ Repeater {
+ id: repeater
+ objectName: "delegateRepeater"
+ model: d
+ delegate: Item {
+ objectName: "delegate" + index
+
+ required property int index
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // QTBUG-129622
+ function test_zeroSizeSwipeViewWithRepeaters() {
+ let root = createTemporaryObject(zeroSizeSwipeViewWithRepeatersComponent, testCase)
+ verify(root)
+
+ let swipeView = root.swipeView
+ tryCompare(root, "d", 2)
+ // Shouldn't crash when the model is changed.
+ }
}
--
2.47.0

View File

@ -0,0 +1,420 @@
From 3330731d0cb221477ab3d856db032126403ae6a0 Mon Sep 17 00:00:00 2001
From: Mitch Curtis <mitch.curtis@qt.io>
Date: Tue, 24 Sep 2024 08:18:14 +0800
Subject: [PATCH 1/2] Revert "QQmlDelegateModel: fix delegates not being
created in certain cases"
This reverts commit 6561344dd2d1ba69abe6edec4fe340b256da9e13. It needs
to be fixed in a different way.
Fixes: QTBUG-127340
Pick-to: 6.7 6.5
Change-Id: I8503b22a5257e0fb5ee11a1bdf83d3dcab4a600a
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
(cherry picked from commit 281f620ceea03e7a222d796ae0cca917a9778368)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
---
src/qmlmodels/qqmldelegatemodel.cpp | 61 +++-----
src/qmlmodels/qqmldelegatemodel_p_p.h | 2 -
.../auto/qml/qqmldelegatemodel/CMakeLists.txt | 1 -
.../auto/qml/qqmldelegatemodel/data/reset.qml | 28 ----
.../data/resetInQAIMConstructor.qml | 28 ----
.../tst_qqmldelegatemodel.cpp | 135 ++----------------
6 files changed, 29 insertions(+), 226 deletions(-)
delete mode 100644 tests/auto/qml/qqmldelegatemodel/data/reset.qml
delete mode 100644 tests/auto/qml/qqmldelegatemodel/data/resetInQAIMConstructor.qml
diff --git a/src/qmlmodels/qqmldelegatemodel.cpp b/src/qmlmodels/qqmldelegatemodel.cpp
index 9af58d7a22..7cfa662aa6 100644
--- a/src/qmlmodels/qqmldelegatemodel.cpp
+++ b/src/qmlmodels/qqmldelegatemodel.cpp
@@ -172,7 +172,6 @@ QQmlDelegateModelPrivate::QQmlDelegateModelPrivate(QQmlContext *ctxt)
, m_transaction(false)
, m_incubatorCleanupScheduled(false)
, m_waitingToFetchMore(false)
- , m_maybeResetRoleNames(false)
, m_cacheItems(nullptr)
, m_items(nullptr)
, m_persistedItems(nullptr)
@@ -366,7 +365,6 @@ void QQmlDelegateModelPrivate::connectToAbstractItemModel()
QObject::connect(aim, &QAbstractItemModel::dataChanged, q, &QQmlDelegateModel::_q_dataChanged);
QObject::connect(aim, &QAbstractItemModel::rowsMoved, q, &QQmlDelegateModel::_q_rowsMoved);
QObject::connect(aim, &QAbstractItemModel::modelAboutToBeReset, q, &QQmlDelegateModel::_q_modelAboutToBeReset);
- QObject::connect(aim, &QAbstractItemModel::modelReset, q, &QQmlDelegateModel::handleModelReset);
QObject::connect(aim, &QAbstractItemModel::layoutChanged, q, &QQmlDelegateModel::_q_layoutChanged);
}
@@ -387,7 +385,6 @@ void QQmlDelegateModelPrivate::disconnectFromAbstractItemModel()
QObject::disconnect(aim, &QAbstractItemModel::dataChanged, q, &QQmlDelegateModel::_q_dataChanged);
QObject::disconnect(aim, &QAbstractItemModel::rowsMoved, q, &QQmlDelegateModel::_q_rowsMoved);
QObject::disconnect(aim, &QAbstractItemModel::modelAboutToBeReset, q, &QQmlDelegateModel::_q_modelAboutToBeReset);
- QObject::disconnect(aim, &QAbstractItemModel::modelReset, q, &QQmlDelegateModel::handleModelReset);
QObject::disconnect(aim, &QAbstractItemModel::layoutChanged, q, &QQmlDelegateModel::_q_layoutChanged);
}
@@ -1898,28 +1895,25 @@ void QQmlDelegateModel::_q_modelAboutToBeReset()
Q_D(QQmlDelegateModel);
if (!d->m_adaptorModel.adaptsAim())
return;
-
- /*
- roleNames are generally guaranteed to be stable (given that QAIM has no
- change signal for them), except that resetting the model is allowed to
- invalidate them (QTBUG-32132). DelegateModel must take this into account by
- snapshotting the current roleNames before the model is reset.
- Afterwards, if we detect that roleNames has changed, we throw the
- current model set up away and rebuild everything from scratch it is
- unlikely that a more efficient implementation would be worth it.
-
- If we detect no changes, we simply use the existing logic to handle the
- model reset.
-
- This (role name resetting) logic relies on the fact that
- modelAboutToBeReset must be followed by a modelReset signal before any
- further modelAboutToBeReset can occur. However, it's possible for user
- code to begin the reset before connectToAbstractItemModel is called
- (QTBUG-125053), in which case we don't attempt to reset the role names.
- */
- Q_ASSERT(!d->m_maybeResetRoleNames);
- d->m_maybeResetRoleNames = true;
- d->m_roleNamesBeforeReset = d->m_adaptorModel.aim()->roleNames();
+ auto aim = d->m_adaptorModel.aim();
+ auto oldRoleNames = aim->roleNames();
+ // this relies on the fact that modelAboutToBeReset must be followed
+ // by a modelReset signal before any further modelAboutToBeReset can occur
+ QObject::connect(aim, &QAbstractItemModel::modelReset, this, [this, d, oldRoleNames, aim](){
+ if (!d->m_adaptorModel.adaptsAim() || d->m_adaptorModel.aim() != aim)
+ return;
+ if (oldRoleNames == aim->roleNames()) {
+ // if the rolenames stayed the same (most common case), then we don't have
+ // to throw away all the setup that we did
+ handleModelReset();
+ } else {
+ // If they did change, we give up and just start from scratch via setMode
+ setModel(QVariant::fromValue(model()));
+ // but we still have to call handleModelReset, otherwise views will
+ // not refresh
+ handleModelReset();
+ }
+ }, Qt::SingleShotConnection);
}
void QQmlDelegateModel::handleModelReset()
@@ -1929,23 +1923,6 @@ void QQmlDelegateModel::handleModelReset()
return;
int oldCount = d->m_count;
-
- if (d->m_maybeResetRoleNames) {
- auto aim = d->m_adaptorModel.aim();
- if (!d->m_adaptorModel.adaptsAim() || d->m_adaptorModel.aim() != aim)
- return;
-
- // If the role names stayed the same (most common case), then we don't have
- // to throw away all the setup that we did.
- // If they did change, we give up and just start from scratch via setModel.
- // We do this before handling the reset to ensure that views refresh.
- if (aim->roleNames() != d->m_roleNamesBeforeReset)
- setModel(QVariant::fromValue(model()));
-
- d->m_maybeResetRoleNames = false;
- d->m_roleNamesBeforeReset.clear();
- }
-
d->m_adaptorModel.rootIndex = QModelIndex();
if (d->m_complete) {
diff --git a/src/qmlmodels/qqmldelegatemodel_p_p.h b/src/qmlmodels/qqmldelegatemodel_p_p.h
index bae8fc8a23..3c7ab9281d 100644
--- a/src/qmlmodels/qqmldelegatemodel_p_p.h
+++ b/src/qmlmodels/qqmldelegatemodel_p_p.h
@@ -334,7 +334,6 @@ public:
QQmlReusableDelegateModelItemsPool m_reusableItemsPool;
QList<QQDMIncubationTask *> m_finishedIncubating;
QList<QByteArray> m_watchedRoles;
- QHash<int, QByteArray> m_roleNamesBeforeReset;
QString m_filterGroup;
@@ -348,7 +347,6 @@ public:
bool m_transaction : 1;
bool m_incubatorCleanupScheduled : 1;
bool m_waitingToFetchMore : 1;
- bool m_maybeResetRoleNames : 1;
union {
struct {
diff --git a/tests/auto/qml/qqmldelegatemodel/CMakeLists.txt b/tests/auto/qml/qqmldelegatemodel/CMakeLists.txt
index 966f5229df..8d8a90e0a7 100644
--- a/tests/auto/qml/qqmldelegatemodel/CMakeLists.txt
+++ b/tests/auto/qml/qqmldelegatemodel/CMakeLists.txt
@@ -29,7 +29,6 @@ qt_internal_add_test(tst_qqmldelegatemodel
Qt::QmlModelsPrivate
Qt::QmlPrivate
Qt::Quick
- Qt::QuickPrivate
Qt::QuickTestUtilsPrivate
TESTDATA ${test_data}
)
diff --git a/tests/auto/qml/qqmldelegatemodel/data/reset.qml b/tests/auto/qml/qqmldelegatemodel/data/reset.qml
deleted file mode 100644
index 0fcd5e8afa..0000000000
--- a/tests/auto/qml/qqmldelegatemodel/data/reset.qml
+++ /dev/null
@@ -1,28 +0,0 @@
-import QtQuick
-import Test
-
-Window {
- id: root
- width: 200
- height: 200
-
- property alias listView: listView
-
- ResettableModel {
- id: resetModel
- }
-
- ListView {
- id: listView
- anchors.fill: parent
- model: resetModel
-
- delegate: Rectangle {
- implicitWidth: 100
- implicitHeight: 50
- color: "olivedrab"
-
- required property string display
- }
- }
-}
diff --git a/tests/auto/qml/qqmldelegatemodel/data/resetInQAIMConstructor.qml b/tests/auto/qml/qqmldelegatemodel/data/resetInQAIMConstructor.qml
deleted file mode 100644
index cb1f226737..0000000000
--- a/tests/auto/qml/qqmldelegatemodel/data/resetInQAIMConstructor.qml
+++ /dev/null
@@ -1,28 +0,0 @@
-import QtQuick
-import Test
-
-Window {
- id: root
- width: 200
- height: 200
-
- property alias listView: listView
-
- ResetInConstructorModel {
- id: resetInConstructorModel
- }
-
- ListView {
- id: listView
- anchors.fill: parent
- model: resetInConstructorModel
-
- delegate: Rectangle {
- implicitWidth: 100
- implicitHeight: 50
- color: "olivedrab"
-
- required property string display
- }
- }
-}
diff --git a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp
index d9f8b7aeba..2cacda5513 100644
--- a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp
+++ b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp
@@ -4,7 +4,6 @@
#include <QtTest/qtest.h>
#include <QtCore/qjsonobject.h>
#include <QtCore/QConcatenateTablesProxyModel>
-#include <QtCore/qtimer.h>
#include <QtGui/QStandardItemModel>
#include <QtQml/qqmlcomponent.h>
#include <QtQml/qqmlapplicationengine.h>
@@ -12,17 +11,11 @@
#include <QtQmlModels/private/qqmllistmodel_p.h>
#include <QtQuick/qquickview.h>
#include <QtQuick/qquickitem.h>
-#include <QtQuick/private/qquickitemview_p_p.h>
-#include <QtQuick/private/qquicklistview_p.h>
-#include <QtQuickTest/quicktest.h>
#include <QtQuickTestUtils/private/qmlutils_p.h>
-#include <QtQuickTestUtils/private/visualtestutils_p.h>
#include <QtTest/QSignalSpy>
#include <forward_list>
-using namespace QQuickVisualTestUtils;
-
class tst_QQmlDelegateModel : public QQmlDataTest
{
Q_OBJECT
@@ -32,8 +25,6 @@ public:
private slots:
void resettingRolesRespected();
- void resetInQAIMConstructor();
- void reset();
void valueWithoutCallingObjectFirst_data();
void valueWithoutCallingObjectFirst();
void qtbug_86017();
@@ -53,9 +44,16 @@ private slots:
void viewUpdatedOnDelegateChoiceAffectingRoleChange();
};
-class BaseAbstractItemModel : public QAbstractItemModel
+class AbstractItemModel : public QAbstractItemModel
{
+ Q_OBJECT
public:
+ AbstractItemModel()
+ {
+ for (int i = 0; i < 3; ++i)
+ mValues.append(QString::fromLatin1("Item %1").arg(i));
+ }
+
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override
{
if (parent.isValid())
@@ -93,21 +91,10 @@ public:
return mValues.at(index.row());
}
-protected:
+private:
QVector<QString> mValues;
};
-class AbstractItemModel : public BaseAbstractItemModel
-{
- Q_OBJECT
-public:
- AbstractItemModel()
- {
- for (int i = 0; i < 3; ++i)
- mValues.append(QString::fromLatin1("Item %1").arg(i));
- }
-};
-
tst_QQmlDelegateModel::tst_QQmlDelegateModel()
: QQmlDataTest(QT_QMLTEST_DATADIR)
{
@@ -166,109 +153,7 @@ void tst_QQmlDelegateModel::resettingRolesRespected()
QObject *root = engine.rootObjects().constFirst();
QVERIFY(!root->property("success").toBool());
model->change();
- QTRY_VERIFY_WITH_TIMEOUT(root->property("success").toBool(), 100);
-}
-
-class ResetInConstructorModel : public BaseAbstractItemModel
-{
- Q_OBJECT
- QML_ELEMENT
-
-public:
- ResetInConstructorModel()
- {
- beginResetModel();
- QTimer::singleShot(0, this, &ResetInConstructorModel::finishReset);
- }
-
-private:
- void finishReset()
- {
- mValues.append("First");
- endResetModel();
- }
-};
-
-void tst_QQmlDelegateModel::resetInQAIMConstructor()
-{
- qmlRegisterTypesAndRevisions<ResetInConstructorModel>("Test", 1);
-
- QQuickApplicationHelper helper(this, "resetInQAIMConstructor.qml");
- QVERIFY2(helper.ready, helper.failureMessage());
- QQuickWindow *window = helper.window;
- window->show();
- QVERIFY(QTest::qWaitForWindowExposed(window));
-
- auto *listView = window->property("listView").value<QQuickListView *>();
- QVERIFY(listView);
- QTRY_VERIFY_WITH_TIMEOUT(listView->itemAtIndex(0), 100);
- QQuickItem *firstDelegateItem = listView->itemAtIndex(0);
- QVERIFY(firstDelegateItem);
- QCOMPARE(firstDelegateItem->property("display").toString(), "First");
-}
-
-class ResettableModel : public BaseAbstractItemModel
-{
- Q_OBJECT
- QML_ELEMENT
-
-public:
- ResettableModel()
- {
- mValues.append("First");
- }
-
- void callBeginResetModel()
- {
- beginResetModel();
- mValues.clear();
- }
-
- void appendData()
- {
- mValues.append(QString::fromLatin1("Item %1").arg(mValues.size()));
- }
-
- void callEndResetModel()
- {
- endResetModel();
- }
-};
-
-// Tests that everything works as expected when calling beginResetModel/endResetModel
-// after the QAIM subclass constructor has run.
-void tst_QQmlDelegateModel::reset()
-{
- qmlRegisterTypesAndRevisions<ResettableModel>("Test", 1);
-
- QQuickApplicationHelper helper(this, "reset.qml");
- QVERIFY2(helper.ready, helper.failureMessage());
- QQuickWindow *window = helper.window;
- window->show();
- QVERIFY(QTest::qWaitForWindowExposed(window));
-
- auto *listView = window->property("listView").value<QQuickListView *>();
- QVERIFY(listView);
- QQuickItem *firstDelegateItem = listView->itemAtIndex(0);
- QVERIFY(firstDelegateItem);
- QCOMPARE(firstDelegateItem->property("display").toString(), "First");
-
- const auto delegateModel = QQuickItemViewPrivate::get(listView)->model;
- QSignalSpy rootIndexChangedSpy(delegateModel, SIGNAL(rootIndexChanged()));
- QVERIFY(rootIndexChangedSpy.isValid());
-
- auto *model = listView->model().value<ResettableModel *>();
- model->callBeginResetModel();
- model->appendData();
- model->callEndResetModel();
- // This is verifies that handleModelReset isn't called
- // more than once during this process, since it unconditionally emits rootIndexChanged.
- QCOMPARE(rootIndexChangedSpy.count(), 1);
-
- QTRY_VERIFY_WITH_TIMEOUT(listView->itemAtIndex(0), 100);
- firstDelegateItem = listView->itemAtIndex(0);
- QVERIFY(firstDelegateItem);
- QCOMPARE(firstDelegateItem->property("display").toString(), "Item 0");
+ QTRY_VERIFY(root->property("success").toBool());
}
void tst_QQmlDelegateModel::valueWithoutCallingObjectFirst_data()
--
2.46.1

View File

@ -0,0 +1,37 @@
From 8d58aab6a8bca6a7c4a1a01d087594714b766c56 Mon Sep 17 00:00:00 2001
From: Fabian Kosmale <fabian.kosmale@qt.io>
Date: Thu, 31 Oct 2024 17:14:12 +0100
Subject: [PATCH] WIP: speculative gc fix
Change-Id: I3c1151998771ff8eaeea4925da6bbe3861460c82
---
src/qml/qml/qqmlcontext.cpp | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/qml/qml/qqmlcontext.cpp b/src/qml/qml/qqmlcontext.cpp
index cf6736deb978..45eb72d23ef1 100644
--- a/src/qml/qml/qqmlcontext.cpp
+++ b/src/qml/qml/qqmlcontext.cpp
@@ -11,6 +11,9 @@
#include "qqmlinfo.h"
#include "qqmlabstracturlinterceptor.h"
+
+#include "private/qv4qobjectwrapper_p.h"
+
#include <qjsengine.h>
#include <QtCore/qvarlengtharray.h>
#include <private/qmetaobject_p.h>
@@ -260,6 +263,9 @@ void QQmlContext::setContextProperty(const QString &name, const QVariant &value)
*/
void QQmlContext::setContextProperty(const QString &name, QObject *value)
{
+ if (auto e = engine(); e && value) {
+ QV4::QObjectWrapper::ensureWrapper(e->handle(), value);
+ }
setContextProperty(name, QVariant::fromValue(value));
}
--
2.47.0

View File

@ -0,0 +1,25 @@
From c75d424ea77385688e97f150df0d3e68ba55f5f4 Mon Sep 17 00:00:00 2001
From: Fabian Vogt <fvogt@suse.de>
Date: Tue, 11 Jul 2023 10:51:35 +0200
Subject: [PATCH] qmlimportscanner: Include module versions again
Fixes: QTBUG-115170
---
tools/qmlimportscanner/main.cpp | 1 -
1 file changed, 1 deletion(-)
diff --git a/tools/qmlimportscanner/main.cpp b/tools/qmlimportscanner/main.cpp
index 7c8f1bc98e..c8635323ce 100644
--- a/tools/qmlimportscanner/main.cpp
+++ b/tools/qmlimportscanner/main.cpp
@@ -434,7 +434,6 @@ getImportDetails(const QVariant &inputImport,
import.insert(preferLiteral(), prefer);
}
}
- import.remove(versionLiteral());
const ImportDetailsAndDeps result = {import, dependencies};
cache.insert({inputImport, result});
--
2.41.0

View File

@ -0,0 +1,473 @@
From 2aefbca84d2f3dca2c2697f13710b6907c0c7e59 Mon Sep 17 00:00:00 2001
From: Mitch Curtis <mitch.curtis@qt.io>
Date: Tue, 24 Sep 2024 10:22:12 +0800
Subject: [PATCH 2/2] QQmlDelegateModel: fix delegates not being created in
certain cases v2
Since 837c2f18cd223707e7cedb213257b0158ea07146, we connect to
modelAboutToBeReset rather than modelReset so that we can handle role
name changes. _q_modelAboutToBeReset now connects modelReset to
handleModelReset with a single shot connection instead.
However, it's possible for user code to begin the reset before
connectToAbstractItemModel is called (QTBUG-125053), in which case we
connect to modelReset too late and handleModelReset is never called,
resulting in delegates not being created in certain cases.
So, we check at the earliest point we can if the model is in the
process of being reset, and if so, connect modelReset to
handleModelReset.
This is a less intrusive alternative to
6561344dd2d1ba69abe6edec4fe340b256da9e13, which caused regressions and
was reverted.
Fixes: QTBUG-125053
Task-number: QTBUG-127340
Pick-to: 6.7 6.5
Change-Id: I2bfe192ed61eddaa481de4b1e14b1fa5d07a51c1
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
(cherry picked from commit 4bb16ce2c8ea94f768991593a581c8838d48f3a3)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
---
src/qmlmodels/qqmldelegatemodel.cpp | 17 ++
.../auto/qml/qqmldelegatemodel/CMakeLists.txt | 1 +
...yModelWithDelayedSourceModelInListView.qml | 30 +++
.../auto/qml/qqmldelegatemodel/data/reset.qml | 28 +++
.../data/resetInQAIMConstructor.qml | 28 +++
.../tst_qqmldelegatemodel.cpp | 210 +++++++++++++++++-
6 files changed, 304 insertions(+), 10 deletions(-)
create mode 100644 tests/auto/qml/qqmldelegatemodel/data/proxyModelWithDelayedSourceModelInListView.qml
create mode 100644 tests/auto/qml/qqmldelegatemodel/data/reset.qml
create mode 100644 tests/auto/qml/qqmldelegatemodel/data/resetInQAIMConstructor.qml
diff --git a/src/qmlmodels/qqmldelegatemodel.cpp b/src/qmlmodels/qqmldelegatemodel.cpp
index 7cfa662aa6..f8de5cba82 100644
--- a/src/qmlmodels/qqmldelegatemodel.cpp
+++ b/src/qmlmodels/qqmldelegatemodel.cpp
@@ -3,6 +3,8 @@
#include "qqmldelegatemodel_p_p.h"
+#include <QtCore/private/qabstractitemmodel_p.h>
+
#include <QtQml/qqmlinfo.h>
#include <private/qqmlabstractdelegatecomponent_p.h>
@@ -409,6 +411,21 @@ void QQmlDelegateModel::setModel(const QVariant &model)
_q_itemsInserted(0, d->adaptorModelCount());
d->requestMoreIfNecessary();
}
+
+ // Since 837c2f18cd223707e7cedb213257b0158ea07146, we connect to modelAboutToBeReset
+ // rather than modelReset so that we can handle role name changes. _q_modelAboutToBeReset
+ // now connects modelReset to handleModelReset with a single shot connection instead.
+ // However, it's possible for user code to begin the reset before connectToAbstractItemModel is called
+ // (QTBUG-125053), in which case we connect to modelReset too late and handleModelReset is never called,
+ // resulting in delegates not being created in certain cases.
+ // So, we check at the earliest point we can if the model is in the process of being reset,
+ // and if so, connect modelReset to handleModelReset.
+ if (d->m_adaptorModel.adaptsAim()) {
+ auto *aim = d->m_adaptorModel.aim();
+ auto *aimPrivate = QAbstractItemModelPrivate::get(aim);
+ if (aimPrivate->resetting)
+ QObject::connect(aim, &QAbstractItemModel::modelReset, this, &QQmlDelegateModel::handleModelReset, Qt::SingleShotConnection);
+ }
}
/*!
diff --git a/tests/auto/qml/qqmldelegatemodel/CMakeLists.txt b/tests/auto/qml/qqmldelegatemodel/CMakeLists.txt
index 8d8a90e0a7..966f5229df 100644
--- a/tests/auto/qml/qqmldelegatemodel/CMakeLists.txt
+++ b/tests/auto/qml/qqmldelegatemodel/CMakeLists.txt
@@ -29,6 +29,7 @@ qt_internal_add_test(tst_qqmldelegatemodel
Qt::QmlModelsPrivate
Qt::QmlPrivate
Qt::Quick
+ Qt::QuickPrivate
Qt::QuickTestUtilsPrivate
TESTDATA ${test_data}
)
diff --git a/tests/auto/qml/qqmldelegatemodel/data/proxyModelWithDelayedSourceModelInListView.qml b/tests/auto/qml/qqmldelegatemodel/data/proxyModelWithDelayedSourceModelInListView.qml
new file mode 100644
index 0000000000..b6733bd38c
--- /dev/null
+++ b/tests/auto/qml/qqmldelegatemodel/data/proxyModelWithDelayedSourceModelInListView.qml
@@ -0,0 +1,30 @@
+import QtQuick
+import Test
+
+Window {
+ id: root
+ title: listView.count
+
+ property alias listView: listView
+ property ProxySourceModel connectionModel: null
+
+ Component {
+ id: modelComponent
+ ProxySourceModel {}
+ }
+
+ ListView {
+ id: listView
+ anchors.fill: parent
+
+ delegate: Text {
+ text: model.Name
+ }
+
+ model: ProxyModel {
+ sourceModel: root.connectionModel
+ }
+ }
+
+ Component.onCompleted: root.connectionModel = modelComponent.createObject(root)
+}
diff --git a/tests/auto/qml/qqmldelegatemodel/data/reset.qml b/tests/auto/qml/qqmldelegatemodel/data/reset.qml
new file mode 100644
index 0000000000..0fcd5e8afa
--- /dev/null
+++ b/tests/auto/qml/qqmldelegatemodel/data/reset.qml
@@ -0,0 +1,28 @@
+import QtQuick
+import Test
+
+Window {
+ id: root
+ width: 200
+ height: 200
+
+ property alias listView: listView
+
+ ResettableModel {
+ id: resetModel
+ }
+
+ ListView {
+ id: listView
+ anchors.fill: parent
+ model: resetModel
+
+ delegate: Rectangle {
+ implicitWidth: 100
+ implicitHeight: 50
+ color: "olivedrab"
+
+ required property string display
+ }
+ }
+}
diff --git a/tests/auto/qml/qqmldelegatemodel/data/resetInQAIMConstructor.qml b/tests/auto/qml/qqmldelegatemodel/data/resetInQAIMConstructor.qml
new file mode 100644
index 0000000000..cb1f226737
--- /dev/null
+++ b/tests/auto/qml/qqmldelegatemodel/data/resetInQAIMConstructor.qml
@@ -0,0 +1,28 @@
+import QtQuick
+import Test
+
+Window {
+ id: root
+ width: 200
+ height: 200
+
+ property alias listView: listView
+
+ ResetInConstructorModel {
+ id: resetInConstructorModel
+ }
+
+ ListView {
+ id: listView
+ anchors.fill: parent
+ model: resetInConstructorModel
+
+ delegate: Rectangle {
+ implicitWidth: 100
+ implicitHeight: 50
+ color: "olivedrab"
+
+ required property string display
+ }
+ }
+}
diff --git a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp
index 2cacda5513..3f08d8fc85 100644
--- a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp
+++ b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp
@@ -3,7 +3,9 @@
#include <QtTest/qtest.h>
#include <QtCore/qjsonobject.h>
+#include <QtCore/qsortfilterproxymodel.h>
#include <QtCore/QConcatenateTablesProxyModel>
+#include <QtCore/qtimer.h>
#include <QtGui/QStandardItemModel>
#include <QtQml/qqmlcomponent.h>
#include <QtQml/qqmlapplicationengine.h>
@@ -11,11 +13,17 @@
#include <QtQmlModels/private/qqmllistmodel_p.h>
#include <QtQuick/qquickview.h>
#include <QtQuick/qquickitem.h>
+#include <QtQuick/private/qquickitemview_p_p.h>
+#include <QtQuick/private/qquicklistview_p.h>
+#include <QtQuickTest/quicktest.h>
#include <QtQuickTestUtils/private/qmlutils_p.h>
+#include <QtQuickTestUtils/private/visualtestutils_p.h>
#include <QtTest/QSignalSpy>
#include <forward_list>
+using namespace QQuickVisualTestUtils;
+
class tst_QQmlDelegateModel : public QQmlDataTest
{
Q_OBJECT
@@ -25,6 +33,8 @@ public:
private slots:
void resettingRolesRespected();
+ void resetInQAIMConstructor();
+ void reset();
void valueWithoutCallingObjectFirst_data();
void valueWithoutCallingObjectFirst();
void qtbug_86017();
@@ -42,18 +52,12 @@ private slots:
void doNotUnrefObjectUnderConstruction();
void clearCacheDuringInsertion();
void viewUpdatedOnDelegateChoiceAffectingRoleChange();
+ void proxyModelWithDelayedSourceModelInListView();
};
-class AbstractItemModel : public QAbstractItemModel
+class BaseAbstractItemModel : public QAbstractItemModel
{
- Q_OBJECT
public:
- AbstractItemModel()
- {
- for (int i = 0; i < 3; ++i)
- mValues.append(QString::fromLatin1("Item %1").arg(i));
- }
-
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override
{
if (parent.isValid())
@@ -91,10 +95,21 @@ public:
return mValues.at(index.row());
}
-private:
+protected:
QVector<QString> mValues;
};
+class AbstractItemModel : public BaseAbstractItemModel
+{
+ Q_OBJECT
+public:
+ AbstractItemModel()
+ {
+ for (int i = 0; i < 3; ++i)
+ mValues.append(QString::fromLatin1("Item %1").arg(i));
+ }
+};
+
tst_QQmlDelegateModel::tst_QQmlDelegateModel()
: QQmlDataTest(QT_QMLTEST_DATADIR)
{
@@ -153,7 +168,109 @@ void tst_QQmlDelegateModel::resettingRolesRespected()
QObject *root = engine.rootObjects().constFirst();
QVERIFY(!root->property("success").toBool());
model->change();
- QTRY_VERIFY(root->property("success").toBool());
+ QTRY_VERIFY_WITH_TIMEOUT(root->property("success").toBool(), 100);
+}
+
+class ResetInConstructorModel : public BaseAbstractItemModel
+{
+ Q_OBJECT
+ QML_ELEMENT
+
+public:
+ ResetInConstructorModel()
+ {
+ beginResetModel();
+ QTimer::singleShot(0, this, &ResetInConstructorModel::finishReset);
+ }
+
+private:
+ void finishReset()
+ {
+ mValues.append("First");
+ endResetModel();
+ }
+};
+
+void tst_QQmlDelegateModel::resetInQAIMConstructor()
+{
+ qmlRegisterTypesAndRevisions<ResetInConstructorModel>("Test", 1);
+
+ QQuickApplicationHelper helper(this, "resetInQAIMConstructor.qml");
+ QVERIFY2(helper.ready, helper.failureMessage());
+ QQuickWindow *window = helper.window;
+ window->show();
+ QVERIFY(QTest::qWaitForWindowExposed(window));
+
+ auto *listView = window->property("listView").value<QQuickListView *>();
+ QVERIFY(listView);
+ QTRY_VERIFY_WITH_TIMEOUT(listView->itemAtIndex(0), 100);
+ QQuickItem *firstDelegateItem = listView->itemAtIndex(0);
+ QVERIFY(firstDelegateItem);
+ QCOMPARE(firstDelegateItem->property("display").toString(), "First");
+}
+
+class ResettableModel : public BaseAbstractItemModel
+{
+ Q_OBJECT
+ QML_ELEMENT
+
+public:
+ ResettableModel()
+ {
+ mValues.append("First");
+ }
+
+ void callBeginResetModel()
+ {
+ beginResetModel();
+ mValues.clear();
+ }
+
+ void appendData()
+ {
+ mValues.append(QString::fromLatin1("Item %1").arg(mValues.size()));
+ }
+
+ void callEndResetModel()
+ {
+ endResetModel();
+ }
+};
+
+// Tests that everything works as expected when calling beginResetModel/endResetModel
+// after the QAIM subclass constructor has run.
+void tst_QQmlDelegateModel::reset()
+{
+ qmlRegisterTypesAndRevisions<ResettableModel>("Test", 1);
+
+ QQuickApplicationHelper helper(this, "reset.qml");
+ QVERIFY2(helper.ready, helper.failureMessage());
+ QQuickWindow *window = helper.window;
+ window->show();
+ QVERIFY(QTest::qWaitForWindowExposed(window));
+
+ auto *listView = window->property("listView").value<QQuickListView *>();
+ QVERIFY(listView);
+ QQuickItem *firstDelegateItem = listView->itemAtIndex(0);
+ QVERIFY(firstDelegateItem);
+ QCOMPARE(firstDelegateItem->property("display").toString(), "First");
+
+ const auto delegateModel = QQuickItemViewPrivate::get(listView)->model;
+ QSignalSpy rootIndexChangedSpy(delegateModel, SIGNAL(rootIndexChanged()));
+ QVERIFY(rootIndexChangedSpy.isValid());
+
+ auto *model = listView->model().value<ResettableModel *>();
+ model->callBeginResetModel();
+ model->appendData();
+ model->callEndResetModel();
+ // This is verifies that handleModelReset isn't called
+ // more than once during this process, since it unconditionally emits rootIndexChanged.
+ QCOMPARE(rootIndexChangedSpy.count(), 1);
+
+ QTRY_VERIFY_WITH_TIMEOUT(listView->itemAtIndex(0), 100);
+ firstDelegateItem = listView->itemAtIndex(0);
+ QVERIFY(firstDelegateItem);
+ QCOMPARE(firstDelegateItem->property("display").toString(), "Item 0");
}
void tst_QQmlDelegateModel::valueWithoutCallingObjectFirst_data()
@@ -616,6 +733,79 @@ void tst_QQmlDelegateModel::viewUpdatedOnDelegateChoiceAffectingRoleChange()
QVERIFY(returnedValue);
}
+class ProxySourceModel : public QAbstractListModel
+{
+ Q_OBJECT
+ QML_ELEMENT
+public:
+ explicit ProxySourceModel(QObject *parent = nullptr)
+ : QAbstractListModel(parent)
+ {
+ for (int i = 0; i < rows; ++i) {
+ beginInsertRows(QModelIndex(), i, i);
+ endInsertRows();
+ }
+ }
+
+ ~ProxySourceModel() override = default;
+
+ int rowCount(const QModelIndex &) const override
+ {
+ return rows;
+ }
+
+ QVariant data(const QModelIndex &, int ) const override
+ {
+ return "Hello";
+ }
+
+ QHash<int, QByteArray> roleNames() const override
+ {
+ QHash<int, QByteArray> roles = QAbstractListModel::roleNames();
+ roles[Qt::UserRole + 1] = "Name";
+
+ return roles;
+ }
+
+ static const int rows = 1;
+};
+
+class ProxyModel : public QSortFilterProxyModel
+{
+ Q_OBJECT
+ QML_ELEMENT
+ Q_PROPERTY(QAbstractItemModel *sourceModel READ sourceModel WRITE setSourceModel)
+
+public:
+ explicit ProxyModel(QObject *parent = nullptr)
+ : QSortFilterProxyModel(parent)
+ {
+ }
+
+ ~ProxyModel() override = default;
+};
+
+// Checks that the correct amount of delegates are created when using a proxy
+// model whose source model is set after a delay.
+void tst_QQmlDelegateModel::proxyModelWithDelayedSourceModelInListView()
+{
+ QTest::failOnWarning();
+
+ qmlRegisterTypesAndRevisions<ProxySourceModel>("Test", 1);
+ qmlRegisterTypesAndRevisions<ProxyModel>("Test", 1);
+
+ QQuickApplicationHelper helper(this, "proxyModelWithDelayedSourceModelInListView.qml");
+ QVERIFY2(helper.ready, helper.failureMessage());
+ QQuickWindow *window = helper.window;
+ window->show();
+ QVERIFY(QTest::qWaitForWindowExposed(window));
+
+ auto *listView = window->property("listView").value<QQuickListView *>();
+ QVERIFY(listView);
+ const auto delegateModel = QQuickItemViewPrivate::get(listView)->model;
+ QTRY_COMPARE(listView->count(), 1);
+}
+
QTEST_MAIN(tst_QQmlDelegateModel)
#include "tst_qqmldelegatemodel.moc"
--
2.46.1

55
_constraints Normal file
View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<constraints>
<hardware>
<disk>
<size unit="G">25</size>
</disk>
<processors>4</processors>
</hardware>
<overwrite>
<conditions>
<arch>s390x</arch>
</conditions>
<hardware>
<memory>
<size unit="G">9</size>
</memory>
</hardware>
</overwrite>
<overwrite>
<conditions>
<arch>ppc64</arch>
<arch>ppc64le</arch>
</conditions>
<hardware>
<memory>
<size unit="G">9</size>
</memory>
</hardware>
</overwrite>
<overwrite>
<conditions>
<arch>aarch64</arch>
<arch>riscv64</arch>
</conditions>
<hardware>
<memory>
<size unit="G">7</size>
</memory>
</hardware>
</overwrite>
<!-- relax constraints for qt6-declarative:docs -->
<overwrite>
<conditions>
<package>qt6-declarative:docs</package>
</conditions>
<hardware>
<disk>
<size unit="G">3</size>
</disk>
<memory>
<size unit="G">2</size>
</memory>
</hardware>
</overwrite>
</constraints>

4
_multibuild Normal file
View File

@ -0,0 +1,4 @@
<multibuild>
<flavor>docs</flavor>
</multibuild>

View File

@ -0,0 +1,6 @@
# using fdupes on include directories is just calling for troubles
addFilter("files-duplicated-waste .*")
addFilter("files-duplicate .*")
# library and development package names don't match
addFilter("no-dependency-on .*")

450
qt6-declarative.changes Normal file
View File

@ -0,0 +1,450 @@
-------------------------------------------------------------------
Fri Jan 31 10:22:53 UTC 2025 - Christophe Marin <christophe@krop.fr>
- Update to 6.8.2
https://www.qt.io/blog/qt-6.8.2-released
- Drop patch, merged upstream:
* 0001-CMake-Fix-find_package-call-in-Qt6QmlFindQmlscIntern.patch
-------------------------------------------------------------------
Sat Jan 18 15:34:27 UTC 2025 - Christophe Marin <christophe@krop.fr>
- Add patch to fix qmlsc detection:
* 0001-CMake-Fix-find_package-call-in-Qt6QmlFindQmlscIntern.patch
-------------------------------------------------------------------
Mon Dec 2 13:02:02 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Update to 6.8.1:
* https://www.qt.io/blog/qt-6.8.1-released
- Drop patches, merged upstream:
* 0001-Revert-QQmlDelegateModel-fix-delegates-not-being-cre.patch
* 0002-QQmlDelegateModel-fix-delegates-not-being-created-in.patch
* 0001-Compiler-Wrap-raw-string-literals-in-QStringLiteral-.patch
* 0001-QQuickItemView-fix-crash-with-zero-size-SwipeView-th.patch
* 0001-QQuickAccessibleAttached-Let-implicit-names-work-whe.patch
* 0001-QQuickItem-map-To-From-Item-Account-for-not-having-a.patch
* 0001-Log-state-transitions-for-the-GC.patch
* 0001-Engine-Mark-created-wrapped-objects-after-GCState-Ma.patch
-------------------------------------------------------------------
Tue Nov 12 15:40:15 UTC 2024 - Fabian Vogt <fvogt@suse.com>
- Replace 0001-WIP-speculative-gc-fix.patch with newer ones,
should unbreak spectacle and some others (kde#496139):
* 0001-Log-state-transitions-for-the-GC.patch
* 0001-Engine-Mark-created-wrapped-objects-after-GCState-Ma.patch
-------------------------------------------------------------------
Wed Nov 6 19:20:07 UTC 2024 - Fabian Vogt <fvogt@suse.com>
- Add patch (pending upstream) to fix properties getting GC'd:
(QTBUG-128789, kde#494804)
* 0001-WIP-speculative-gc-fix.patch
-------------------------------------------------------------------
Mon Nov 4 17:50:07 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Add upstream change (QTBUG-129500, kde#495089):
* 0001-QQuickItem-map-To-From-Item-Account-for-not-having-a.patch
-------------------------------------------------------------------
Fri Oct 25 11:42:28 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Add upstream changes:
* 0001-QQuickItemView-fix-crash-with-zero-size-SwipeView-th.patch
(QTBUG-129622, kde#493854)
* 0001-QQuickAccessibleAttached-Let-implicit-names-work-whe.patch
(QTBUG-130360)
-------------------------------------------------------------------
Tue Oct 15 09:37:16 UTC 2024 - Antonio Larrosa <alarrosa@suse.com>
- Update memory constraints for s390x and use %limit_build
-------------------------------------------------------------------
Tue Oct 15 07:52:36 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Update disk constraints
-------------------------------------------------------------------
Wed Oct 9 16:52:34 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Add upstream change to fix compilation failures (kde#494281, QTBUG-129797)
* 0001-Compiler-Wrap-raw-string-literals-in-QStringLiteral-.patch
-------------------------------------------------------------------
Tue Oct 8 10:17:37 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Update to 6.8.0:
* https://www.qt.io/blog/qt-6.8-released
- Add upstream changes:
* 0001-Revert-QQmlDelegateModel-fix-delegates-not-being-cre.patch
* 0002-QQmlDelegateModel-fix-delegates-not-being-created-in.patch
(kde#493116, QTBUG-127340)
- Merge some -devel and -private-devel packages that only have
private API.
-------------------------------------------------------------------
Sat Sep 28 08:22:56 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Update to 6.7.3
* https://www.qt.io/blog/qt-6.7.3-released
-------------------------------------------------------------------
Wed Jun 19 07:25:41 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Update to 6.7.2:
* https://www.qt.io/blog/qt-6.7.2-released
-------------------------------------------------------------------
Tue May 21 08:31:28 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Update to 6.7.1:
* https://www.qt.io/blog/qt-6.7.1-released
- Drop patch, merged upstream:
* 0001-Fix-PointHandler-rejecting-click-events-near-window-.patch
-------------------------------------------------------------------
Tue Apr 2 13:39:38 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Update to 6.7.0:
* https://www.qt.io/blog/qt-6.7-released
- Update build constraints
-------------------------------------------------------------------
Tue Mar 26 14:25:37 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Update to 6.6.3:
* https://www.qt.io/blog/qt-6.6.3-released
- Drop patches, merged upstream:
* 0001-QuickControls-Link-the-impl-libraries-into-the-base-.patch
* 0001-Dialogs-Depend-on-controls-styles-in-QuickDialogs2Qu.patch
-------------------------------------------------------------------
Sat Mar 16 10:20:52 UTC 2024 - Fusion Future <qydwhotmail@gmail.com>
- Add patch to help fix PointHandler with HiDPI (kde#482580)
- 0001-Fix-PointHandler-rejecting-click-events-near-window-.patch
-------------------------------------------------------------------
Wed Feb 14 16:53:12 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Update to 6.6.2
* https://www.qt.io/blog/qt-6.6.2-released
- Add upstream changes to make build reproducible:
* 0001-QuickControls-Link-the-impl-libraries-into-the-base-.patch
* 0001-Dialogs-Depend-on-controls-styles-in-QuickDialogs2Qu.patch
-------------------------------------------------------------------
Mon Nov 27 14:00:08 UTC 2023 - Christophe Marin <christophe@krop.fr>
- Update to 6.6.1:
* https://www.qt.io/blog/qt-6.6.1-released
-------------------------------------------------------------------
Tue Oct 10 09:39:50 UTC 2023 - Christophe Marin <christophe@krop.fr>
- Update to 6.6.0
* https://www.qt.io/blog/qt-6.6-released
-------------------------------------------------------------------
Thu Sep 28 07:34:09 UTC 2023 - Christophe Marin <christophe@krop.fr>
- Update to 6.5.3
* https://www.qt.io/blog/qt-6.5.3-released
-------------------------------------------------------------------
Thu Aug 3 11:10:58 UTC 2023 - Andreas Schwab <schwab@suse.de>
- Reduce memory constraints for riscv64
- Sort license tags
-------------------------------------------------------------------
Thu Jul 20 08:48:08 UTC 2023 - Christophe Marin <christophe@krop.fr>
- Update to 6.5.2
* https://www.qt.io/blog/qt-6.5.2-released-1
-------------------------------------------------------------------
Tue Jul 11 09:30:38 UTC 2023 - Fabian Vogt <fabian@ritter-vogt.de>
- Add patch to make qmlimportscanner usable with qml-autoreqprov
again (QTBUG-115170):
* 0001-qmlimportscanner-Include-module-versions-again.patch
-------------------------------------------------------------------
Fri Jun 30 15:13:09 UTC 2023 - Christophe Marin <christophe@krop.fr>
- Update subpackages requirements
-------------------------------------------------------------------
Wed May 24 07:45:35 UTC 2023 - Christophe Marin <christophe@krop.fr>
- Update to 6.5.1
* https://www.qt.io/blog/qt-6.5.1-released
- Drop patch, merged upstream:
* 0001-QML-metatypes-Adjust-to-QMetaType-revision-increment.patch
-------------------------------------------------------------------
Fri Apr 28 13:59:13 UTC 2023 - Christophe Marin <christophe@krop.fr>
- Add upstream change to fix boo#1210849:
* 0001-QML-metatypes-Adjust-to-QMetaType-revision-increment.patch
-------------------------------------------------------------------
Mon Apr 3 10:02:04 UTC 2023 - Christophe Marin <christophe@krop.fr>
- Update to 6.5.0
* https://www.qt.io/blog/qt-6.5-lts-released
-------------------------------------------------------------------
Thu Mar 16 09:59:59 UTC 2023 - Christophe Marin <christophe@krop.fr>
- Update to 6.4.3:
* https://www.qt.io/blog/qt-6.4.3-released
-------------------------------------------------------------------
Fri Jan 6 16:46:39 UTC 2023 - Christophe Marin <christophe@krop.fr>
- Update to 6.4.2:
* https://www.qt.io/blog/qt-6.4.2-released
-------------------------------------------------------------------
Tue Nov 15 11:53:10 UTC 2022 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.4.1:
* https://www.qt.io/blog/qt-6.4.1-released
-------------------------------------------------------------------
Thu Sep 29 10:35:51 UTC 2022 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.4.0:
* https://www.qt.io/blog/qt-6.4-released
-------------------------------------------------------------------
Fri Sep 16 08:29:05 UTC 2022 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.4.0 RC
-------------------------------------------------------------------
Fri Sep 9 12:41:36 UTC 2022 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.3.2:
* https://www.qt.io/blog/qt-6.3.2-released
-------------------------------------------------------------------
Fri Jun 17 15:15:08 UTC 2022 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.3.1:
* https://www.qt.io/blog/qt-6.3.1-released
- Drop patch, now upstream:
* 0001-CMake-Look-for-QtLanguageServerPrivate.patch
-------------------------------------------------------------------
Fri Apr 8 11:56:53 UTC 2022 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.3.0:
* https://www.qt.io/blog/qt-6.3-released
-------------------------------------------------------------------
Tue Mar 29 12:28:32 UTC 2022 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.3.0-rc
- Add upstream fix:
* 0001-CMake-Look-for-QtLanguageServerPrivate.patch
- Update build constraints
-------------------------------------------------------------------
Mon Mar 21 08:46:36 UTC 2022 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.2.4
* https://www.qt.io/blog/qt-6.2.4-released
-------------------------------------------------------------------
Mon Jan 31 08:54:29 UTC 2022 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.2.3:
* https://www.qt.io/blog/qt-6.2.3-released
-------------------------------------------------------------------
Fri Dec 10 19:54:28 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Reenable build on big endian platforms.
-------------------------------------------------------------------
Wed Dec 8 10:45:00 UTC 2021 - Andreas Schwab <schwab@suse.de>
- Update contraints for riscv64
-------------------------------------------------------------------
Wed Dec 1 10:06:02 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.2.2
* https://www.qt.io/blog/qt-6.2.2-released
- Make sure all dependencies are present when installing devel
packages. Qt >= 6.2.2 is much less permissive.
-------------------------------------------------------------------
Tue Oct 26 11:22:35 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.2.1
* https://www.qt.io/blog/qt-6.2.1-released
-------------------------------------------------------------------
Thu Sep 30 12:27:17 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.2.0:
* https://www.qt.io/blog/qt-6.2-lts-released
-------------------------------------------------------------------
Sat Sep 25 07:18:35 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.2.0-rc2
-------------------------------------------------------------------
Thu Sep 16 14:07:39 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.2.0-rc
-------------------------------------------------------------------
Thu Sep 9 14:05:03 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.2.0-beta4
-------------------------------------------------------------------
Mon Sep 6 13:30:31 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Disable lto for ppc64 builds.
-------------------------------------------------------------------
Wed Sep 1 13:03:31 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.1.3:
* https://www.qt.io/blog/qt-6.1.3-released
-------------------------------------------------------------------
Fri Jul 2 14:07:43 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.1.2. New bugfix release:
* https://www.qt.io/blog/qt-6.1.2-released
-------------------------------------------------------------------
Tue Jun 8 05:54:10 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.1.1:
* https://www.qt.io/blog/qt-6.1.1-released
-------------------------------------------------------------------
Thu May 6 17:10:18 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.1.0:
* https://www.qt.io/blog/qt-6.1-released
-------------------------------------------------------------------
Fri Apr 23 14:11:36 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.1.0-rc.
-------------------------------------------------------------------
Tue Apr 13 06:29:25 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.1.0-beta3.
-------------------------------------------------------------------
Wed Mar 31 13:36:06 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.0.3
* https://www.qt.io/blog/qt-6.0.3-released
-------------------------------------------------------------------
Fri Mar 19 15:34:07 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.1.0-beta2
-------------------------------------------------------------------
Thu Mar 18 10:54:47 UTC 2021 - Guillaume GARDET <guillaume.gardet@opensuse.org>
- Update _constraints to parallelize and speed-up build
-------------------------------------------------------------------
Fri Mar 5 17:24:01 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.1.0-beta1
https://www.qt.io/blog/qt-6.1-beta-released
-------------------------------------------------------------------
Fri Mar 5 09:31:20 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.0.2:
https://www.qt.io/blog/qt-6.0.2-released
-------------------------------------------------------------------
Wed Feb 3 17:17:39 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.0.1
https://www.qt.io/blog/qt-6.0.1-released
-------------------------------------------------------------------
Wed Dec 30 15:50:18 UTC 2020 - Christophe Giboudeaux <christophe@krop.fr>
- Move the QML files into a separate package.
-------------------------------------------------------------------
Mon Dec 28 18:07:31 UTC 2020 - Fabian Vogt <fabian@ritter-vogt.de>
- Enable qml-autoreqprov
-------------------------------------------------------------------
Wed Dec 16 11:26:05 UTC 2020 - Christophe Giboudeaux <christophe@krop.fr>
- Use a different 'Name' when building the docs flavor.
-------------------------------------------------------------------
Tue Dec 8 14:09:05 UTC 2020 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.0.0:
* https://www.qt.io/blog/qt-6.0-released
-------------------------------------------------------------------
Wed Dec 2 12:08:59 UTC 2020 - Christophe Giboudeaux <christophe@krop.fr>
- Qt 6.0.0 RC2
-------------------------------------------------------------------
Wed Nov 25 14:20:30 UTC 2020 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.0.0~rc1
-------------------------------------------------------------------
Tue Nov 17 07:26:24 UTC 2020 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.0.0~beta5
-------------------------------------------------------------------
Tue Nov 10 19:08:03 UTC 2020 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.0.0~beta4
-------------------------------------------------------------------
Tue Oct 20 07:47:08 UTC 2020 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.0.0beta1
https://www.qt.io/blog/qt-6.0-beta-released
-------------------------------------------------------------------
Tue Oct 6 19:54:35 UTC 2020 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.0.0-alpha
https://www.qt.io/blog/qt-6.0-alpha-released
-------------------------------------------------------------------
Sat Sep 19 14:45:34 UTC 2020 - Christophe Giboudeaux <christophe@krop.fr>
- Split the libraries into smaller packages
-------------------------------------------------------------------
Sat May 2 16:50:59 UTC 2020 - Christophe Giboudeaux <christophe@krop.fr>
- Add qt6-declarative

1795
qt6-declarative.spec Normal file

File diff suppressed because it is too large Load Diff

BIN
qtdeclarative-everywhere-src-6.7.2.tar.xz (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:937b70e441abf5bc4e50d44d26610e2714a28514acf3885cd36116cd610b9875
size 35663596

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3b41a36b42e919a3aa0da1f71107591504200f41707bee2ad8e8d4f99b5644c2
size 37029068

BIN
qtdeclarative-everywhere-src-6.8.1.tar.xz (Stored with Git LFS) Normal file

Binary file not shown.

BIN
qtdeclarative-everywhere-src-6.8.2.tar.xz (Stored with Git LFS) Normal file

Binary file not shown.