<feed xmlns='http://www.w3.org/2005/Atom'>
<title>qt/qtdeclarative.git/src/quick/items, branch 6.11</title>
<subtitle>Qt Declarative (Quick 2)
</subtitle>
<link rel='alternate' type='text/html' href='https://code.qt.io/cgit/qt/qtdeclarative.git/'/>
<entry>
<title>QQmlTableInstanceModel: refactor QModelIndex calculation out of QQuickTableView</title>
<updated>2026-05-11T11:52:15+00:00</updated>
<author>
<name>Richard Moe Gustavsen</name>
<email>richard.gustavsen@qt.io</email>
</author>
<published>2026-04-27T08:23:44+00:00</published>
<link rel='alternate' type='text/html' href='https://code.qt.io/cgit/qt/qtdeclarative.git/commit/?id=8a2c82be6ad90e3f2a0760d8bab1e3a8cdb2473a'/>
<id>8a2c82be6ad90e3f2a0760d8bab1e3a8cdb2473a</id>
<content type='text'>
The QQmlTableInstanceModel can derive the QModelIndex itself from the
flat index, so there is no need for a separate object(QModelIndex)
overload.

Amends de4b7283c978ca384f6c8bf9f27387158804b601

Change-Id: I9dfff8026ef0acca660f1211b0e453c46562985f
Reviewed-by: SanthoshKumar Selvaraj &lt;santhosh.kumar.selvaraj@qt.io&gt;
(cherry picked from commit e635da3faf6dac654b2591204162a217a6f02766)
Reviewed-by: Qt Cherry-pick Bot &lt;cherrypick_bot@qt-project.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The QQmlTableInstanceModel can derive the QModelIndex itself from the
flat index, so there is no need for a separate object(QModelIndex)
overload.

Amends de4b7283c978ca384f6c8bf9f27387158804b601

Change-Id: I9dfff8026ef0acca660f1211b0e453c46562985f
Reviewed-by: SanthoshKumar Selvaraj &lt;santhosh.kumar.selvaraj@qt.io&gt;
(cherry picked from commit e635da3faf6dac654b2591204162a217a6f02766)
Reviewed-by: Qt Cherry-pick Bot &lt;cherrypick_bot@qt-project.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>QQuickDrag: fix binding loop and re-entrancy for Automatic drag type</title>
<updated>2026-05-06T22:45:18+00:00</updated>
<author>
<name>Shawn Rutledge</name>
<email>shawn.rutledge@qt.io</email>
</author>
<published>2026-04-21T08:22:40+00:00</published>
<link rel='alternate' type='text/html' href='https://code.qt.io/cgit/qt/qtdeclarative.git/commit/?id=99c7c83a1d5969303a540a1ccf10da4a9cdbd0cb'/>
<id>99c7c83a1d5969303a540a1ccf10da4a9cdbd0cb</id>
<content type='text'>
When Drag.dragType is Automatic and Drag.active is bound to e.g.
DragHandler.active, calling setActive(true) previously invoked
startDrag() immediately, which in turn called QDrag::exec(). That
exec() call enters a nested event loop, which is incompatible with
being called from within a QML binding or JS expression: the QML engine
is still mid-evaluation when exec() blocks, so when the pointer release
arrives in the nested loop, deactivates the DragHandler, and causes the
binding to re-trigger, the engine detects a binding loop.

Fix this by deferring the startDrag() call via Qt::QueuedConnection so
that the current JS frame unwinds completely before exec() runs from a
clean event-loop context. An 'if (d-&gt;active)' guard in the deferred
lambda handles the case where the drag is cancelled before the queued
call fires.

The executingNativeDrag flag is now set/cleared around exec() inside
startDrag() itself (covering both the Automatic binding path and direct
QML calls to Drag.startDrag()). It suppresses re-entrant setActive(false)
calls that arrive via DragHandler deactivation while exec() is blocking,
since startDrag() already handles all cleanup when exec() returns.

