diff options
-rw-r--r-- | src/quick/items/context2d/qquickcanvasitem.cpp | 4 | ||||
-rw-r--r-- | tests/auto/quick/qquickcanvasitem/data/tst_canvas.qml | 38 |
2 files changed, 40 insertions, 2 deletions
diff --git a/src/quick/items/context2d/qquickcanvasitem.cpp b/src/quick/items/context2d/qquickcanvasitem.cpp index 4b28517701..b39c4e49f8 100644 --- a/src/quick/items/context2d/qquickcanvasitem.cpp +++ b/src/quick/items/context2d/qquickcanvasitem.cpp @@ -592,7 +592,9 @@ void QQuickCanvasItem::geometryChanged(const QRectF &newGeometry, const QRectF & QQuickItem::geometryChanged(newGeometry, oldGeometry); - QSizeF newSize = newGeometry.size(); + // Due to indirect recursion, newGeometry may be outdated + // after this call, so we use width and height instead. + QSizeF newSize = QSizeF(width(), height()); if (!d->hasCanvasSize && d->canvasSize != newSize) { d->canvasSize = newSize; emit canvasSizeChanged(); diff --git a/tests/auto/quick/qquickcanvasitem/data/tst_canvas.qml b/tests/auto/quick/qquickcanvasitem/data/tst_canvas.qml index 79c89bb2fc..5960e53557 100644 --- a/tests/auto/quick/qquickcanvasitem/data/tst_canvas.qml +++ b/tests/auto/quick/qquickcanvasitem/data/tst_canvas.qml @@ -1,5 +1,10 @@ import QtQuick 2.0 +Item { + id: container + width: 200 + height: 200 + CanvasTestCase { id:testCase name: "canvas" @@ -641,5 +646,36 @@ CanvasTestCase { fail(exception.message); } } -} + property Component implicitlySizedComponent: Item { + implicitWidth: 32 + implicitHeight: implicitWidth + anchors.centerIn: parent + + property alias canvas: canvas + + Canvas { + id: canvas + width: Math.max(1, Math.min(parent.width, parent.height)) + height: width + + onPaint: { + var ctx = getContext("2d"); + ctx.reset(); + ctx.beginPath(); + ctx.fillRect(0, 0, width, height); + } + } + } + + function test_implicitlySizedParent() { + var implicitlySizedItem = implicitlySizedComponent.createObject(container); + verify(implicitlySizedItem); + + var xCenter = implicitlySizedItem.width / 2; + var yCenter = implicitlySizedItem.height / 2; + waitForRendering(implicitlySizedItem); + comparePixel(implicitlySizedItem.canvas.context, xCenter, yCenter, 0, 0, 0, 255); + } +} +} |