From 42d681f9cfc984046a93b9efe19903d46ac68bb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lund=20Martsum?= Date: Mon, 3 Sep 2012 06:35:39 +0200 Subject: Add widget replace function to QLayout Sometimes it is nice to be able to replace a widget in a layout. Change-Id: I23a6a65e417e94d53bc48639503db1a142bc3f10 Reviewed-by: J-P Nurmi --- src/widgets/kernel/qlayout.cpp | 48 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'src/widgets/kernel/qlayout.cpp') diff --git a/src/widgets/kernel/qlayout.cpp b/src/widgets/kernel/qlayout.cpp index 8541dd984d..b79a6fe6c7 100644 --- a/src/widgets/kernel/qlayout.cpp +++ b/src/widgets/kernel/qlayout.cpp @@ -1108,6 +1108,54 @@ bool QLayout::activate() return true; } +/*! + \since 5.2 + + Searches for widget \a from and replaces it with widget \a to if found. + Returns the layout item that contains the widget \a from on success. Otherwise \c 0 is returned. + If \a recursive is \c true, sub-layouts are searched for doing the replacement. Notice that the returned item therefore might not belong to this layout, but to a sub-layout. + + The returned layout item is no longer owned by the layout and should be either deleted or inserted to another layout. The widget \a from is no longer managed by the layout and may need to be deleted or hidden. The parent of widget \a from is left unchanged. + + This function works for the built-in Qt layouts, but might not work for custom layouts. + + \sa indexOf() +*/ + +//### Qt 6 make this function virtual +QLayoutItem* QLayout::replaceWidget(QWidget *from, QWidget *to, bool recursive) +{ + Q_D(QLayout); + if (!from || !to) + return 0; + + int index = -1; + QLayoutItem *item = 0; + for (int u = 0; u < count(); ++u) { + item = itemAt(u); + if (item->widget() == from) { + index = u; + break; + } + if (item && item->layout() && recursive) { + QLayoutItem *r = item->layout()->replaceWidget(from, to, true); + if (r) + return r; + } + } + if (index == -1) + return 0; + + QLayoutItem *newitem = new QWidgetItem(to); + newitem->setAlignment(item->alignment()); + QLayoutItem *r = d->replaceAt(index, newitem); + if (!r) + delete newitem; + else + addChildWidget(to); + return r; +} + /*! \fn QLayoutItem *QLayout::itemAt(int index) const -- cgit v1.2.3