Fixes: QTBUG-144006
Change-Id: I9bf6a4e6f3edea7e12e187b5756ab483c462696a
Reviewed-by: Fabian Kosmale &lt;fabian.kosmale@qt.io&gt;
Reviewed-by: Konsta Alajärvi &lt;konsta.alajarvi@qt.io&gt;
Reviewed-by: Oliver Eftevaag &lt;oliver.eftevaag@qt.io&gt;
(cherry picked from commit ae6e67e4cf23af6dbceab5e62881864b3a38c867)
Reviewed-by: Qt Cherry-pick Bot &lt;cherrypick_bot@qt-project.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
When Drag.dragType is Automatic and Drag.active is bound to e.g.
DragHandler.active, calling setActive(true) previously invoked
startDrag() immediately, which in turn called QDrag::exec(). That
exec() call enters a nested event loop, which is incompatible with
being called from within a QML binding or JS expression: the QML engine
is still mid-evaluation when exec() blocks, so when the pointer release
arrives in the nested loop, deactivates the DragHandler, and causes the
binding to re-trigger, the engine detects a binding loop.

Fix this by deferring the startDrag() call via Qt::QueuedConnection so
that the current JS frame unwinds completely before exec() runs from a
clean event-loop context. An 'if (d-&gt;active)' guard in the deferred
lambda handles the case where the drag is cancelled before the queued
call fires.

The executingNativeDrag flag is now set/cleared around exec() inside
startDrag() itself (covering both the Automatic binding path and direct
QML calls to Drag.startDrag()). It suppresses re-entrant setActive(false)
calls that arrive via DragHandler deactivation while exec() is blocking,
since startDrag() already handles all cleanup when exec() returns.

Fixes: QTBUG-144006
Change-Id: I9bf6a4e6f3edea7e12e187b5756ab483c462696a
Reviewed-by: Fabian Kosmale &lt;fabian.kosmale@qt.io&gt;
Reviewed-by: Konsta Alajärvi &lt;konsta.alajarvi@qt.io&gt;
Reviewed-by: Oliver Eftevaag &lt;oliver.eftevaag@qt.io&gt;
(cherry picked from commit ae6e67e4cf23af6dbceab5e62881864b3a38c867)
Reviewed-by: Qt Cherry-pick Bot &lt;cherrypick_bot@qt-project.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Silence some static code checker complaints in qsg*</title>
<updated>2026-05-06T16:39:53+00:00</updated>
<author>
<name>Laszlo Agocs</name>
<email>laszlo.agocs@qt.io</email>
</author>
<published>2026-05-05T10:29:45+00:00</published>
<link rel='alternate' type='text/html' href='https://code.qt.io/cgit/qt/qtdeclarative.git/commit/?id=1204843b85dbcacffcc8c5c2da1685ce5787325b'/>
<id>1204843b85dbcacffcc8c5c2da1685ce5787325b</id>
<content type='text'>
Pick-to: 6.8
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV1543
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV1544
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV1549
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV1741
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV1803
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV3062
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV3128
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV3129
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV3130
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV3134
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV3135
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV3136
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV3137
Change-Id: I4427a85cfa6050d43ccd74bd354af3301c802151
Reviewed-by: Christian Strømme &lt;christian.stromme@qt.io&gt;
(cherry picked from commit c570680474bcd5f098e1fda4c05bb46885e5bc3a)
Reviewed-by: Qt Cherry-pick Bot &lt;cherrypick_bot@qt-project.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Pick-to: 6.8
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV1543
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV1544
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV1549
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV1741
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV1803
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV3062
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV3128
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV3129
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV3130
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV3134
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV3135
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV3136
Axivion-Id: qt_Essentials_qtquick_dev_linux:SV3137
Change-Id: I4427a85cfa6050d43ccd74bd354af3301c802151
Reviewed-by: Christian Strømme &lt;christian.stromme@qt.io&gt;
(cherry picked from commit c570680474bcd5f098e1fda4c05bb46885e5bc3a)
Reviewed-by: Qt Cherry-pick Bot &lt;cherrypick_bot@qt-project.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>QQuickTableView: respect QAIM::buddy() when editing cells</title>
<updated>2026-05-06T11:38:24+00:00</updated>
<author>
<name>Richard Moe Gustavsen</name>
<email>richard.gustavsen@qt.io</email>
</author>
<published>2026-04-20T11:38:10+00:00</published>
<link rel='alternate' type='text/html' href='https://code.qt.io/cgit/qt/qtdeclarative.git/commit/?id=a68c648abd8170d4f6ce78de76fb06065a5deb1d'/>
<id>a68c648abd8170d4f6ce78de76fb06065a5deb1d</id>
<content type='text'>
When edit() is called, consult QAbstractItemModel::buddy() first to
resolve the target index. This allows the model to redirect editing
to a sibling cell, matching the behavior of other Qt item views like
QTreeView and QTableView.

