diff options
author | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2021-07-20 16:54:00 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-07-23 08:43:02 +0000 |
commit | 4a878256bd283921c02f135174db0fa6f1fe39eb (patch) | |
tree | 54a080c2edb5324c5ad544ba70b96c77264e5594 /src/quick/items/qquickimagebase.cpp | |
parent | eb176de8108509a40b6450775ab5a0f2f684bffc (diff) |
Update QQuickImage's DPR if re-loading the image didn't
An SVG doesn't have a DPR, but we need to reload and repaint it anyway
when the DPR of the screen changes. So store the DPR of the item explicitly
if reloading it didn't change the value (for instance, because sourceSize
was not set). Otherwise, DPR changes are only handled when moving from a
1.0 (the default) DPR display to a different display, but not when moving
back.
Fixes: QTBUG-94622
Change-Id: I9f0a847699ab027ef876e341b8c6a954a6167ab3
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
(cherry picked from commit 08838f434b55024d9d5a9252fc2a3fb782b087da)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src/quick/items/qquickimagebase.cpp')
-rw-r--r-- | src/quick/items/qquickimagebase.cpp | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/quick/items/qquickimagebase.cpp b/src/quick/items/qquickimagebase.cpp index 750b71b25e..64c9d6abcf 100644 --- a/src/quick/items/qquickimagebase.cpp +++ b/src/quick/items/qquickimagebase.cpp @@ -56,8 +56,8 @@ QT_BEGIN_NAMESPACE bool QQuickImageBasePrivate::updateDevicePixelRatio(qreal targetDevicePixelRatio) { // QQuickImageProvider and SVG and PDF can generate a high resolution image when - // sourceSize is set (this function is only called if it's set). - // If sourceSize is not set then the provider default size will be used, as usual. + // sourceSize is set. If sourceSize is not set then the provider default size will + // be used, as usual. bool setDevicePixelRatio = false; if (url.scheme() == QLatin1String("image")) { setDevicePixelRatio = true; @@ -419,10 +419,14 @@ void QQuickImageBase::itemChange(ItemChange change, const ItemChangeData &value) Q_D(QQuickImageBase); // If the screen DPI changed, reload image. if (change == ItemDevicePixelRatioHasChanged && value.realValue != d->devicePixelRatio) { + const auto oldDpr = d->devicePixelRatio; // ### how can we get here with !qmlEngine(this)? that implies // itemChange() on an item pending deletion, which seems strange. if (qmlEngine(this) && isComponentComplete() && d->url.isValid()) { load(); + // not changed when loading (sourceSize might not be set) + if (d->devicePixelRatio == oldDpr) + d->updateDevicePixelRatio(value.realValue); } } QQuickItem::itemChange(change, value); |