diff options
author | Jan Arve Sæther <jan-arve.saether@qt.io> | 2018-02-15 15:41:37 +0100 |
---|---|---|
committer | Jan Arve Sæther <jan-arve.saether@qt.io> | 2018-02-19 16:27:59 +0000 |
commit | b8dbe476f01a38afc921f9693d89f3c72396651a (patch) | |
tree | cb6adbd83195adbff53cb5f2e38d9a6903626c0d | |
parent | 047f161b1a706e81034ccd8d4700a3126c16dfe4 (diff) |
Only warn about actual *anchors* in layout children
Do not warn if they don't actually pose a problem, such as having just
anchors.margins: 42
in a layout child item (as demonstrated by the test)
Change-Id: I01e4515e91d7d0df3ae6bf9061cebe5c51802998
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
-rw-r--r-- | src/imports/layouts/qquicklayout.cpp | 3 | ||||
-rw-r--r-- | src/quick/items/qquickanchors.cpp | 13 | ||||
-rw-r--r-- | src/quick/items/qquickanchors_p.h | 1 | ||||
-rw-r--r-- | tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml | 61 |
4 files changed, 77 insertions, 1 deletions
diff --git a/src/imports/layouts/qquicklayout.cpp b/src/imports/layouts/qquicklayout.cpp index 7d51ec3ca9..c1e34813c6 100644 --- a/src/imports/layouts/qquicklayout.cpp +++ b/src/imports/layouts/qquicklayout.cpp @@ -771,7 +771,8 @@ bool QQuickLayout::shouldIgnoreItem(QQuickItem *child, QQuickLayoutAttached *&in void QQuickLayout::checkAnchors(QQuickItem *item) const { - if (QQuickItemPrivate::get(item)->_anchors) + QQuickAnchors *anchors = QQuickItemPrivate::get(item)->_anchors; + if (anchors && anchors->activeDirections()) qmlWarning(item) << "Detected anchors on an item that is part of a layout. This is undefined behavior."; } diff --git a/src/quick/items/qquickanchors.cpp b/src/quick/items/qquickanchors.cpp index 45b405bd82..4367e230bc 100644 --- a/src/quick/items/qquickanchors.cpp +++ b/src/quick/items/qquickanchors.cpp @@ -1324,6 +1324,19 @@ QQuickAnchors::Anchors QQuickAnchors::usedAnchors() const return static_cast<QQuickAnchors::Anchors>(d->usedAnchors); } +Qt::Orientations QQuickAnchors::activeDirections() const +{ + Q_D(const QQuickAnchors); + if (d->fill || d->centerIn) + return Qt::Horizontal | Qt::Vertical; + Qt::Orientations o; + if (d->usedAnchors & QQuickAnchors::Horizontal_Mask) + o |= Qt::Horizontal; + if (d->usedAnchors & QQuickAnchors::Vertical_Mask) + o |= Qt::Vertical; + return o; +} + bool QQuickAnchorsPrivate::checkHValid() const { if (usedAnchors & QQuickAnchors::LeftAnchor && diff --git a/src/quick/items/qquickanchors_p.h b/src/quick/items/qquickanchors_p.h index f00b8b5ba7..bc1e6c10f5 100644 --- a/src/quick/items/qquickanchors_p.h +++ b/src/quick/items/qquickanchors_p.h @@ -174,6 +174,7 @@ public: void resetCenterIn(); Anchors usedAnchors() const; + Qt::Orientations activeDirections() const; bool mirrored(); diff --git a/tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml b/tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml index 4ff1017116..4e9e41d42e 100644 --- a/tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml +++ b/tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml @@ -1004,5 +1004,66 @@ Item { // Shouldn't crash upon destroying containerUser. } + + + Component { + id: itemsWithAnchorsLayout_Component + RowLayout { + spacing: 2 + Item { + anchors.fill: parent + implicitWidth: 10 + implicitHeight: 10 + } + Item { + anchors.centerIn: parent + implicitWidth: 10 + implicitHeight: 10 + } + Item { + anchors.left: parent.left + implicitWidth: 10 + implicitHeight: 10 + } + Item { + anchors.right: parent.right + implicitWidth: 10 + implicitHeight: 10 + } + Item { + anchors.top: parent.top + implicitWidth: 10 + implicitHeight: 10 + } + Item { + anchors.bottom: parent.bottom + implicitWidth: 10 + implicitHeight: 10 + } + Item { + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + implicitWidth: 10 + implicitHeight: 10 + } + Item { + anchors.margins: 42 // although silly, it should not cause a warning from the Layouts POV + implicitWidth: 10 + implicitHeight: 10 + } + } + } + + function test_warnAboutLayoutItemsWithAnchors() + { + var fullPath = Qt.resolvedUrl("tst_rowlayout.qml") + for (var i = 0; i < 7; ++i) { + ignoreWarning(fullPath + ":" + (1013 + 5*i) +":17: QML Item: Detected anchors on an item that is part of a layout. This is undefined behavior.") + } + var layout = itemsWithAnchorsLayout_Component.createObject(container) + waitForRendering(layout) + layout.destroy() + } + } } |