The included test verifies that we now respect the buddy.
The checkEditAfterReorder() test also had to be modifed slightly.
It assigned a QVariant(QSharedPointer(QAIM)) as model to TableView,
and not the expected QVariant(QAIM). This strangly works in most
cases, but will now cause a warning in canEdit() since the variant
cannot be casted directly to a QAIM.

Change-Id: I01092228019c91212c601f104f5f2fa3274e74e0
Reviewed-by: Fabian Kosmale &lt;fabian.kosmale@qt.io&gt;
(cherry picked from commit b2af284eac4aa0e936c42c4c62a9fe14c9ab6916)
Reviewed-by: Qt Cherry-pick Bot &lt;cherrypick_bot@qt-project.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
When edit() is called, consult QAbstractItemModel::buddy() first to
resolve the target index. This allows the model to redirect editing
to a sibling cell, matching the behavior of other Qt item views like
QTreeView and QTableView.

The included test verifies that we now respect the buddy.
The checkEditAfterReorder() test also had to be modifed slightly.
It assigned a QVariant(QSharedPointer(QAIM)) as model to TableView,
and not the expected QVariant(QAIM). This strangly works in most
cases, but will now cause a warning in canEdit() since the variant
cannot be casted directly to a QAIM.

Change-Id: I01092228019c91212c601f104f5f2fa3274e74e0
Reviewed-by: Fabian Kosmale &lt;fabian.kosmale@qt.io&gt;
(cherry picked from commit b2af284eac4aa0e936c42c4c62a9fe14c9ab6916)
Reviewed-by: Qt Cherry-pick Bot &lt;cherrypick_bot@qt-project.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>ListView: preserve visible item on SnapOneItem resize</title>
<updated>2026-05-01T10:04:24+00:00</updated>
<author>
<name>Evgen Pervenenka</name>
<email>yauheni.pervenenka@viber.com</email>
</author>
<published>2026-04-15T15:53:31+00:00</published>
<link rel='alternate' type='text/html' href='https://code.qt.io/cgit/qt/qtdeclarative.git/commit/?id=63fc40aa21a53970bd219b0ed288938a25623c28'/>
<id>63fc40aa21a53970bd219b0ed288938a25623c28</id>
<content type='text'>
When delegates are sized relative to the view (e.g. height:
ListView.view.height), resizing changes all delegate positions.
The content position becomes stale, and fixup() calls snapItemAt()
with that stale position, snapping to the wrong item.

Record the currently snapped item in geometryChange() before layout
runs. In fixup(), use the saved index to override the snapItemAt()
result, so the correct item is picked with all existing header,
highlight, bounds and animation logic preserved. The hint is reset
in fixupPosition() after the fixup pass completes.
StrictlyEnforceRange is excluded because its fixup() path already
forces currentItem as the snap target.

