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 --- .../widgets/kernel/qboxlayout/tst_qboxlayout.cpp | 21 +++++++++- .../widgets/kernel/qformlayout/tst_qformlayout.cpp | 49 ++++++++++++++++++++++ .../widgets/kernel/qgridlayout/tst_qgridlayout.cpp | 45 ++++++++++++++++++++ .../kernel/qstackedlayout/tst_qstackedlayout.cpp | 22 ++++++++++ 4 files changed, 136 insertions(+), 1 deletion(-) (limited to 'tests/auto/widgets') diff --git a/tests/auto/widgets/kernel/qboxlayout/tst_qboxlayout.cpp b/tests/auto/widgets/kernel/qboxlayout/tst_qboxlayout.cpp index bdc32ba197..850bedd9cc 100644 --- a/tests/auto/widgets/kernel/qboxlayout/tst_qboxlayout.cpp +++ b/tests/auto/widgets/kernel/qboxlayout/tst_qboxlayout.cpp @@ -79,6 +79,7 @@ private slots: void taskQTBUG_7103_minMaxWidthNotRespected(); void taskQTBUG_27420_takeAtShouldUnparentLayout(); + void replaceWidget(); }; class CustomLayoutStyle : public QProxyStyle @@ -328,7 +329,6 @@ void tst_QBoxLayout::taskQTBUG_27420_takeAtShouldUnparentLayout() QVERIFY(!inner.isNull()); } - struct Descr { Descr(int min, int sh, int max = -1, bool exp= false, int _stretch = 0, bool _empty = false) @@ -507,5 +507,24 @@ void tst_QBoxLayout::testLayoutEngine() } } +void tst_QBoxLayout::replaceWidget() +{ + QWidget w; + QBoxLayout *boxLayout = new QVBoxLayout(&w); + + QLineEdit *replaceFrom = new QLineEdit; + QLineEdit *replaceTo = new QLineEdit; + boxLayout->addWidget(new QLineEdit()); + boxLayout->addWidget(replaceFrom); + boxLayout->addWidget(new QLineEdit()); + + QCOMPARE(boxLayout->indexOf(replaceFrom), 1); + QCOMPARE(boxLayout->indexOf(replaceTo), -1); + boxLayout->replaceWidget(replaceFrom, replaceTo); + + QCOMPARE(boxLayout->indexOf(replaceFrom), -1); + QCOMPARE(boxLayout->indexOf(replaceTo), 1); +} + QTEST_MAIN(tst_QBoxLayout) #include "tst_qboxlayout.moc" diff --git a/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp b/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp index b970de8e87..135605f185 100644 --- a/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp +++ b/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp @@ -122,6 +122,7 @@ private slots: void itemAt(); void takeAt(); void layoutAlone(); + void replaceWidget(); /* void setGeometry(const QRect &rect); QSize minimumSize() const; @@ -934,6 +935,54 @@ void tst_QFormLayout::taskQTBUG_27420_takeAtShouldUnparentLayout() QVERIFY(!inner.isNull()); } +void tst_QFormLayout::replaceWidget() +{ + QWidget w; + QFormLayout *layout = new QFormLayout(); + w.setLayout(layout); + QLineEdit *edit1 = new QLineEdit(); + QLineEdit *edit2 = new QLineEdit(); + QLineEdit *edit3 = new QLineEdit(); + QLabel *label1 = new QLabel(); + QLabel *label2 = new QLabel(); + + layout->addRow("Label", edit1); + layout->addRow(label1, edit2); + + // Verify controls not in layout + QCOMPARE(layout->indexOf(edit3), -1); + QCOMPARE(layout->indexOf(label2), -1); + + // Verify controls in layout + int editIndex = layout->indexOf(edit1); + int labelIndex = layout->indexOf(label1); + QVERIFY(editIndex > 0); + QVERIFY(labelIndex > 0); + int rownum; + QFormLayout::ItemRole role; + + // replace editor + layout->replaceWidget(edit1, edit3); + edit1->hide(); // Not strictly needed for the test, but for normal usage it is. + QCOMPARE(layout->indexOf(edit1), -1); + QCOMPARE(layout->indexOf(edit3), editIndex); + QCOMPARE(layout->indexOf(label1), labelIndex); + rownum = -1; + role = QFormLayout::SpanningRole; + layout->getWidgetPosition(edit3, &rownum, &role); + QCOMPARE(rownum, 0); + QCOMPARE(role, QFormLayout::FieldRole); + + layout->replaceWidget(label1, label2); + label1->hide(); + QCOMPARE(layout->indexOf(label1), -1); + QCOMPARE(layout->indexOf(label2), labelIndex); + layout->getWidgetPosition(label2, &rownum, &role); + QCOMPARE(rownum, 1); + QCOMPARE(role, QFormLayout::LabelRole); + +} + QTEST_MAIN(tst_QFormLayout) #include "tst_qformlayout.moc" diff --git a/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp b/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp index 10c759da5e..e067b071e7 100644 --- a/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp +++ b/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp @@ -101,6 +101,7 @@ private slots: void distributeMultiCell(); void taskQTBUG_27420_takeAtShouldUnparentLayout(); + void replaceWidget(); private: QWidget *testWidget; @@ -1656,5 +1657,49 @@ void tst_QGridLayout::taskQTBUG_27420_takeAtShouldUnparentLayout() QVERIFY(!inner.isNull()); } +void tst_QGridLayout::replaceWidget() +{ + QWidget wdg; + QGridLayout *l = new QGridLayout(); + const int itemCount = 9; + QLabel *labels[itemCount]; + + // setup layout + for (int n = 0; n < itemCount; ++n) { + int x = n % 3; + int y = n / 3; + labels[n] = new QLabel(QString("label %1").arg(n)); + Qt::Alignment align = (n % 3 ? Qt::AlignLeft : Qt::AlignRight); + l->addWidget(labels[n], x * 3, y * 3, (n % 2) + 1, (n + 1) % 2 + 1, align); + } + wdg.setLayout(l); + + // iterate and replace + for (int n = 0; n < itemCount; n += 2) { + int i = l->indexOf(labels[n]); + int fromRow, fromCol, fromRowSpan, fromColSpan; + l->getItemPosition(i, &fromRow, &fromCol, &fromRowSpan, &fromColSpan); + Qt::Alignment fromAlign = l->itemAt(i)->alignment(); + // do replace + QPushButton *pb = new QPushButton("replaced"); + QLayoutItem *olditem = l->replaceWidget(labels[n], pb); + // verify + QCOMPARE(i, l->indexOf(pb)); + QVERIFY(olditem != 0); + QCOMPARE(l->indexOf(labels[n]), -1); + int toRow, toCol, toRowSpan, toColSpan; + l->getItemPosition(i, &toRow, &toCol, &toRowSpan, &toColSpan); + QCOMPARE(fromRow, toRow); + QCOMPARE(fromCol, toCol); + QCOMPARE(fromRowSpan, toRowSpan); + QCOMPARE(fromColSpan, toColSpan); + Qt::Alignment toAlign = l->itemAt(i)->alignment(); + QCOMPARE(fromAlign, toAlign); + // clean up + olditem->widget()->deleteLater(); + delete olditem; + } +} + QTEST_MAIN(tst_QGridLayout) #include "tst_qgridlayout.moc" diff --git a/tests/auto/widgets/kernel/qstackedlayout/tst_qstackedlayout.cpp b/tests/auto/widgets/kernel/qstackedlayout/tst_qstackedlayout.cpp index 9ab7bb5305..1ff2e7867c 100644 --- a/tests/auto/widgets/kernel/qstackedlayout/tst_qstackedlayout.cpp +++ b/tests/auto/widgets/kernel/qstackedlayout/tst_qstackedlayout.cpp @@ -70,6 +70,7 @@ private slots: void removeWidget(); void keepFocusAfterSetCurrent(); void heigthForWidth(); + void replaceWidget(); private: QWidget *testWidget; @@ -393,6 +394,27 @@ void tst_QStackedLayout::heigthForWidth() } +void tst_QStackedLayout::replaceWidget() +{ + QWidget w; + QStackedLayout *stackLayout = new QStackedLayout(&w); + + QLineEdit *replaceFrom = new QLineEdit; + QLineEdit *replaceTo = new QLineEdit; + stackLayout->addWidget(new QLineEdit()); + stackLayout->addWidget(replaceFrom); + stackLayout->addWidget(new QLineEdit()); + stackLayout->setCurrentWidget(replaceFrom); + + QCOMPARE(stackLayout->indexOf(replaceFrom), 1); + QCOMPARE(stackLayout->indexOf(replaceTo), -1); + stackLayout->replaceWidget(replaceFrom, replaceTo); + + QCOMPARE(stackLayout->indexOf(replaceFrom), -1); + QCOMPARE(stackLayout->indexOf(replaceTo), 1); + QCOMPARE(stackLayout->currentWidget(), replaceTo); +} + QTEST_MAIN(tst_QStackedLayout) #include "tst_qstackedlayout.moc" -- cgit v1.2.3