aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/imports/layouts/qquicklayout.cpp3
-rw-r--r--src/quick/items/qquickanchors.cpp13
-rw-r--r--src/quick/items/qquickanchors_p.h1
-rw-r--r--tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml61
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()
+ }
+
}
}