Fixes: QTBUG-112349
Fixes: QTBUG-44449
Change-Id: Ie766a4d8641bd2410116c468afc27c8bc25b9f16
Reviewed-by: Vladimir Belyavsky &lt;belyavskyv@gmail.com&gt;
(cherry picked from commit 8a99e83213c674ac2946ded86b1aec70c5af63f8)
Reviewed-by: Qt Cherry-pick Bot &lt;cherrypick_bot@qt-project.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
When delegates are sized relative to the view (e.g. height:
ListView.view.height), resizing changes all delegate positions.
The content position becomes stale, and fixup() calls snapItemAt()
with that stale position, snapping to the wrong item.

Record the currently snapped item in geometryChange() before layout
runs. In fixup(), use the saved index to override the snapItemAt()
result, so the correct item is picked with all existing header,
highlight, bounds and animation logic preserved. The hint is reset
in fixupPosition() after the fixup pass completes.
StrictlyEnforceRange is excluded because its fixup() path already
forces currentItem as the snap target.

Fixes: QTBUG-112349
Fixes: QTBUG-44449
Change-Id: Ie766a4d8641bd2410116c468afc27c8bc25b9f16
Reviewed-by: Vladimir Belyavsky &lt;belyavskyv@gmail.com&gt;
(cherry picked from commit 8a99e83213c674ac2946ded86b1aec70c5af63f8)
Reviewed-by: Qt Cherry-pick Bot &lt;cherrypick_bot@qt-project.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix positionViewAtBeginning() when item 0 is outside the cache buffer</title>
<updated>2026-04-28T22:48:41+00:00</updated>
<author>
<name>Morten Sørvig</name>
<email>morten.sorvig@qt.io</email>
</author>
<published>2026-04-14T15:40:32+00:00</published>
<link rel='alternate' type='text/html' href='https://code.qt.io/cgit/qt/qtdeclarative.git/commit/?id=dba6819663cf9f3fea30482c6bf555049c359e35'/>
<id>dba6819663cf9f3fea30482c6bf555049c359e35</id>
<content type='text'>
positionAt(0) can make inaccurate estimates in cases where
the target element is outside the cache buffer, and the
list contains section headers.

However, since the beginning is a well-known position we
can just scroll directly to that position instead.

If we do, markExtentsDirty after clearing the visibleItems, to prevent
an issue that could occur when setPosition(0) gets called with a stale
extent. the extent must be recalculated, in order to be precise, and
take into account if the first item has a section or not.

Fixes: QTBUG-132694
Change-Id: I51e0634e685d56d1ab341c31f79a8e89cfa6f5c0
Reviewed-by: Oliver Eftevaag &lt;oliver.eftevaag@qt.io&gt;
Reviewed-by: Morten Johan Sørvig &lt;morten.sorvig@qt.io&gt;
(cherry picked from commit 9111e967bf54e8fc6644727d334ebfdaf3b59a28)
Reviewed-by: Qt Cherry-pick Bot &lt;cherrypick_bot@qt-project.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
positionAt(0) can make inaccurate estimates in cases where
the target element is outside the cache buffer, and the
list contains section headers.

However, since the beginning is a well-known position we
can just scroll directly to that position instead.

If we do, markExtentsDirty after clearing the visibleItems, to prevent
an issue that could occur when setPosition(0) gets called with a stale
extent. the extent must be recalculated, in order to be precise, and
take into account if the first item has a section or not.

