aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWang Chuan <ouchuanm@outlook.com>2019-07-17 17:41:16 +0800
committerouchuan <ouchuanm@outlook.com>2019-07-24 17:56:23 +0800
commitda06da57002b64cf4bcde0ca708b3275a5f919ae (patch)
tree1e12727b8fc61dc53e3cffc897a2e197c5e6f2bb
parent1d06eb3f8215b67c5061ee3a076df405724ff7ee (diff)
QQuickTextArea: prevent changing size of background recursively
When the x/y position of background depends on the height/width of background and these values are not constant, the if statement in the method resizeBackground() will always pass. And since a change listener is set before calling setHeight()/setWidth() in background, these two method will always call resizeBackground() and then call themself recursively, that means the height/width of background will always be reset, no matter what value you set. [ChangeLog][QtQuick][QQuickTextArea] defer adding change listener and prevent changing size of background recursively in construction Fixes: QTBUG-76369 Change-Id: I2ec37cad7f35cb1c756276326fe69e860c6b8de5 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
-rw-r--r--src/quicktemplates2/qquicktextarea.cpp10
-rw-r--r--tests/auto/qquickmaterialstyle/data/tst_material.qml35
2 files changed, 42 insertions, 3 deletions
diff --git a/src/quicktemplates2/qquicktextarea.cpp b/src/quicktemplates2/qquicktextarea.cpp
index 95dd9f93..95bf5bb1 100644
--- a/src/quicktemplates2/qquicktextarea.cpp
+++ b/src/quicktemplates2/qquicktextarea.cpp
@@ -512,8 +512,11 @@ void QQuickTextAreaPrivate::executeBackground(bool complete)
if (!background || complete)
quickBeginDeferred(q, backgroundName(), background);
- if (complete)
+ if (complete) {
quickCompleteDeferred(q, backgroundName(), background);
+ if (background)
+ QQuickControlPrivate::addImplicitSizeListener(background, this, QQuickControlPrivate::ImplicitSizeChanges | QQuickItemPrivate::Geometry);
+ }
}
void QQuickTextAreaPrivate::itemImplicitWidthChanged(QQuickItem *item)
@@ -633,9 +636,10 @@ void QQuickTextArea::setBackground(QQuickItem *background)
d->extra.value().hasBackgroundWidth = p->widthValid;
d->extra.value().hasBackgroundHeight = p->heightValid;
}
- if (isComponentComplete())
+ if (isComponentComplete()) {
d->resizeBackground();
- QQuickControlPrivate::addImplicitSizeListener(background, d, QQuickControlPrivate::ImplicitSizeChanges | QQuickItemPrivate::Geometry);
+ QQuickControlPrivate::addImplicitSizeListener(background, d, QQuickControlPrivate::ImplicitSizeChanges | QQuickItemPrivate::Geometry);
+ }
}
if (!qFuzzyCompare(oldImplicitBackgroundWidth, implicitBackgroundWidth()))
diff --git a/tests/auto/qquickmaterialstyle/data/tst_material.qml b/tests/auto/qquickmaterialstyle/data/tst_material.qml
index 9f2456b8..45bc0dab 100644
--- a/tests/auto/qquickmaterialstyle/data/tst_material.qml
+++ b/tests/auto/qquickmaterialstyle/data/tst_material.qml
@@ -715,4 +715,39 @@ TestCase {
control.destroy()
}
+
+ Component {
+ id: testResizeBackground
+ Item {
+ width: 200
+ height: 200
+ property alias textArea: textArea
+ ScrollView {
+ anchors.fill: parent
+ ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
+ TextArea {
+ id: textArea
+ wrapMode : TextEdit.WordWrap
+ readOnly: false
+ selectByMouse: true
+ focus: true
+ text: "test message"
+ }
+ }
+ }
+ }
+
+ function test_resize_background() {
+ var control = testCase.createTemporaryObject(testResizeBackground, testCase)
+ compare(control.textArea.background.height, 1)
+ compare(control.textArea.background.width, control.width)
+ control.width = 400
+ control.height = 400
+ compare(control.textArea.background.height, 1)
+ compare(control.textArea.background.width, control.width)
+ control.width = 200
+ control.height = 200
+ compare(control.textArea.background.height, 1)
+ compare(control.textArea.background.width, control.width)
+ }
}