Introduce QLayout::indexOf(QLayoutItem *)

This was the missing counter-part to indexOf(QWidget *), which is
sometimes implemented in user code.

Not sure why the original code doesn't use a for-loop and instead accesses
an out-of-bounds element, but I'll preserve the behavior of very old working code.

Change-Id: I7d7fa56b56a4626789774c15c23fdfef41d723e7
Reviewed-by: David Faure <david.faure@kdab.com>
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
This commit is contained in:
Sergio Martins 2018-02-01 12:36:52 +00:00 committed by Sérgio Martins
parent dc9ce275be
commit 7a342372bb
3 changed files with 41 additions and 0 deletions

View File

@ -1243,6 +1243,26 @@ int QLayout::indexOf(QWidget *widget) const
return -1;
}
/*!
\since 5.12
Searches for layout item \a layoutItem in this layout (not including child
layouts).
Returns the index of \a layoutItem, or -1 if \a layoutItem is not found.
*/
int QLayout::indexOf(QLayoutItem *layoutItem) const
{
int i = 0;
QLayoutItem *item = itemAt(i);
while (item) {
if (item == layoutItem)
return i;
++i;
item = itemAt(i);
}
return -1;
}
/*!
\enum QLayout::SizeConstraint

View File

@ -122,6 +122,7 @@ public:
virtual QLayoutItem *itemAt(int index) const = 0;
virtual QLayoutItem *takeAt(int index) = 0;
virtual int indexOf(QWidget *) const;
QT6_VIRTUAL int indexOf(QLayoutItem *) const;
virtual int count() const = 0;
bool isEmpty() const override;
QSizePolicy::ControlTypes controlTypes() const override;

View File

@ -56,6 +56,7 @@ private slots:
void taskQTBUG_40609_addingWidgetToItsOwnLayout();
void taskQTBUG_40609_addingLayoutToItself();
void replaceWidget();
void indexOf();
};
class CustomLayoutStyle : public QProxyStyle
@ -514,5 +515,24 @@ void tst_QBoxLayout::replaceWidget()
QCOMPARE(boxLayout->indexOf(replaceTo), 1);
}
void tst_QBoxLayout::indexOf()
{
QWidget w;
auto outer = new QVBoxLayout(&w);
auto inner = new QHBoxLayout();
outer->addLayout(inner);
auto widget1 = new QWidget();
QWidget widget2;
inner->addWidget(widget1);
QCOMPARE(inner->indexOf(widget1), 0);
QCOMPARE(inner->indexOf(&widget2), -1);
QCOMPARE(outer->indexOf(widget1), -1);
QCOMPARE(outer->indexOf(&widget2), -1);
QCOMPARE(outer->indexOf(outer), -1);
QCOMPARE(outer->indexOf(inner), 0);
QCOMPARE(inner->indexOf(inner->itemAt(0)), 0);
}
QTEST_MAIN(tst_QBoxLayout)
#include "tst_qboxlayout.moc"