Fixes: QTBUG-132694
Change-Id: I51e0634e685d56d1ab341c31f79a8e89cfa6f5c0
Reviewed-by: Oliver Eftevaag &lt;oliver.eftevaag@qt.io&gt;
Reviewed-by: Morten Johan Sørvig &lt;morten.sorvig@qt.io&gt;
(cherry picked from commit 9111e967bf54e8fc6644727d334ebfdaf3b59a28)
Reviewed-by: Qt Cherry-pick Bot &lt;cherrypick_bot@qt-project.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>TableView: avoid unnecessary pooling on row/column insertion and removal</title>
<updated>2026-04-25T13:25:30+00:00</updated>
<author>
<name>Richard Moe Gustavsen</name>
<email>richard.gustavsen@qt.io</email>
</author>
<published>2026-04-14T13:27:36+00:00</published>
<link rel='alternate' type='text/html' href='https://code.qt.io/cgit/qt/qtdeclarative.git/commit/?id=c304697a43c8ca9d78fcf9fa8c0e5ff81ecfa015'/>
<id>c304697a43c8ca9d78fcf9fa8c0e5ff81ecfa015</id>
<content type='text'>
When a ViewportOnly rebuild is triggered in TableView by a row
or column insertion or removal, delegate items that survive the
operation (i.e. are not part of the removed range) should not
be pooled and reused. Instead they should simply stay in place
and have their context properties updated to reflect any shift
in flat index, row or column. This avoids a full pool cycle,
preserves any ongoing visual state such as animations, and
suppresses unnecessary pooled/reused signals.

To achieve this, released items are now staged in a temporary
m_releasedItems cache rather than moved directly to the reuse
pool. During the rebuild, resolveModelItem() first searches the
cache for an item whose QPersistentModelIndex matches the
requested cell. If found, the item is reclaimed directly.
Once the rebuild is complete, commitReleasedItems() transfers
any remaining cached items (those whose cells genuinely
disappeared) to the reuse pool, like before.

In order to achieve this, a new QPersistentModelIndex is stored
on each delegate item. That way we know which cell it originally
belonged to, even after changes to the model shifted its
row and column position.

A new auto-test, verifyThatOnlyRemovedRowsArePooled, is included
that verifies the new expected behaviour.

The changes in this patch also uncovered that the test model used
throughout in the test file was implemented with too many assumptions,
and therefore needed some TLC.

Fixes: QTBUG-116650
Fixes: QTBUG-134741
Change-Id: I0b935320b6e7dca215df438f5981a154a8c10385
Reviewed-by: SanthoshKumar Selvaraj &lt;santhosh.kumar.selvaraj@qt.io&gt;
(cherry picked from commit de4b7283c978ca384f6c8bf9f27387158804b601)
Reviewed-by: Qt Cherry-pick Bot &lt;cherrypick_bot@qt-project.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
When a ViewportOnly rebuild is triggered in TableView by a row
or column insertion or removal, delegate items that survive the
operation (i.e. are not part of the removed range) should not
be pooled and reused. Instead they should simply stay in place
and have their context properties updated to reflect any shift
in flat index, row or column. This avoids a full pool cycle,
preserves any ongoing visual state such as animations, and
suppresses unnecessary pooled/reused signals.

To achieve this, released items are now staged in a temporary
m_releasedItems cache rather than moved directly to the reuse
pool. During the rebuild, resolveModelItem() first searches the
cache for an item whose QPersistentModelIndex matches the
requested cell. If found, the item is reclaimed directly.
Once the rebuild is complete, commitReleasedItems() transfers
any remaining cached items (those whose cells genuinely
disappeared) to the reuse pool, like before.

In order to achieve this, a new QPersistentModelIndex is stored
on each delegate item. That way we know which cell it originally
belonged to, even after changes to the model shifted its
row and column position.

A new auto-test, verifyThatOnlyRemovedRowsArePooled, is included
that verifies the new expected behaviour.

The changes in this patch also uncovered that the test model used
throughout in the test file was implemented with too many assumptions,
and therefore needed some TLC.

