From 534262b63140c7a6d5d974e97d2164bb8023f449 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Arve=20S=C3=A6ther?= Date: Fri, 24 Nov 2017 15:12:59 +0100 Subject: Warn if a layout has children with anchors We get several bug reports due to this mistake. Print a warning about it and that it *might* eat your cats. Task-number: QTBUG-63303 Change-Id: I0b1ae21dc4419efee88623765a8d6dd302fbc1f4 Reviewed-by: J-P Nurmi --- src/imports/layouts/qquicklayout.cpp | 6 ++++++ src/imports/layouts/qquicklayout_p.h | 1 + src/imports/layouts/qquicklinearlayout.cpp | 2 ++ src/imports/layouts/qquickstacklayout.cpp | 7 +++++-- 4 files changed, 14 insertions(+), 2 deletions(-) (limited to 'src/imports/layouts') diff --git a/src/imports/layouts/qquicklayout.cpp b/src/imports/layouts/qquicklayout.cpp index eb61eb687f..7d51ec3ca9 100644 --- a/src/imports/layouts/qquicklayout.cpp +++ b/src/imports/layouts/qquicklayout.cpp @@ -769,6 +769,12 @@ bool QQuickLayout::shouldIgnoreItem(QQuickItem *child, QQuickLayoutAttached *&in return ignoreItem; } +void QQuickLayout::checkAnchors(QQuickItem *item) const +{ + if (QQuickItemPrivate::get(item)->_anchors) + qmlWarning(item) << "Detected anchors on an item that is part of a layout. This is undefined behavior."; +} + void QQuickLayout::itemChange(ItemChange change, const ItemChangeData &value) { if (change == ItemChildAddedChange) { diff --git a/src/imports/layouts/qquicklayout_p.h b/src/imports/layouts/qquicklayout_p.h index 1e9984e337..b31bffa290 100644 --- a/src/imports/layouts/qquicklayout_p.h +++ b/src/imports/layouts/qquicklayout_p.h @@ -91,6 +91,7 @@ public: static void effectiveSizeHints_helper(QQuickItem *item, QSizeF *cachedSizeHints, QQuickLayoutAttached **info, bool useFallbackToWidthOrHeight); static QLayoutPolicy::Policy effectiveSizePolicy_helper(QQuickItem *item, Qt::Orientation orientation, QQuickLayoutAttached *info); bool shouldIgnoreItem(QQuickItem *child, QQuickLayoutAttached *&info, QSizeF *sizeHints) const; + void checkAnchors(QQuickItem *item) const; void itemChange(ItemChange change, const ItemChangeData &value) override; void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override; diff --git a/src/imports/layouts/qquicklinearlayout.cpp b/src/imports/layouts/qquicklinearlayout.cpp index 4410723f3d..db983e06ba 100644 --- a/src/imports/layouts/qquicklinearlayout.cpp +++ b/src/imports/layouts/qquicklinearlayout.cpp @@ -652,6 +652,7 @@ void QQuickGridLayout::insertLayoutItems() QSizeF sizeHints[Qt::NSizeHints]; const auto items = childItems(); for (QQuickItem *child : items) { + checkAnchors(child); QQuickLayoutAttached *info = 0; // Will skip all items with effective maximum width/height == 0 @@ -826,6 +827,7 @@ void QQuickLinearLayout::insertLayoutItems() const auto items = childItems(); for (QQuickItem *child : items) { Q_ASSERT(child); + checkAnchors(child); QQuickLayoutAttached *info = 0; // Will skip all items with effective maximum width/height == 0 diff --git a/src/imports/layouts/qquickstacklayout.cpp b/src/imports/layouts/qquickstacklayout.cpp index 9a7ec71473..cf70856e14 100644 --- a/src/imports/layouts/qquickstacklayout.cpp +++ b/src/imports/layouts/qquickstacklayout.cpp @@ -288,8 +288,11 @@ void QQuickStackLayout::updateLayoutItems() d->count = count; emit countChanged(); } - for (int i = 0; i < count; ++i) - itemAt(i)->setVisible(d->currentIndex == i); + for (int i = 0; i < count; ++i) { + QQuickItem *child = itemAt(i); + checkAnchors(child); + child->setVisible(d->currentIndex == i); + } invalidate(); } -- cgit v1.2.3