diff options
author | Wang Chuan <ouchuanm@outlook.com> | 2019-07-17 17:41:16 +0800 |
---|---|---|
committer | ouchuan <ouchuanm@outlook.com> | 2019-07-24 17:56:23 +0800 |
commit | da06da57002b64cf4bcde0ca708b3275a5f919ae (patch) | |
tree | 1e12727b8fc61dc53e3cffc897a2e197c5e6f2bb | |
parent | 1d06eb3f8215b67c5061ee3a076df405724ff7ee (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.cpp | 10 | ||||
-rw-r--r-- | tests/auto/qquickmaterialstyle/data/tst_material.qml | 35 |
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) + } } |