Fixes: QTBUG-116650
Fixes: QTBUG-134741
Change-Id: I0b935320b6e7dca215df438f5981a154a8c10385
Reviewed-by: SanthoshKumar Selvaraj &lt;santhosh.kumar.selvaraj@qt.io&gt;
(cherry picked from commit de4b7283c978ca384f6c8bf9f27387158804b601)
Reviewed-by: Qt Cherry-pick Bot &lt;cherrypick_bot@qt-project.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>QQuickWidget: Fix tab fence focus cycling</title>
<updated>2026-04-24T02:02:37+00:00</updated>
<author>
<name>Oliver Eftevaag</name>
<email>oliver.eftevaag@qt.io</email>
</author>
<published>2026-04-14T09:41:11+00:00</published>
<link rel='alternate' type='text/html' href='https://code.qt.io/cgit/qt/qtdeclarative.git/commit/?id=f12e362068fe1b77237e8b6f79dda76142c16306'/>
<id>f12e362068fe1b77237e8b6f79dda76142c16306</id>
<content type='text'>
When a QQuickPopup is open inside a QQuickWidget,
pressing Tab on the last focusable item in the popup would move
keyboard focus to a widget outside the QQuickWidget instead of cycling
back to the first item in the popup.

QQuickItem::nextPrevItemInTabFocusChain() has a parameter `warp` which
is used by QQuickWidgets and embedded windows. To prevent wrapping
between the first and last focusable items in the QML scene.

This was working as intentional, with the exception that it would ignore
cases when the current focused item is inside a tab fence. In such
cases, we still want the item to wrap, we just want it to wrap inside
the tab fence, which nextPrevItemInTabFocusChain() already takes into
consideration, as long as we don't return early when wrap=false.

Fix it by only returning early from wrap=false, when not inside a tab
fence.

Fixes: QTBUG-138101
Pick-to: 6.10 6.8
Change-Id: Iab0914161f0a80c3b0df0385cfb1fd0c0027ac7a
Reviewed-by: Doris Verria &lt;doris.verria@qt.io&gt;
(cherry picked from commit 77c3189bc00ebd302b5a211d039db49228dca105)
Reviewed-by: Qt Cherry-pick Bot &lt;cherrypick_bot@qt-project.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
When a QQuickPopup is open inside a QQuickWidget,
pressing Tab on the last focusable item in the popup would move
keyboard focus to a widget outside the QQuickWidget instead of cycling
back to the first item in the popup.

QQuickItem::nextPrevItemInTabFocusChain() has a parameter `warp` which
is used by QQuickWidgets and embedded windows. To prevent wrapping
between the first and last focusable items in the QML scene.

This was working as intentional, with the exception that it would ignore
cases when the current focused item is inside a tab fence. In such
cases, we still want the item to wrap, we just want it to wrap inside
the tab fence, which nextPrevItemInTabFocusChain() already takes into
consideration, as long as we don't return early when wrap=false.

Fix it by only returning early from wrap=false, when not inside a tab
fence.

Fixes: QTBUG-138101
Pick-to: 6.10 6.8
Change-Id: Iab0914161f0a80c3b0df0385cfb1fd0c0027ac7a
Reviewed-by: Doris Verria &lt;doris.verria@qt.io&gt;
(cherry picked from commit 77c3189bc00ebd302b5a211d039db49228dca105)
Reviewed-by: Qt Cherry-pick Bot &lt;cherrypick_bot@qt-project.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>QQuickText: fix inflated implicitWidth with maximumLineCount</title>
<updated>2026-04-23T04:57:09+00:00</updated>
<author>
<name>Vladimir Belyavsky</name>
<email>belyavskyv@gmail.com</email>
</author>
<published>2026-03-27T22:34:08+00:00</published>
<link rel='alternate' type='text/html' href='https://code.qt.io/cgit/qt/qtdeclarative.git/commit/?id=d7109e4336dbbf5c11bc7ee441ef4b6930c24180'/>
<id>d7109e4336dbbf5c11bc7ee441ef4b6930c24180</id>
<content type='text'>
When a Text element uses StyledText with &lt;br&gt; tags, maximumLineCount,
wrapMode: Wrap, and elide: ElideRight, constraining its width could
cause implicitWidth to grow far beyond the correct value.

The root cause is twofold:

1. The loop that creates unwrapped lines for implicit width calculation
used '&lt;=' instead of '&lt;', causing one extra line to be created and
finalized beyond maximumLineCount paragraphs.

