qquicktext{edit,input}: Re-render when device pixel ratio changes

Native rendering needs to be perfectly aligned to the pixel grid.
When device pixel ratio changes, this can lead to blurry rendering.

This was addressed for qquicktext in d870ea28 but not
textedit/textinput.

Pick-to: 6.7 6.6 6.5
Change-Id: I75d3172a047e73ba3e8e6cbcf4f5a9651d42c6b0
Reviewed-by: David Edmundson <davidedmundson@kde.org>
This commit is contained in:
Kai Uwe Broulik 2023-11-20 18:40:28 +01:00
parent c45eb82365
commit ef5df245db
4 changed files with 43 additions and 0 deletions

View File

@ -1565,6 +1565,27 @@ void QQuickTextEdit::geometryChange(const QRectF &newGeometry, const QRectF &old
QQuickImplicitSizeItem::geometryChange(newGeometry, oldGeometry);
}
void QQuickTextEdit::itemChange(ItemChange change, const ItemChangeData &value)
{
Q_D(QQuickTextEdit);
Q_UNUSED(value);
switch (change) {
case ItemDevicePixelRatioHasChanged:
if (d->renderType == NativeRendering) {
// Native rendering optimizes for a given pixel grid, so its results must not be scaled.
// Text layout code respects the current device pixel ratio automatically, we only need
// to rerun layout after the ratio changed.
updateSize();
updateWholeDocument();
}
break;
default:
break;
}
QQuickImplicitSizeItem::itemChange(change, value);
}
/*!
Ensures any delayed caching or data loading the class
needs to performed is complete.

View File

@ -379,6 +379,7 @@ protected:
#endif
void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override;
void itemChange(ItemChange change, const ItemChangeData &value) override;
bool event(QEvent *) override;
void keyPressEvent(QKeyEvent *) override;

View File

@ -1775,6 +1775,26 @@ void QQuickTextInput::geometryChange(const QRectF &newGeometry,
QQuickImplicitSizeItem::geometryChange(newGeometry, oldGeometry);
}
void QQuickTextInput::itemChange(ItemChange change, const ItemChangeData &value)
{
Q_D(QQuickTextInput);
Q_UNUSED(value);
switch (change) {
case ItemDevicePixelRatioHasChanged:
if (d->renderType == NativeRendering) {
// Native rendering optimizes for a given pixel grid, so its results must not be scaled.
// Text layout code respects the current device pixel ratio automatically, we only need
// to rerun layout after the ratio changed.
d->updateLayout();
}
break;
default:
break;
}
QQuickImplicitSizeItem::itemChange(change, value);
}
void QQuickTextInputPrivate::ensureVisible(int position, int preeditCursor, int preeditLength)
{
Q_Q(QQuickTextInput);

View File

@ -350,6 +350,7 @@ protected:
#endif
void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override;
void itemChange(ItemChange change, const ItemChangeData &value) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;