2. The multiline-elide code path creates a trailing line via
createLine() to compute the elided text. That line is left unfinalized,
so endLayout() finalizes it at QFIXED_MAX width, inflating
maximumWidth(). Finalize it at zero width right after use.

Fixes: QTBUG-142933
Change-Id: I64bab9512b8400ed63a4dda709259488a2b49a21
Reviewed-by: Shawn Rutledge &lt;shawn.rutledge@qt.io&gt;
(cherry picked from commit 021778a0ad7d5758cee5f5592017e46b4e12171d)
Reviewed-by: Qt Cherry-pick Bot &lt;cherrypick_bot@qt-project.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
When a Text element uses StyledText with &lt;br&gt; tags, maximumLineCount,
wrapMode: Wrap, and elide: ElideRight, constraining its width could
cause implicitWidth to grow far beyond the correct value.

The root cause is twofold:

1. The loop that creates unwrapped lines for implicit width calculation
used '&lt;=' instead of '&lt;', causing one extra line to be created and
finalized beyond maximumLineCount paragraphs.

2. The multiline-elide code path creates a trailing line via
createLine() to compute the elided text. That line is left unfinalized,
so endLayout() finalizes it at QFIXED_MAX width, inflating
maximumWidth(). Finalize it at zero width right after use.

Fixes: QTBUG-142933
Change-Id: I64bab9512b8400ed63a4dda709259488a2b49a21
Reviewed-by: Shawn Rutledge &lt;shawn.rutledge@qt.io&gt;
(cherry picked from commit 021778a0ad7d5758cee5f5592017e46b4e12171d)
Reviewed-by: Qt Cherry-pick Bot &lt;cherrypick_bot@qt-project.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>QQuickItemGrabResult: fix potential data races</title>
<updated>2026-04-22T14:18:22+00:00</updated>
<author>
<name>Ivan Solovev</name>
<email>ivan.solovev@qt.io</email>
</author>
<published>2026-04-10T13:42:11+00:00</published>
<link rel='alternate' type='text/html' href='https://code.qt.io/cgit/qt/qtdeclarative.git/commit/?id=560bb053192ede801d9d7ef11048576c60e6a5a0'/>
<id>560bb053192ede801d9d7ef11048576c60e6a5a0</id>
<content type='text'>
The class' setup() and render() methods are always executed on the
renderer thread, while all other methods are executed on the main
thread (or any other user thread).
That way, we have a potential race condition when accessing the members
of QQuickItemGrabResultPrivate.

Fix it by adding a mutex.

Note that we cannot hold a mutex when executing a callback or emitting
a signal, because this can lead to a deadlock is the slot or a callback
use the getters. Extend the existing test cases to cover these
scenarios.

Pick-to: 6.8
Change-Id: I03cc556975f783c630f29ec648306f3cd604ed16
Reviewed-by: Laszlo Agocs &lt;laszlo.agocs@qt.io&gt;
(cherry picked from commit 055e06e435ee227e79239548d2873b1bcc32ecc2)
Reviewed-by: Ulf Hermann &lt;ulf.hermann@qt.io&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The class' setup() and render() methods are always executed on the
renderer thread, while all other methods are executed on the main
thread (or any other user thread).
That way, we have a potential race condition when accessing the members
of QQuickItemGrabResultPrivate.

Fix it by adding a mutex.

Note that we cannot hold a mutex when executing a callback or emitting
a signal, because this can lead to a deadlock is the slot or a callback
use the getters. Extend the existing test cases to cover these
scenarios.

Pick-to: 6.8
Change-Id: I03cc556975f783c630f29ec648306f3cd604ed16
Reviewed-by: Laszlo Agocs &lt;laszlo.agocs@qt.io&gt;
(cherry picked from commit 055e06e435ee227e79239548d2873b1bcc32ecc2)
Reviewed-by: Ulf Hermann &lt;ulf.hermann@qt.io&gt;
</pre>
</div>
</content>
</entry>
</feed>
