| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the test suite of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** GNU General Public License Usage |
| ** Alternatively, this file may be used under the terms of the GNU |
| ** General Public License version 3 as published by the Free Software |
| ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT |
| ** included in the packaging of this file. Please review the following |
| ** information to ensure the GNU General Public License requirements will |
| ** be met: https://www.gnu.org/licenses/gpl-3.0.html. |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| |
| #include <QtTest/QtTest> |
| #include <qgraphicslinearlayout.h> |
| #include <qgraphicsproxywidget.h> |
| #include <qgraphicswidget.h> |
| #include <qgraphicsscene.h> |
| #include <qgraphicsview.h> |
| #include <qapplication.h> |
| #include <QtWidgets/qstyle.h> |
| #include <QtWidgets/qproxystyle.h> |
| |
| class tst_QGraphicsLinearLayout : public QObject { |
| Q_OBJECT |
| |
| private slots: |
| void initTestCase(); |
| void qgraphicslinearlayout_data(); |
| void qgraphicslinearlayout(); |
| |
| void alignment_data(); |
| void alignment(); |
| void count_data(); |
| void count(); |
| void dump_data(); |
| void dump(); |
| void geometry_data(); |
| void geometry(); |
| void insertItem_data(); |
| void insertItem(); |
| void insertStretch_data(); |
| void insertStretch(); |
| void invalidate_data(); |
| void invalidate(); |
| void itemAt_data(); |
| void itemAt(); |
| void itemAt_visualOrder(); |
| void orientation_data(); |
| void orientation(); |
| void removeAt_data(); |
| void removeAt(); |
| void removeItem_data(); |
| void removeItem(); |
| void setGeometry_data(); |
| void setGeometry(); |
| void defaultSpacing(); |
| void setSpacing_data(); |
| void setSpacing(); |
| void setItemSpacing_data(); |
| void setItemSpacing(); |
| void itemSpacing(); |
| void setStretchFactor_data(); |
| void setStretchFactor(); |
| void testStretch(); |
| void defaultStretchFactors_data(); |
| void defaultStretchFactors(); |
| void sizeHint_data(); |
| void sizeHint(); |
| void updateGeometry(); |
| void layoutDirection(); |
| void removeLayout(); |
| void avoidRecursionInInsertItem(); |
| void styleInfoLeak(); |
| void testAlignmentInLargerLayout(); |
| void testOffByOneInLargerLayout(); |
| void testDefaultAlignment(); |
| void combineSizePolicies(); |
| void hiddenItems(); |
| |
| // Task specific tests |
| void task218400_insertStretchCrash(); |
| }; |
| |
| // Subclass that exposes the protected functions. |
| class SubQGraphicsLinearLayout : public QGraphicsLinearLayout { |
| public: |
| SubQGraphicsLinearLayout(Qt::Orientation orientation = Qt::Horizontal) : QGraphicsLinearLayout(orientation), |
| graphicsSceneResize(0), |
| layoutRequest(0), |
| layoutDirectionChange(0) |
| { } |
| |
| void widgetEvent(QEvent *e) |
| { |
| switch (e->type()) { |
| case QEvent::GraphicsSceneResize: |
| graphicsSceneResize++; |
| break; |
| case QEvent::LayoutRequest: |
| layoutRequest++; |
| break; |
| case QEvent::LayoutDirectionChange: |
| layoutDirectionChange++; |
| break; |
| default: |
| break; |
| } |
| |
| QGraphicsLinearLayout::widgetEvent(e); |
| } |
| |
| int graphicsSceneResize; |
| int layoutRequest; |
| int layoutDirectionChange; |
| }; |
| |
| // This will be called before the first test function is executed. |
| // It is only called once. |
| void tst_QGraphicsLinearLayout::initTestCase() |
| { |
| // since the style will influence the results, we have to ensure |
| // that the tests are run using the same style on all platforms |
| QApplication::setStyle("windows"); |
| } |
| |
| class RectWidget : public QGraphicsWidget |
| { |
| public: |
| RectWidget(QGraphicsItem *parent = 0, const QBrush &brush = QBrush()) : QGraphicsWidget(parent){ m_brush = brush;} |
| |
| void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) |
| { |
| Q_UNUSED(option); |
| Q_UNUSED(widget); |
| painter->setBrush(m_brush); |
| painter->drawRoundedRect(rect(), 25, 25, Qt::RelativeSize); |
| } |
| |
| void setSizeHint(Qt::SizeHint which, const QSizeF &size) { |
| m_sizeHints[which] = size; |
| updateGeometry(); |
| } |
| |
| virtual QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const { |
| if (m_sizeHints[which].isValid()) { |
| return m_sizeHints[which]; |
| } |
| return QGraphicsWidget::sizeHint(which, constraint); |
| } |
| |
| // Initializer {} is a workaround for gcc bug 68949 |
| QSizeF m_sizeHints[Qt::NSizeHints] {}; |
| QBrush m_brush; |
| }; |
| |
| |
| Q_DECLARE_METATYPE(Qt::Orientation) |
| void tst_QGraphicsLinearLayout::qgraphicslinearlayout_data() |
| { |
| QTest::addColumn<Qt::Orientation>("orientation"); |
| QTest::newRow("vertical") << Qt::Vertical; |
| QTest::newRow("horizontal") << Qt::Horizontal; |
| } |
| |
| void tst_QGraphicsLinearLayout::qgraphicslinearlayout() |
| { |
| QFETCH(Qt::Orientation, orientation); |
| SubQGraphicsLinearLayout layout(orientation); |
| QVERIFY(layout.isLayout()); |
| |
| qApp->processEvents(); |
| QCOMPARE(layout.graphicsSceneResize, 0); |
| QCOMPARE(layout.layoutRequest, 0); |
| QCOMPARE(layout.layoutDirectionChange, 0); |
| |
| layout.setOrientation(Qt::Vertical); |
| layout.orientation(); |
| QTest::ignoreMessage(QtWarningMsg, "QGraphicsLinearLayout::insertItem: cannot insert null item"); |
| QCOMPARE(layout.count(), 0); |
| layout.addItem(0); |
| QCOMPARE(layout.count(), 0); |
| layout.addStretch(0); |
| QCOMPARE(layout.count(), 0); |
| QTest::ignoreMessage(QtWarningMsg, "QGraphicsLinearLayout::insertItem: cannot insert null item"); |
| layout.insertItem(0, 0); |
| layout.insertStretch(0, 0); |
| layout.removeItem(0); |
| QCOMPARE(layout.count(), 0); |
| layout.setSpacing(0); |
| layout.spacing(); |
| QTest::ignoreMessage(QtWarningMsg, "QGraphicsLinearLayout::setStretchFactor: cannot assign a stretch factor to a null item"); |
| layout.setStretchFactor(0, 0); |
| QTest::ignoreMessage(QtWarningMsg, "QGraphicsLinearLayout::setStretchFactor: cannot return a stretch factor for a null item"); |
| layout.stretchFactor(0); |
| layout.setAlignment(0, Qt::AlignHCenter); |
| QCOMPARE(layout.alignment(0), 0); |
| layout.setGeometry(QRectF()); |
| layout.geometry(); |
| QCOMPARE(layout.count(), 0); |
| layout.invalidate(); |
| layout.sizeHint(Qt::MinimumSize, QSizeF()); |
| } |
| |
| Q_DECLARE_METATYPE(Qt::AlignmentFlag) |
| void tst_QGraphicsLinearLayout::alignment_data() |
| { |
| QTest::addColumn<Qt::Orientation>("orientation"); |
| QTest::addColumn<QSize>("newSize"); |
| QTest::newRow("h-defaultsize") << Qt::Horizontal << QSize(); |
| QTest::newRow("v-defaultsize") << Qt::Vertical << QSize(); |
| QTest::newRow("h-300") << Qt::Horizontal << QSize(300,100); |
| QTest::newRow("v-300") << Qt::Vertical << QSize(100, 300); |
| } |
| |
| void tst_QGraphicsLinearLayout::alignment() |
| { |
| QFETCH(Qt::Orientation, orientation); |
| QFETCH(QSize, newSize); |
| |
| //if (alignment == Qt::AlignAbsolute) |
| // QApplication::setLayoutDirection(Qt::RightToLeft); |
| QGraphicsScene scene; |
| QGraphicsView view(&scene); |
| view.setSceneRect(0, 0, 320, 240); |
| QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
| SubQGraphicsLinearLayout &layout = *(new SubQGraphicsLinearLayout(orientation)); |
| scene.addItem(widget); |
| widget->setLayout(&layout); |
| |
| static const Qt::Alignment alignmentsToTest[] = { |
| (Qt::Alignment)0, |
| Qt::AlignLeft, |
| Qt::AlignRight, |
| Qt::AlignHCenter, |
| Qt::AlignTop, |
| Qt::AlignBottom, |
| Qt::AlignVCenter, |
| Qt::AlignCenter, |
| (Qt::Alignment)0, |
| Qt::AlignLeft, |
| Qt::AlignRight, |
| Qt::AlignHCenter, |
| Qt::AlignTop, |
| Qt::AlignBottom, |
| Qt::AlignVCenter, |
| Qt::AlignCenter |
| }; |
| |
| int i; |
| bool addWidget = true; |
| for (size_t i = 0; i < sizeof(alignmentsToTest)/sizeof(Qt::Alignment); ++i) { |
| QGraphicsLayoutItem *loutItem; |
| Qt::Alignment align = alignmentsToTest[i]; |
| if (!align && i > 0) |
| addWidget = false; |
| if (addWidget) |
| loutItem = new RectWidget(widget, QBrush(Qt::blue)); |
| else { |
| SubQGraphicsLinearLayout *lay = new SubQGraphicsLinearLayout(Qt::Vertical); |
| lay->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred, QSizePolicy::DefaultType); |
| lay->setContentsMargins(0,0,0,0); |
| QGraphicsWidget *w = new RectWidget(widget, QBrush(Qt::red)); |
| if (align) { |
| w->setMinimumSize(QSizeF(10,10)); |
| w->setMaximumSize(QSizeF(10,10)); |
| } else { |
| w->setMinimumSize(QSizeF(50,50)); |
| w->setMaximumSize(QSizeF(50,50)); |
| } |
| lay->addItem(w); |
| loutItem = lay; |
| } |
| if (align) { |
| loutItem->setMinimumSize(QSizeF(10,10)); |
| loutItem->setMaximumSize(QSizeF(10,10)); |
| } else { |
| loutItem->setMinimumSize(QSizeF(50,50)); |
| loutItem->setMaximumSize(QSizeF(50,50)); |
| } |
| layout.addItem(loutItem); |
| layout.setAlignment(loutItem, align); |
| |
| } |
| layout.setContentsMargins(0,0,0,0); |
| int spacing = 1; |
| layout.setSpacing(spacing); |
| if (newSize.isValid()) |
| widget->resize(newSize); |
| view.show(); |
| widget->show(); |
| QVERIFY(QTest::qWaitForWindowExposed(&view)); |
| QApplication::processEvents(); |
| |
| int x = 0; |
| int y = 0; |
| for (i = 0; i < layout.count(); ++i) { |
| QGraphicsLayoutItem *item = layout.itemAt(i); |
| Qt::Alignment align = layout.alignment(item); |
| |
| int w = 10; |
| int h = 10; |
| switch(align) { |
| case Qt::AlignLeft: |
| break; |
| case Qt::AlignRight: |
| if (orientation == Qt::Vertical) |
| x += 40; |
| break; |
| case Qt::AlignHCenter: |
| if (orientation == Qt::Vertical) |
| x += 20; |
| break; |
| case Qt::AlignTop: |
| break; |
| case Qt::AlignBottom: |
| if (orientation == Qt::Horizontal) |
| y += 40; |
| break; |
| case Qt::AlignVCenter: |
| if (orientation == Qt::Horizontal) |
| y += 20; |
| break; |
| case Qt::AlignCenter: |
| if (orientation == Qt::Horizontal) |
| y += 20; |
| else |
| x += 20; |
| break; |
| case 0: |
| w = 50; |
| h = 50; |
| break; |
| default: |
| break; |
| } |
| QRectF expectedGeometry(x, y, w, h); |
| QCOMPARE(item->geometry(), expectedGeometry); |
| if (orientation == Qt::Horizontal) { |
| x += w; |
| y = 0; |
| x += spacing; |
| } else { |
| x = 0; |
| y += h; |
| y += spacing; |
| } |
| } |
| } |
| |
| void tst_QGraphicsLinearLayout::count_data() |
| { |
| QTest::addColumn<int>("itemCount"); |
| QTest::addColumn<int>("layoutCount"); |
| QTest::newRow("0, 0") << 0 << 0; |
| QTest::newRow("0, 5") << 0 << 5; |
| QTest::newRow("5, 0") << 5 << 0; |
| QTest::newRow("5, 5") << 5 << 5; |
| } |
| |
| // int count() const public |
| void tst_QGraphicsLinearLayout::count() |
| { |
| QFETCH(int, itemCount); |
| QFETCH(int, layoutCount); |
| |
| SubQGraphicsLinearLayout layout; |
| QCOMPARE(layout.count(), 0); |
| |
| for (int i = 0; i < itemCount; ++i) |
| layout.addItem(new QGraphicsWidget); |
| QCOMPARE(layout.count(), itemCount); |
| |
| for (int i = 0; i < layoutCount; ++i) |
| layout.addItem(new SubQGraphicsLinearLayout); |
| QCOMPARE(layout.count(), itemCount + layoutCount); |
| |
| // see also removeAt() |
| } |
| |
| void tst_QGraphicsLinearLayout::dump_data() |
| { |
| QTest::addColumn<int>("itemCount"); |
| QTest::addColumn<int>("layoutCount"); |
| for (int i = -1; i < 3; ++i) { |
| const QByteArray iB = QByteArray::number(i); |
| QTest::newRow((iB + ", 0, 0").constData()) << 0 << 0; |
| QTest::newRow((iB + ", 0, 5").constData()) << 5 << 5; |
| QTest::newRow((iB + ", 5, 0").constData()) << 5 << 5; |
| QTest::newRow((iB + ", 5, 5").constData()) << 5 << 5; |
| } |
| } |
| |
| // void dump(int indent = 0) const public |
| void tst_QGraphicsLinearLayout::dump() |
| { |
| QFETCH(int, itemCount); |
| QFETCH(int, layoutCount); |
| SubQGraphicsLinearLayout layout; |
| for (int i = 0; i < itemCount; ++i) |
| layout.addItem(new QGraphicsWidget); |
| for (int i = 0; i < layoutCount; ++i) |
| layout.addItem(new SubQGraphicsLinearLayout); |
| } |
| |
| void tst_QGraphicsLinearLayout::geometry_data() |
| { |
| QTest::addColumn<int>("itemCount"); |
| QTest::addColumn<int>("layoutCount"); |
| QTest::addColumn<int>("itemSpacing"); |
| QTest::addColumn<int>("spacing"); |
| QTest::addColumn<Qt::Orientation>("orientation"); |
| QTest::addColumn<QRectF>("rect"); |
| |
| QTest::newRow("null") << 0 << 0 << 0 << 0 << Qt::Horizontal << QRectF(); |
| |
| QTest::newRow("one item") << 1 << 0 << 0 << 0 << Qt::Horizontal << QRectF(0, 0, 10, 10); |
| QTest::newRow("one layout") << 0 << 1 << 0 << 0 << Qt::Horizontal << QRectF(0, 0, 10, 10); |
| QTest::newRow("two h") << 1 << 1 << 0 << 0 << Qt::Horizontal << QRectF(0, 0, 20, 10); |
| QTest::newRow("two v") << 1 << 1 << 0 << 0 << Qt::Vertical << QRectF(0, 0, 10, 20); |
| |
| QTest::newRow("two w/itemspacing") << 1 << 1 << 5 << 0 << Qt::Horizontal << QRectF(0, 0, 25, 10); |
| QTest::newRow("two w/spacing") << 1 << 1 << 8 << 0 << Qt::Horizontal << QRectF(0, 0, 28, 10); |
| |
| QTest::newRow("two w/itemspacing v") << 1 << 1 << 5 << 0 << Qt::Vertical << QRectF(0, 0, 10, 25); |
| QTest::newRow("two w/spacing v") << 1 << 1 << 8 << 0 << Qt::Vertical << QRectF(0, 0, 10, 28); |
| } |
| |
| // QRectF geometry() const public |
| void tst_QGraphicsLinearLayout::geometry() |
| { |
| QFETCH(int, itemCount); |
| QFETCH(int, layoutCount); |
| QFETCH(int, itemSpacing); |
| QFETCH(int, spacing); |
| QFETCH(Qt::Orientation, orientation); |
| QFETCH(QRectF, rect); |
| QGraphicsScene scene; |
| QGraphicsView view(&scene); |
| QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
| SubQGraphicsLinearLayout &layout = *(new SubQGraphicsLinearLayout(orientation)); |
| scene.addItem(widget); |
| widget->setLayout(&layout); |
| widget->setContentsMargins(0, 0, 0, 0); |
| for (int i = 0; i < itemCount; ++i) |
| layout.addItem(new QGraphicsWidget); |
| for (int i = 0; i < layoutCount; ++i) |
| layout.addItem(new SubQGraphicsLinearLayout); |
| |
| for (int i = 0; i < layout.count(); ++i) { |
| QGraphicsLayoutItem *item = layout.itemAt(i); |
| item->setMaximumSize(10, 10); |
| item->setMinimumSize(10, 10); |
| } |
| layout.setItemSpacing(0, itemSpacing); |
| layout.setSpacing(spacing); |
| layout.setContentsMargins(0, 0, 0, 0); |
| |
| widget->show(); |
| view.show(); |
| QApplication::processEvents(); |
| QCOMPARE(layout.geometry(), rect); |
| delete widget; |
| } |
| |
| void tst_QGraphicsLinearLayout::insertItem_data() |
| { |
| QTest::addColumn<int>("itemCount"); |
| QTest::addColumn<int>("layoutCount"); |
| QTest::addColumn<int>("insertItemAt"); |
| QTest::addColumn<bool>("isWidget"); |
| for (int i = -1; i < 4; ++i) { |
| const QByteArray iB = QByteArray::number(i); |
| for (int j = 0; j < 2; ++j) { |
| const QByteArray postFix = iB + ' ' + QByteArray::number(j); |
| QTest::newRow(("0, 0, " + postFix).constData()) << 0 << 0 << i << (bool)j; |
| QTest::newRow(("1, 0, " + postFix).constData()) << 1 << 0 << i << (bool)j; |
| QTest::newRow(("0, 1, " + postFix).constData()) << 0 << 1 << i << (bool)j; |
| QTest::newRow(("2, 2, " + postFix).constData()) << 2 << 2 << i << (bool)j; |
| } |
| } |
| } |
| |
| // void insertItem(int index, QGraphicsLayoutItem* item) public |
| void tst_QGraphicsLinearLayout::insertItem() |
| { |
| QFETCH(int, itemCount); |
| QFETCH(int, layoutCount); |
| QFETCH(int, insertItemAt); |
| QFETCH(bool, isWidget); |
| if (insertItemAt > layoutCount + itemCount) |
| return; |
| |
| SubQGraphicsLinearLayout layout; |
| for (int i = 0; i < itemCount; ++i) |
| layout.addItem(new QGraphicsWidget); |
| for (int i = 0; i < layoutCount; ++i) |
| layout.addItem(new SubQGraphicsLinearLayout); |
| |
| QGraphicsLayoutItem *item = 0; |
| if (isWidget) |
| item = new QGraphicsWidget; |
| else |
| item = new SubQGraphicsLinearLayout; |
| |
| QSizeF oldSizeHint = layout.sizeHint(Qt::PreferredSize, QSizeF()); |
| layout.insertItem(insertItemAt, item); |
| QCOMPARE(layout.count(), itemCount + layoutCount + 1); |
| |
| if (insertItemAt >= 0 && (itemCount + layoutCount >= 0)) { |
| QCOMPARE(layout.itemAt(insertItemAt), item); |
| } |
| |
| layout.activate(); |
| QSizeF newSizeHint = layout.sizeHint(Qt::PreferredSize, QSizeF()); |
| if (!isWidget && layout.count() == 1) |
| QCOMPARE(oldSizeHint.width(), newSizeHint.width()); |
| else if (itemCount + layoutCount > 0) |
| QVERIFY(oldSizeHint.width() < newSizeHint.width()); |
| } |
| |
| void tst_QGraphicsLinearLayout::insertStretch_data() |
| { |
| QTest::addColumn<int>("itemCount"); |
| QTest::addColumn<int>("layoutCount"); |
| QTest::addColumn<int>("insertItemAt"); |
| QTest::addColumn<int>("stretch"); |
| for (int i = -1; i < 4; ++i) { |
| const QByteArray iB = QByteArray::number(i); |
| for (int j = 0; j < 2; ++j) { |
| const QByteArray postFix = iB + ' ' + QByteArray::number(j); |
| QTest::newRow(("0, 0, " + postFix).constData()) << 0 << 0 << i << j; |
| QTest::newRow(("1, 0, " + postFix).constData()) << 1 << 0 << i << j; |
| QTest::newRow(("0, 1, " + postFix).constData()) << 0 << 1 << i << j; |
| QTest::newRow(("2, 2, " + postFix).constData()) << 2 << 2 << i << j; |
| } |
| } |
| } |
| |
| // void insertStretch(int index, int stretch = 1) public |
| void tst_QGraphicsLinearLayout::insertStretch() |
| { |
| QFETCH(int, itemCount); |
| QFETCH(int, layoutCount); |
| QFETCH(int, insertItemAt); |
| QFETCH(int, stretch); |
| if (insertItemAt > layoutCount + itemCount) |
| return; |
| |
| QGraphicsScene scene; |
| QGraphicsView view(&scene); |
| QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
| SubQGraphicsLinearLayout *layout = new SubQGraphicsLinearLayout; |
| scene.addItem(widget); |
| |
| QList<QGraphicsWidget *>items; |
| QGraphicsWidget *item = 0; |
| for (int i = 0; i < itemCount; ++i) { |
| item = new RectWidget; |
| item->setMinimumSize(10, 10); |
| item->setPreferredSize(25, 25); |
| item->setMaximumSize(50, 50); |
| layout->addItem(item); |
| } |
| for (int i = 0; i < layoutCount; ++i) { |
| item = new RectWidget; |
| item->setMinimumSize(10, 10); |
| item->setPreferredSize(25, 25); |
| item->setMaximumSize(50, 50); |
| SubQGraphicsLinearLayout *sublayout = new SubQGraphicsLinearLayout; |
| sublayout->addItem(item); |
| layout->addItem(sublayout); |
| } |
| widget->setLayout(layout); |
| layout->insertStretch(insertItemAt, stretch); |
| QCOMPARE(layout->count(), itemCount + layoutCount); |
| |
| layout->activate(); |
| view.show(); |
| widget->show(); |
| |
| int prevStretch = -2; |
| int prevWidth = -2; |
| widget->resize((layoutCount + itemCount) * 25 + 25, 25); |
| for (int i = 0; i < layout->count(); ++i) { |
| if (QGraphicsLayoutItem *item = layout->itemAt(i)) { |
| if (prevStretch != -2) { |
| if (layout->stretchFactor(item) >= prevStretch) { |
| QVERIFY(item->geometry().width() >= prevWidth); |
| } else { |
| QVERIFY(item->geometry().width() < prevWidth); |
| } |
| } |
| prevStretch = layout->stretchFactor(item); |
| prevWidth = (int)(item->geometry().width()); |
| } |
| } |
| |
| delete widget; |
| } |
| |
| void tst_QGraphicsLinearLayout::invalidate_data() |
| { |
| QTest::addColumn<int>("count"); |
| QTest::newRow("0") << 0; |
| QTest::newRow("1") << 1; |
| QTest::newRow("2") << 2; |
| QTest::newRow("3") << 3; |
| } |
| |
| // void invalidate() public |
| void tst_QGraphicsLinearLayout::invalidate() |
| { |
| QFETCH(int, count); |
| QGraphicsScene scene; |
| QGraphicsView view(&scene); |
| QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
| SubQGraphicsLinearLayout &layout = *(new SubQGraphicsLinearLayout); |
| scene.addItem(widget); |
| widget->setLayout(&layout); |
| widget->setContentsMargins(0, 0, 0, 0); |
| layout.setContentsMargins(0, 0, 0, 0); |
| view.show(); |
| widget->show(); |
| QVERIFY(QTest::qWaitForWindowExposed(&view)); |
| qApp->processEvents(); |
| layout.layoutRequest = 0; |
| |
| layout.setContentsMargins(1, 2, 3, 4); |
| QApplication::sendPostedEvents(0, 0); |
| QCOMPARE(layout.layoutRequest, 1); |
| |
| layout.setOrientation(Qt::Vertical); |
| QApplication::sendPostedEvents(0, 0); |
| QCOMPARE(layout.layoutRequest, 2); |
| |
| for (int i = 0; i < count; ++i) |
| layout.invalidate(); // Event is compressed, should only get one layoutrequest |
| QApplication::sendPostedEvents(0, 0); |
| QCOMPARE(layout.layoutRequest, count ? 3 : 2); |
| delete widget; |
| } |
| |
| void tst_QGraphicsLinearLayout::itemAt_data() |
| { |
| QTest::addColumn<int>("index"); |
| QTest::newRow("0") << 0; |
| QTest::newRow("1") << 1; |
| QTest::newRow("2") << 2; |
| } |
| |
| // QGraphicsLayoutItem* itemAt(int index) const public |
| void tst_QGraphicsLinearLayout::itemAt() |
| { |
| // see also the insertItem() etc tests |
| QFETCH(int, index); |
| SubQGraphicsLinearLayout layout; |
| for (int i = 0; i < 3; ++i) |
| layout.addItem(new QGraphicsWidget); |
| |
| QVERIFY(layout.itemAt(index) != 0); |
| } |
| |
| void tst_QGraphicsLinearLayout::itemAt_visualOrder() |
| { |
| QGraphicsLinearLayout *l = new QGraphicsLinearLayout; |
| |
| QGraphicsWidget *w1 = new QGraphicsWidget; |
| l->addItem(w1); |
| |
| QGraphicsWidget *w3 = new QGraphicsWidget; |
| l->addItem(w3); |
| |
| QGraphicsWidget *w0 = new QGraphicsWidget; |
| l->insertItem(0, w0); |
| |
| QGraphicsWidget *w2 = new QGraphicsWidget; |
| l->insertItem(2, w2); |
| |
| QCOMPARE(l->itemAt(0), static_cast<QGraphicsLayoutItem*>(w0)); |
| QCOMPARE(l->itemAt(1), static_cast<QGraphicsLayoutItem*>(w1)); |
| QCOMPARE(l->itemAt(2), static_cast<QGraphicsLayoutItem*>(w2)); |
| QCOMPARE(l->itemAt(3), static_cast<QGraphicsLayoutItem*>(w3)); |
| } |
| |
| void tst_QGraphicsLinearLayout::orientation_data() |
| { |
| QTest::addColumn<Qt::Orientation>("orientation"); |
| QTest::newRow("vertical") << Qt::Vertical; |
| QTest::newRow("horizontal") << Qt::Horizontal; |
| } |
| |
| // Qt::Orientation orientation() const public |
| void tst_QGraphicsLinearLayout::orientation() |
| { |
| QFETCH(Qt::Orientation, orientation); |
| |
| QGraphicsScene scene; |
| QGraphicsView view(&scene); |
| QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
| Qt::Orientation initialOrientation = (orientation == Qt::Vertical ? Qt::Horizontal : Qt::Vertical); |
| SubQGraphicsLinearLayout &layout = *(new SubQGraphicsLinearLayout(initialOrientation)); |
| scene.addItem(widget); |
| widget->setLayout(&layout); |
| widget->setContentsMargins(0, 0, 0, 0); |
| layout.setContentsMargins(0, 0, 0, 0); |
| int i; |
| int itemCount = 3; |
| for (i = 0; i < itemCount; ++i) |
| layout.addItem(new RectWidget); |
| QCOMPARE(layout.orientation(), initialOrientation); |
| QList<qreal> positions; |
| |
| view.show(); |
| widget->show(); |
| qApp->processEvents(); |
| |
| for (i = 0; i < itemCount; ++i) { |
| QGraphicsWidget *item = static_cast<QGraphicsWidget*>(layout.itemAt(i)); |
| qreal pos; |
| if (initialOrientation == Qt::Horizontal) |
| pos = item->pos().x(); |
| else |
| pos = item->pos().y(); |
| positions.append(pos); |
| |
| } |
| |
| layout.setOrientation(orientation); |
| QCOMPARE(layout.orientation(), orientation); |
| // important to resize to preferredsize when orientation is switched |
| widget->resize(widget->effectiveSizeHint(Qt::PreferredSize)); |
| qApp->processEvents(); |
| for (i = 0; i < positions.count(); ++i) { |
| QGraphicsWidget *item = static_cast<QGraphicsWidget*>(layout.itemAt(i)); |
| if (initialOrientation == Qt::Horizontal) |
| QCOMPARE(item->pos().y(), positions.at(i)); |
| else |
| QCOMPARE(item->pos().x(), positions.at(i)); |
| } |
| } |
| |
| void tst_QGraphicsLinearLayout::removeAt_data() |
| { |
| QTest::addColumn<int>("itemCount"); |
| QTest::addColumn<int>("layoutCount"); |
| QTest::addColumn<int>("removeItemAt"); |
| QTest::addColumn<Qt::Orientation>("orientation"); |
| for (int i = -1; i < 4; ++i) { |
| const QByteArray iB = QByteArray::number(i); |
| for (int k = 0; k < 2; ++k) { |
| Qt::Orientation orientation = (k == 0) ? Qt::Vertical : Qt::Horizontal; |
| QTest::newRow(("0, 0, " + iB).constData()) << 0 << 0 << i << orientation; |
| QTest::newRow(("1, 0, " + iB).constData()) << 1 << 0 << i << orientation; |
| QTest::newRow(("0, 1, " + iB).constData()) << 0 << 1 << i << orientation; |
| QTest::newRow(("2, 2, " + iB).constData()) << 2 << 2 << i << orientation; |
| } |
| } |
| } |
| |
| // void removeAt(int index) public |
| void tst_QGraphicsLinearLayout::removeAt() |
| { |
| QFETCH(int, itemCount); |
| QFETCH(int, layoutCount); |
| QFETCH(int, removeItemAt); |
| QFETCH(Qt::Orientation, orientation); |
| if (removeItemAt >= layoutCount + itemCount) |
| return; |
| |
| SubQGraphicsLinearLayout layout(orientation); |
| for (int i = 0; i < itemCount; ++i) |
| layout.addItem(new QGraphicsWidget); |
| for (int i = 0; i < layoutCount; ++i) |
| layout.addItem(new SubQGraphicsLinearLayout); |
| QSizeF oldSizeHint = layout.sizeHint(Qt::PreferredSize, QSizeF()); |
| |
| QGraphicsLayoutItem *w = 0; |
| if (removeItemAt >= 0 && removeItemAt < layout.count()) |
| w = layout.itemAt(removeItemAt); |
| if (w) { |
| QGraphicsLayoutItem *wParent = w->parentLayoutItem(); |
| QCOMPARE(wParent, static_cast<QGraphicsLayoutItem *>(&layout)); |
| layout.removeAt(removeItemAt); |
| wParent = w->parentLayoutItem(); |
| QCOMPARE(wParent, nullptr); |
| delete w; |
| } |
| QCOMPARE(layout.count(), itemCount + layoutCount - (w ? 1 : 0)); |
| |
| layout.activate(); |
| QSizeF newSizeHint = layout.sizeHint(Qt::PreferredSize, QSizeF()); |
| if (orientation == Qt::Horizontal) |
| QVERIFY(oldSizeHint.width() >= newSizeHint.width()); |
| else |
| QVERIFY(oldSizeHint.height() >= newSizeHint.height()); |
| } |
| |
| void tst_QGraphicsLinearLayout::removeItem_data() |
| { |
| QTest::addColumn<int>("itemCount"); |
| QTest::addColumn<int>("layoutCount"); |
| QTest::addColumn<int>("removeItemAt"); |
| for (int i = -1; i < 4; ++i) { |
| const QByteArray iB = QByteArray::number(i); |
| QTest::newRow(("0, 0, " + iB).constData()) << 0 << 0 << i; |
| QTest::newRow(("1, 0, " + iB).constData()) << 1 << 0 << i; |
| QTest::newRow(("0, 1, " + iB).constData()) << 0 << 1 << i; |
| QTest::newRow(("2, 2, " + iB).constData()) << 2 << 2 << i; |
| } |
| } |
| |
| // void removeItem(QGraphicsLayoutItem* item) public |
| void tst_QGraphicsLinearLayout::removeItem() |
| { |
| QFETCH(int, itemCount); |
| QFETCH(int, layoutCount); |
| QFETCH(int, removeItemAt); |
| if (removeItemAt >= layoutCount + itemCount) |
| return; |
| |
| SubQGraphicsLinearLayout layout; |
| for (int i = 0; i < itemCount; ++i) |
| layout.addItem(new QGraphicsWidget); |
| for (int i = 0; i < layoutCount; ++i) |
| layout.addItem(new SubQGraphicsLinearLayout); |
| |
| QGraphicsLayoutItem *w = 0; |
| if (removeItemAt >= 0 && removeItemAt < layout.count()) |
| w = layout.itemAt(removeItemAt); |
| QSizeF oldSizeHint = layout.sizeHint(Qt::PreferredSize, QSizeF()); |
| if (w) { |
| layout.removeItem(w); |
| delete w; |
| } |
| QCOMPARE(layout.count(), itemCount + layoutCount - (w ? 1 : 0)); |
| |
| layout.activate(); |
| QSizeF newSizeHint = layout.sizeHint(Qt::PreferredSize, QSizeF()); |
| QVERIFY(oldSizeHint.width() >= newSizeHint.width()); |
| } |
| |
| void tst_QGraphicsLinearLayout::setGeometry_data() |
| { |
| QTest::addColumn<QRectF>("rect"); |
| QTest::newRow("null") << QRectF(); |
| QTest::newRow("small") << QRectF(0, 0, 10, 10); |
| } |
| |
| // void setGeometry(QRectF const& rect) public |
| void tst_QGraphicsLinearLayout::setGeometry() |
| { |
| QFETCH(QRectF, rect); |
| QGraphicsScene scene; |
| QGraphicsView view(&scene); |
| QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
| SubQGraphicsLinearLayout &layout = *(new SubQGraphicsLinearLayout); |
| scene.addItem(widget); |
| widget->setLayout(&layout); |
| widget->setContentsMargins(0, 0, 0, 0); |
| layout.setContentsMargins(0, 0, 0, 0); |
| layout.setMaximumSize(100, 100); |
| view.show(); |
| widget->show(); |
| QApplication::processEvents(); |
| widget->setGeometry(rect); |
| QCOMPARE(layout.geometry(), rect); |
| // see also geometry() |
| delete widget; |
| } |
| |
| class LayoutStyle : public QProxyStyle |
| { |
| public: |
| LayoutStyle(const QString &key) |
| : QProxyStyle(key), |
| horizontalSpacing(-1), verticalSpacing(-1) {} |
| |
| virtual int pixelMetric(QStyle::PixelMetric pm, const QStyleOption *option = 0, const QWidget *widget = 0) const override |
| { |
| if (pm == QStyle::PM_LayoutHorizontalSpacing && horizontalSpacing >= 0) { |
| return horizontalSpacing; |
| } else if (pm == QStyle::PM_LayoutVerticalSpacing && verticalSpacing >= 0) { |
| return verticalSpacing; |
| } |
| return QProxyStyle::pixelMetric(pm, option, widget); |
| } |
| |
| int horizontalSpacing; |
| int verticalSpacing; |
| }; |
| |
| void tst_QGraphicsLinearLayout::defaultSpacing() |
| { |
| QGraphicsScene scene; |
| QGraphicsView view(&scene); |
| LayoutStyle *style = new LayoutStyle(QLatin1String("windows")); |
| style->horizontalSpacing = 5; |
| style->verticalSpacing = 3; |
| LayoutStyle *style2 = new LayoutStyle(QLatin1String("windows")); |
| style2->horizontalSpacing = 25; |
| style2->verticalSpacing = 23; |
| |
| QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
| widget->setStyle(style); |
| |
| // Horizontal layout |
| SubQGraphicsLinearLayout *layout = new SubQGraphicsLinearLayout(Qt::Horizontal); |
| widget->setLayout(layout); |
| Q_ASSERT(widget->style()); |
| scene.addItem(widget); |
| layout->setContentsMargins(0, 0, 0, 0); |
| view.show(); |
| |
| for (int i = 0; i < 2; ++i) { |
| QGraphicsWidget *w = new QGraphicsWidget; |
| layout->addItem(w); |
| } |
| |
| // Horizontal layout |
| qreal styleSpacing = (qreal)style->pixelMetric(QStyle::PM_LayoutHorizontalSpacing); |
| QCOMPARE(styleSpacing, qreal(5)); |
| QCOMPARE(styleSpacing, layout->spacing()); |
| QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize).width(), qreal(105)); |
| style->horizontalSpacing = 15; |
| // If the style method changes return value, the layout must be invalidated by the application |
| layout->invalidate(); |
| styleSpacing = (qreal)style->pixelMetric(QStyle::PM_LayoutHorizontalSpacing); |
| QCOMPARE(styleSpacing, qreal(15)); |
| QCOMPARE(styleSpacing, layout->spacing()); |
| QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize).width(), qreal(115)); |
| widget->setStyle(style2); |
| // If the style itself changes, the layout will pick that up |
| QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize).width(), qreal(125)); |
| QCOMPARE(layout->spacing(), qreal(25)); |
| |
| // Vertical layout |
| widget->setStyle(style); |
| layout->setOrientation(Qt::Vertical); |
| styleSpacing = (qreal)style->pixelMetric(QStyle::PM_LayoutVerticalSpacing); |
| QCOMPARE(styleSpacing, qreal(3)); |
| QCOMPARE(styleSpacing, layout->spacing()); |
| QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize).height(), qreal(103)); |
| style->verticalSpacing = 13; |
| // If the style method changes return value, the layout must be invalidated by the application |
| layout->invalidate(); |
| styleSpacing = (qreal)style->pixelMetric(QStyle::PM_LayoutVerticalSpacing); |
| QCOMPARE(styleSpacing, qreal(13)); |
| QCOMPARE(styleSpacing, layout->spacing()); |
| QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize).height(), qreal(113)); |
| widget->setStyle(style2); |
| // If the style itself changes, the layout will pick that up |
| QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize).height(), qreal(123)); |
| QCOMPARE(layout->spacing(), qreal(23)); |
| |
| |
| delete widget; |
| } |
| |
| void tst_QGraphicsLinearLayout::setSpacing_data() |
| { |
| QTest::addColumn<qreal>("spacing"); |
| QTest::newRow("0") << (qreal)0; |
| QTest::newRow("5") << (qreal)5; |
| QTest::newRow("3.3") << (qreal)3.3; |
| QTest::newRow("-4.3") << (qreal)4.3; |
| } |
| |
| // void setSpacing(qreal spacing) public |
| void tst_QGraphicsLinearLayout::setSpacing() |
| { |
| QFETCH(qreal, spacing); |
| |
| QGraphicsScene scene; |
| QGraphicsView view(&scene); |
| QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
| SubQGraphicsLinearLayout &layout = *(new SubQGraphicsLinearLayout); |
| scene.addItem(widget); |
| widget->setLayout(&layout); |
| layout.setContentsMargins(0, 0, 0, 0); |
| |
| // The remainder of this test is only applicable if the style uses uniform spacing |
| qreal oldSpacing = layout.spacing(); |
| if (oldSpacing != -1) { |
| for (int i = 0; i < 3; ++i) |
| layout.addItem(new QGraphicsWidget); |
| QSizeF oldSizeHint = layout.sizeHint(Qt::PreferredSize); |
| |
| layout.setSpacing(spacing); |
| QCOMPARE(layout.spacing(), spacing); |
| |
| view.show(); |
| widget->show(); |
| QApplication::processEvents(); |
| QSizeF newSizeHint = layout.sizeHint(Qt::PreferredSize); |
| |
| QCOMPARE(oldSizeHint.width() - oldSpacing * 2, newSizeHint.width() - spacing * 2); |
| } |
| delete widget; |
| } |
| |
| void tst_QGraphicsLinearLayout::setItemSpacing_data() |
| { |
| QTest::addColumn<int>("index"); |
| QTest::addColumn<int>("spacing"); |
| |
| QTest::newRow("0 at 0") << 0 << 0; |
| QTest::newRow("10 at 0") << 0 << 10; |
| QTest::newRow("10 at 1") << 1 << 10; |
| QTest::newRow("10 at the end") << 4 << 10; |
| } |
| |
| void tst_QGraphicsLinearLayout::setItemSpacing() |
| { |
| QFETCH(int, index); |
| QFETCH(int, spacing); |
| |
| QGraphicsScene scene; |
| QGraphicsView view(&scene); |
| QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
| SubQGraphicsLinearLayout *layout = new SubQGraphicsLinearLayout; |
| scene.addItem(widget); |
| widget->setLayout(layout); |
| layout->setContentsMargins(0, 0, 0, 0); |
| for (int i = 0; i < 5; ++i) { |
| QGraphicsWidget *w = new QGraphicsWidget; |
| layout->addItem(w); |
| } |
| QSizeF oldSizeHint = layout->sizeHint(Qt::PreferredSize); |
| qreal oldSpacing = 0; |
| if (index < layout->count() - 1) |
| oldSpacing = layout->spacing(); |
| else |
| spacing = 0; |
| |
| layout->setItemSpacing(index, spacing); |
| view.show(); |
| QApplication::processEvents(); |
| QSizeF newSizeHint = layout->sizeHint(Qt::PreferredSize); |
| |
| // The remainder of this test is only applicable if the style uses uniform spacing |
| if (oldSpacing >= 0) { |
| QCOMPARE(newSizeHint.width() - spacing, oldSizeHint.width() - oldSpacing); |
| } |
| delete widget; |
| } |
| |
| void tst_QGraphicsLinearLayout::itemSpacing() |
| { |
| QGraphicsScene scene; |
| QGraphicsView view(&scene); |
| QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
| SubQGraphicsLinearLayout *layout = new SubQGraphicsLinearLayout; |
| scene.addItem(widget); |
| widget->setLayout(layout); |
| layout->setContentsMargins(0, 0, 0, 0); |
| for (int i = 0; i < 5; ++i) { |
| QGraphicsWidget *w = new QGraphicsWidget; |
| layout->addItem(w); |
| } |
| |
| // Check defaults |
| qreal defaultSpacing = layout->spacing(); |
| if (defaultSpacing >= 0) { |
| QCOMPARE(layout->itemSpacing(0), defaultSpacing); |
| } else { |
| // all widgets are the same, so the spacing should be uniform |
| QCOMPARE(layout->itemSpacing(0), layout->itemSpacing(1)); |
| } |
| |
| layout->setItemSpacing(1, 42); |
| QCOMPARE(layout->itemSpacing(1), qreal(42)); |
| |
| // try to unset |
| layout->setItemSpacing(1, -1); |
| QCOMPARE(layout->itemSpacing(1), defaultSpacing); |
| |
| delete widget; |
| } |
| |
| /** |
| * The stretch factors are not applied linearly, but they are used together with both the preferred size, maximum size to form the |
| * internal effective stretch factor. |
| * There is only need to apply stretch factors if the size of the layout is different than the layouts preferred size. |
| * (If the size of the layout is the preferred size, then all items should get their preferred sizes. |
| * However, imagine this use case: |
| * Layout |
| * +----------+----------+----------+ |
| * name | A | B | C | |
| * stretch | 1 | 2 | 3 | |
| * sizehints|[5,10,50] |[5,10,50] |[5,10,50] | |
| * +----------+----------+----------+ |
| * |
| * layout->resize(120, h) |
| * |
| * In QLayout, C would become 50, B would become 50 and A would get 20. When scaling a layout this would give a jerky feeling, since |
| * the item with the highest stretch factor will first resize. When that has reached its maximum the next candidate for stretch will |
| * resize, and finally, item with the lowest stretch factor will resize. |
| * In QGraphicsLinearLayout we try to scale all items so that they all reach their maximum at the same time. This means that |
| * their relative sizes are not proportional to their stretch factors. |
| */ |
| |
| typedef QList<int> IntList; |
| |
| void tst_QGraphicsLinearLayout::setStretchFactor_data() |
| { |
| QTest::addColumn<qreal>("totalSize"); |
| QTest::addColumn<IntList>("stretches"); |
| |
| QTest::newRow(QString("60 [1,2]").toLatin1()) << qreal(60.0) << (IntList() << 1 << 2); |
| QTest::newRow(QString("60 [1,2,3]").toLatin1()) << qreal(60.0) << (IntList() << 1 << 2 << 3); |
| QTest::newRow(QString("120 [1,2,3,6]").toLatin1()) << qreal(120.0) << (IntList() << 1 << 2 << 3 << 6); |
| } |
| |
| // void setStretchFactor(QGraphicsLayoutItem* item, int stretch) public |
| void tst_QGraphicsLinearLayout::setStretchFactor() |
| { |
| QFETCH(qreal, totalSize); |
| QFETCH(IntList, stretches); |
| QGraphicsScene scene; |
| QGraphicsView view(&scene); |
| QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
| SubQGraphicsLinearLayout &layout = *(new SubQGraphicsLinearLayout); |
| scene.addItem(widget); |
| widget->setLayout(&layout); |
| layout.setContentsMargins(0, 0, 0, 0); |
| layout.setSpacing(0.0); |
| widget->setContentsMargins(0, 0, 0, 0); |
| |
| |
| int i; |
| for (i = 0; i < stretches.count(); ++i) { |
| QGraphicsWidget *item = new RectWidget(widget); |
| item->setMinimumSize(5,5); |
| item->setPreferredSize(10,5); |
| item->setMaximumSize(50,5); |
| layout.addItem(item); |
| layout.setStretchFactor(item, stretches.at(i)); |
| } |
| |
| widget->resize(totalSize, 10); |
| QApplication::processEvents(); |
| |
| view.show(); |
| widget->show(); |
| |
| qreal firstStretch = -1; |
| qreal firstExtent = -1.; |
| qreal sumExtent = 0; |
| for (i = 0; i < stretches.count(); ++i) { |
| QGraphicsWidget *item = static_cast<QGraphicsWidget*>(layout.itemAt(i)); |
| qreal extent = item->size().width(); |
| qreal stretch = (qreal)stretches.at(i); |
| if (firstStretch != -1 && firstExtent != -1) { |
| // The resulting widths does not correspond linearly to the stretch factors. |
| if (stretch == firstStretch) |
| QCOMPARE(extent, firstExtent); |
| else if (stretch > firstStretch) |
| QVERIFY(extent > firstExtent); |
| else |
| QVERIFY(extent < firstExtent); |
| } else { |
| firstStretch = (qreal)stretch; |
| firstExtent = extent; |
| } |
| sumExtent+= extent; |
| } |
| QCOMPARE(sumExtent, totalSize); |
| |
| delete widget; |
| } |
| |
| void tst_QGraphicsLinearLayout::testStretch() |
| { |
| QGraphicsScene scene; |
| QGraphicsView *view = new QGraphicsView(&scene); |
| Q_UNUSED(view); |
| QGraphicsWidget *form = new QGraphicsWidget(0, Qt::Window); |
| |
| scene.addItem(form); |
| form->setMinimumSize(600, 600); |
| form->setMaximumSize(600, 600); |
| QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Horizontal, form); |
| QGraphicsWidget *w1 = new RectWidget; |
| w1->setPreferredSize(100,100); |
| w1->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); |
| QGraphicsWidget *w2 = new RectWidget; |
| w2->setPreferredSize(200,200); |
| w2->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); |
| layout->setSpacing(0); |
| layout->setContentsMargins(0, 0, 0, 0); |
| layout->addItem(w1); |
| layout->addStretch(2); |
| layout->addItem(w2); |
| QCOMPARE(layout->count(), 2); |
| QCOMPARE(layout->itemAt(0), w1); |
| QCOMPARE(layout->itemAt(1), w2); |
| layout->activate(); |
| |
| //view->setSceneRect(-50, -50, 800, 800); |
| //view->show(); |
| //QVERIFY(QTest::qWaitForWindowExposed(view)); |
| QCOMPARE(form->geometry().size(), QSizeF(600,600)); |
| QCOMPARE(w1->geometry(), QRectF(0, 0, 100, 100)); |
| QCOMPARE(w2->geometry(), QRectF(400, 0, 200, 200)); |
| } |
| |
| void tst_QGraphicsLinearLayout::defaultStretchFactors_data() |
| { |
| QTest::addColumn<Qt::Orientation>("orientation"); |
| QTest::addColumn<int>("count"); |
| QTest::addColumn<IntList>("preferredSizeHints"); |
| QTest::addColumn<IntList>("stretches"); |
| QTest::addColumn<IntList>("ignoreFlag"); |
| QTest::addColumn<QSizeF>("newSize"); |
| QTest::addColumn<IntList>("expectedSizes"); |
| |
| QTest::newRow("hor") << Qt::Horizontal << 3 |
| << (IntList() << 20 << 40 << 60) |
| << (IntList()) |
| << (IntList()) |
| << QSizeF() |
| << (IntList() << 20 << 40 << 60); |
| |
| QTest::newRow("ver") << Qt::Vertical << 3 |
| << (IntList() << 20 << 40 << 60) |
| << (IntList()) |
| << (IntList()) |
| << QSizeF() |
| << (IntList() << 20 << 40 << 60); |
| |
| QTest::newRow("hor,ignore123") << Qt::Horizontal << 3 |
| << (IntList() << 20 << 40 << 60) |
| << (IntList()) |
| << (IntList() << 1 << 1 << 1) |
| << QSizeF() |
| << (IntList() << 0 << 0 << 0); |
| |
| QTest::newRow("hor,ignore23") << Qt::Horizontal << 3 |
| << (IntList() << 10 << 10 << 10) |
| << (IntList()) |
| << (IntList() << 0 << 1 << 1) |
| << QSizeF(200, 50) |
| << (IntList()); //### stretches are not linear. |
| |
| QTest::newRow("hor,ignore2") << Qt::Horizontal << 3 |
| << (IntList() << 10 << 10 << 10) |
| << (IntList()) |
| << (IntList() << 0 << 1 << 0) |
| << QSizeF() |
| << (IntList() << 10 << 0 << 10); |
| |
| } |
| |
| void tst_QGraphicsLinearLayout::defaultStretchFactors() |
| { |
| QFETCH(Qt::Orientation, orientation); |
| QFETCH(int, count); |
| QFETCH(IntList, preferredSizeHints); |
| QFETCH(IntList, stretches); |
| QFETCH(IntList, ignoreFlag); |
| QFETCH(QSizeF, newSize); |
| QFETCH(IntList, expectedSizes); |
| |
| QGraphicsScene scene; |
| QGraphicsView view(&scene); |
| QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
| SubQGraphicsLinearLayout *layout = new SubQGraphicsLinearLayout(orientation); |
| scene.addItem(widget); |
| widget->setLayout(layout); |
| layout->setContentsMargins(0, 0, 0, 0); |
| layout->setSpacing(0.0); |
| widget->setContentsMargins(0, 0, 0, 0); |
| |
| int i; |
| for (i = 0; i < count; ++i) { |
| RectWidget *item = new RectWidget(widget); |
| layout->addItem(item); |
| if (preferredSizeHints.value(i, -1) >= 0) { |
| item->setSizeHint(Qt::PreferredSize, QSizeF(preferredSizeHints.at(i), preferredSizeHints.at(i))); |
| } |
| if (stretches.value(i, -1) >= 0) { |
| layout->setStretchFactor(item, stretches.at(i)); |
| } |
| if (ignoreFlag.value(i, 0) != 0) { |
| QSizePolicy sp = item->sizePolicy(); |
| if (orientation == Qt::Horizontal) |
| sp.setHorizontalPolicy(QSizePolicy::Policy(sp.horizontalPolicy() | QSizePolicy::IgnoreFlag)); |
| else |
| sp.setVerticalPolicy(QSizePolicy::Policy(sp.verticalPolicy() | QSizePolicy::IgnoreFlag)); |
| item->setSizePolicy(sp); |
| } |
| } |
| |
| QApplication::processEvents(); |
| |
| widget->show(); |
| view.show(); |
| view.resize(400,300); |
| if (newSize.isValid()) |
| widget->resize(newSize); |
| |
| QApplication::processEvents(); |
| for (i = 0; i < count; ++i) { |
| QSizeF itemSize = layout->itemAt(i)->geometry().size(); |
| if (orientation == Qt::Vertical) |
| itemSize.transpose(); |
| if (i < expectedSizes.count()) |
| QCOMPARE(itemSize.width(), qreal(expectedSizes.at(i))); |
| } |
| |
| delete widget; |
| } |
| |
| Q_DECLARE_METATYPE(Qt::SizeHint) |
| void tst_QGraphicsLinearLayout::sizeHint_data() |
| { |
| QTest::addColumn<Qt::SizeHint>("which"); |
| QTest::addColumn<QSizeF>("constraint"); |
| QTest::addColumn<qreal>("spacing"); |
| QTest::addColumn<qreal>("layoutMargin"); |
| QTest::addColumn<QSizeF>("sizeHint"); |
| |
| QTest::newRow("minimumSize") << Qt::MinimumSize << QSizeF() << qreal(0.0) << qreal(0.0) << QSizeF(30, 10); |
| QTest::newRow("preferredSize") << Qt::PreferredSize << QSizeF() << qreal(0.0) << qreal(0.0) << QSizeF(75, 25); |
| QTest::newRow("maximumSize") << Qt::MaximumSize << QSizeF() << qreal(0.0) << qreal(0.0) << QSizeF(150, 50); |
| QTest::newRow("minimumSize, spacing=3") << Qt::MinimumSize << QSizeF() << qreal(3.0) << qreal(0.0) << QSizeF(30 + 2*3, 10); |
| QTest::newRow("minimumSize, spacing=3, layoutMargin=10") << Qt::MinimumSize << QSizeF() << qreal(3.0) << qreal(10.0) << QSizeF(30 + 2*3 + 2*10, 10 + 2*10); |
| QTest::newRow("minimumSize, spacing=0, layoutMargin=7") << Qt::MinimumSize << QSizeF() << qreal(0.0) << qreal(7.0) << QSizeF(30 + 0 + 2*7, 10 + 2*7); |
| } |
| |
| // QSizeF sizeHint(Qt::SizeHint which, QSizeF const& constraint) const public |
| void tst_QGraphicsLinearLayout::sizeHint() |
| { |
| QFETCH(Qt::SizeHint, which); |
| QFETCH(QSizeF, constraint); |
| QFETCH(qreal, spacing); |
| QFETCH(qreal, layoutMargin); |
| QFETCH(QSizeF, sizeHint); |
| |
| QGraphicsScene scene; |
| QGraphicsView view(&scene); |
| QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); |
| SubQGraphicsLinearLayout &layout = *(new SubQGraphicsLinearLayout); |
| scene.addItem(widget); |
| widget->setLayout(&layout); |
| layout.setContentsMargins(layoutMargin, layoutMargin, layoutMargin, layoutMargin); |
| layout.setSpacing(spacing); |
| for (int i = 0; i < 3; ++i) { |
| QGraphicsWidget *item = new QGraphicsWidget(widget); |
| item->setMinimumSize(10, 10); |
| item->setPreferredSize(25, 25); |
| item->setMaximumSize(50, 50); |
| layout.addItem(item); |
| } |
| QApplication::processEvents(); |
| QCOMPARE(layout.sizeHint(which, constraint), sizeHint); |
| delete widget; |
| } |
| |
| void tst_QGraphicsLinearLayout::updateGeometry() |
| { |
| QGraphicsScene scene; |
| QGraphicsView view(&scene); |
| |
| QGraphicsWidget *window = new QGraphicsWidget(0, Qt::Window); |
| QGraphicsWidget *w1 = new QGraphicsWidget(window); |
| w1->setMinimumSize(100, 40); |
| SubQGraphicsLinearLayout *layout = new SubQGraphicsLinearLayout; |
| layout->addItem(w1); |
| scene.addItem(window); |
| window->setLayout(layout); |
| layout->setContentsMargins(0, 0, 0, 0); |
| QCOMPARE(w1->parentLayoutItem(), static_cast<QGraphicsLayoutItem*>(layout)); |
| QCOMPARE(layout->parentLayoutItem(), static_cast<QGraphicsLayoutItem*>(window)); |
| |
| view.show(); |
| QApplication::processEvents(); |
| QCOMPARE(window->size().toSize(), QSize(100, 50)); |
| w1->setMinimumSize(110, 60); |
| QApplication::processEvents(); |
| QCOMPARE(window->size().toSize(), QSize(110, 60)); |
| QApplication::processEvents(); |
| |
| { |
| delete window; |
| window = new QGraphicsWidget(0, Qt::Window); |
| SubQGraphicsLinearLayout *layout2a = new SubQGraphicsLinearLayout; |
| QGraphicsWidget *w1 = new QGraphicsWidget(window); |
| w1->setMinimumSize(110, 50); |
| layout2a->addItem(w1); |
| SubQGraphicsLinearLayout *layout2 = new SubQGraphicsLinearLayout; |
| layout2->addItem(layout2a); |
| layout2->setContentsMargins(1, 1, 1, 1); |
| layout2a->setContentsMargins(1, 1, 1, 1); |
| window->setLayout(layout2); |
| QApplication::processEvents(); |
| QCOMPARE(w1->parentLayoutItem(), static_cast<QGraphicsLayoutItem*>(layout2a)); |
| QCOMPARE(layout2a->parentLayoutItem(), static_cast<QGraphicsLayoutItem*>(layout2)); |
| QCOMPARE(layout2->parentLayoutItem(), static_cast<QGraphicsLayoutItem*>(window)); |
| QCOMPARE(window->size().toSize(), QSize(114, 54)); |
| QApplication::processEvents(); |
| w1->setMinimumSize(120, 60); |
| QApplication::processEvents(); |
| QCOMPARE(window->size().toSize(), QSize(124, 64)); |
| } |
| |
| { |
| delete window; |
| window = new QGraphicsWidget(0, Qt::Window); |
| scene.addItem(window); |
| window->show(); |
| QGraphicsWidget *w1 = new QGraphicsWidget(window); |
| w1->setMinimumSize(100, 50); |
| SubQGraphicsLinearLayout *layout2a = new SubQGraphicsLinearLayout; |
| layout2a->addItem(w1); |
| SubQGraphicsLinearLayout *layout2 = new SubQGraphicsLinearLayout; |
| layout2->addItem(layout2a); |
| layout2a->setContentsMargins(1, 1, 1, 1); |
| window->setLayout(layout2); |
| QApplication::processEvents(); |
| qreal left, top, right, bottom; |
| layout2->getContentsMargins(&left, &top, &right, &bottom); |
| QCOMPARE(window->size().toSize(), QSize(102 +left + right, 52 + top + bottom)); |
| } |
| |
| { |
| delete window; |
| window = new QGraphicsWidget(0, Qt::Window); |
| scene.addItem(window); |
| QGraphicsWidget *w1 = new QGraphicsWidget(window); |
| w1->setMinimumSize(100, 50); |
| window->setLayout(0); |
| SubQGraphicsLinearLayout *layout2a = new SubQGraphicsLinearLayout; |
| layout2a->addItem(w1); |
| SubQGraphicsLinearLayout *layout2 = new SubQGraphicsLinearLayout; |
| layout2->addItem(layout2a); |
| window->resize(200, 80); |
| window->setLayout(layout2); |
| window->show(); |
| QApplication::processEvents(); |
| QCOMPARE(window->size().toSize(), QSize(200, 80)); |
| } |
| |
| } |
| |
| void tst_QGraphicsLinearLayout::layoutDirection() |
| { |
| QGraphicsScene scene; |
| QGraphicsView view(&scene); |
| |
| QGraphicsWidget *window = new QGraphicsWidget(0, Qt::Window); |
| QGraphicsLinearLayout *layout = new QGraphicsLinearLayout; |
| layout->setContentsMargins(1, 2, 3, 4); |
| layout->setSpacing(6); |
| |
| RectWidget *w1 = new RectWidget; |
| w1->setPreferredSize(20, 20); |
| w1->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); |
| layout->addItem(w1); |
| RectWidget *w2 = new RectWidget; |
| w2->setPreferredSize(20, 20); |
| w2->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); |
| layout->addItem(w2); |
| |
| scene.addItem(window); |
| window->setLayout(layout); |
| view.show(); |
| window->resize(50, 20); |
| window->setLayoutDirection(Qt::LeftToRight); |
| QApplication::processEvents(); |
| QCOMPARE(w1->geometry().left(), 1.0); |
| QCOMPARE(w1->geometry().right(), 21.0); |
| QCOMPARE(w2->geometry().left(), 27.0); |
| QCOMPARE(w2->geometry().right(), 47.0); |
| |
| window->setLayoutDirection(Qt::RightToLeft); |
| QApplication::processEvents(); |
| QCOMPARE(w1->geometry().right(), 49.0); |
| QCOMPARE(w1->geometry().left(), 29.0); |
| QCOMPARE(w2->geometry().right(), 23.0); |
| QCOMPARE(w2->geometry().left(), 3.0); |
| |
| delete window; |
| } |
| |
| void tst_QGraphicsLinearLayout::removeLayout() |
| { |
| QGraphicsScene scene; |
| RectWidget *textEdit = new RectWidget; |
| RectWidget *pushButton = new RectWidget; |
| scene.addItem(textEdit); |
| scene.addItem(pushButton); |
| |
| QGraphicsLinearLayout *layout = new QGraphicsLinearLayout; |
| layout->addItem(textEdit); |
| layout->addItem(pushButton); |
| |
| QGraphicsWidget *form = new QGraphicsWidget; |
| form->setLayout(layout); |
| scene.addItem(form); |
| |
| QGraphicsView view(&scene); |
| view.show(); |
| QVERIFY(QTest::qWaitForWindowActive(&view)); |
| |
| QRectF r1 = textEdit->geometry(); |
| QRectF r2 = pushButton->geometry(); |
| form->setLayout(0); |
| //documentation of QGraphicsWidget::setLayout: |
| //If layout is 0, the widget is left without a layout. Existing subwidgets' geometries will remain unaffected. |
| QCOMPARE(textEdit->geometry(), r1); |
| QCOMPARE(pushButton->geometry(), r2); |
| } |
| |
| void tst_QGraphicsLinearLayout::avoidRecursionInInsertItem() |
| { |
| QGraphicsWidget window(0, Qt::Window); |
| QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(&window); |
| QCOMPARE(layout->count(), 0); |
| QTest::ignoreMessage(QtWarningMsg, "QGraphicsLinearLayout::insertItem: cannot insert itself"); |
| layout->insertItem(0, layout); |
| QCOMPARE(layout->count(), 0); |
| } |
| |
| void tst_QGraphicsLinearLayout::styleInfoLeak() |
| { |
| QGraphicsLinearLayout layout; |
| layout.spacing(); |
| } |
| |
| void tst_QGraphicsLinearLayout::task218400_insertStretchCrash() |
| { |
| QGraphicsScene *scene = new QGraphicsScene; |
| QGraphicsWidget *a = scene->addWidget(new QWidget); |
| QGraphicsWidget *b = scene->addWidget(new QWidget); |
| |
| QGraphicsLinearLayout *layout = new QGraphicsLinearLayout; |
| layout->addItem(a); |
| layout->addItem(b); |
| layout->insertStretch(0); // inserts gap in item grid in the layout engine |
| |
| QGraphicsWidget *form = new QGraphicsWidget; |
| form->setLayout(layout); // crash |
| } |
| |
| void tst_QGraphicsLinearLayout::testAlignmentInLargerLayout() |
| { |
| QGraphicsScene *scene = new QGraphicsScene; |
| QGraphicsWidget *form = new QGraphicsWidget; |
| scene->addItem(form); |
| QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical, form); |
| layout->setSpacing(0); |
| layout->setContentsMargins(0,0,0,0); |
| |
| QGraphicsWidget *a = new QGraphicsWidget; |
| a->setMaximumSize(100,100); |
| layout->addItem(a); |
| |
| QCOMPARE(form->maximumSize(), QSizeF(100,100)); |
| QCOMPARE(layout->maximumSize(), QSizeF(100,100)); |
| layout->setMinimumSize(QSizeF(200,200)); |
| layout->setMaximumSize(QSizeF(200,200)); |
| |
| layout->setAlignment(a, Qt::AlignCenter); |
| layout->activate(); |
| QCOMPARE(a->geometry(), QRectF(50,50,100,100)); |
| |
| layout->setAlignment(a, Qt::AlignRight | Qt::AlignBottom); |
| layout->activate(); |
| QCOMPARE(a->geometry(), QRectF(100,100,100,100)); |
| |
| layout->setAlignment(a, Qt::AlignHCenter | Qt::AlignTop); |
| layout->activate(); |
| QCOMPARE(a->geometry(), QRectF(50,0,100,100)); |
| |
| QGraphicsWidget *b = new QGraphicsWidget; |
| b->setMaximumSize(100,100); |
| layout->addItem(b); |
| |
| layout->setAlignment(a, Qt::AlignCenter); |
| layout->setAlignment(b, Qt::AlignCenter); |
| layout->activate(); |
| QCOMPARE(a->geometry(), QRectF(50,0,100,100)); |
| QCOMPARE(b->geometry(), QRectF(50,100,100,100)); |
| |
| layout->setAlignment(a, Qt::AlignRight | Qt::AlignBottom); |
| layout->setAlignment(b, Qt::AlignLeft | Qt::AlignTop); |
| layout->activate(); |
| QCOMPARE(a->geometry(), QRectF(100,0,100,100)); |
| QCOMPARE(b->geometry(), QRectF(0,100,100,100)); |
| } |
| |
| void tst_QGraphicsLinearLayout::testOffByOneInLargerLayout() { |
| QGraphicsScene *scene = new QGraphicsScene; |
| QGraphicsWidget *form = new QGraphicsWidget; |
| scene->addItem(form); |
| QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical, form); |
| layout->setSpacing(0); |
| layout->setContentsMargins(0,0,0,0); |
| |
| QGraphicsWidget *a = new QGraphicsWidget; |
| QGraphicsWidget *b = new QGraphicsWidget; |
| a->setMaximumSize(100,100); |
| b->setMaximumSize(100,100); |
| layout->addItem(a); |
| layout->addItem(b); |
| |
| layout->setAlignment(a, Qt::AlignRight | Qt::AlignBottom); |
| layout->setAlignment(b, Qt::AlignLeft | Qt::AlignTop); |
| layout->setMinimumSize(QSizeF(101,201)); |
| layout->setMaximumSize(QSizeF(101,201)); |
| layout->activate(); |
| QCOMPARE(a->geometry(), QRectF(1,0.5,100,100)); |
| QCOMPARE(b->geometry(), QRectF(0,100.5,100,100)); |
| |
| layout->setMinimumSize(QSizeF(100,200)); |
| layout->setMaximumSize(QSizeF(100,200)); |
| layout->activate(); |
| QCOMPARE(a->geometry(), QRectF(0,0,100,100)); |
| QCOMPARE(b->geometry(), QRectF(0,100,100,100)); |
| |
| layout->setMinimumSize(QSizeF(99,199)); |
| layout->setMaximumSize(QSizeF(99,199)); |
| layout->activate(); |
| QCOMPARE(a->geometry(), QRectF(0,0,99,99.5)); |
| QCOMPARE(b->geometry(), QRectF(0,99.5,99,99.5)); |
| } |
| void tst_QGraphicsLinearLayout::testDefaultAlignment() |
| { |
| QGraphicsWidget *widget = new QGraphicsWidget; |
| QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical, widget); |
| layout->setContentsMargins(0, 0, 0, 0); |
| layout->setSpacing(0); |
| |
| QGraphicsWidget *w = new QGraphicsWidget; |
| w->setMinimumSize(50,50); |
| w->setMaximumSize(50,50); |
| layout->addItem(w); |
| |
| //Default alignment should be to the top-left |
| QCOMPARE(layout->alignment(w), 0); |
| |
| //First, check by forcing the layout to be bigger |
| layout->setMinimumSize(100,100); |
| layout->activate(); |
| QCOMPARE(layout->geometry(), QRectF(0,0,100,100)); |
| QCOMPARE(w->geometry(), QRectF(0,0,50,50)); |
| layout->setMinimumSize(-1,-1); |
| |
| //Second, check by adding a larger item in the column |
| QGraphicsWidget *w2 = new QGraphicsWidget; |
| w2->setMinimumSize(100,100); |
| w2->setMaximumSize(100,100); |
| layout->addItem(w2); |
| layout->activate(); |
| QCOMPARE(layout->geometry(), QRectF(0,0,100,150)); |
| QCOMPARE(w->geometry(), QRectF(0,0,50,50)); |
| QCOMPARE(w2->geometry(), QRectF(0,50,100,100)); |
| } |
| |
| void tst_QGraphicsLinearLayout::combineSizePolicies() |
| { |
| QGraphicsWidget *widget = new QGraphicsWidget; |
| QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Horizontal, widget); |
| layout->setContentsMargins(0, 0, 0, 0); |
| layout->setSpacing(0); |
| |
| QGraphicsWidget *w1 = new QGraphicsWidget; |
| w1->setMaximumSize(200,200); |
| w1->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); |
| layout->addItem(w1); |
| |
| QGraphicsWidget *w2 = new QGraphicsWidget; |
| w2->setPreferredSize(50,50); |
| w2->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); |
| layout->addItem(w2); |
| QCOMPARE(layout->maximumHeight(), qreal(200)); |
| |
| // now remove the fixed vertical size policy, and set instead the maximum height to 50 |
| // this should in effect give the same maximumHeight |
| w2->setMaximumHeight(50); |
| w2->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); |
| QCOMPARE(layout->maximumHeight(), qreal(200)); |
| } |
| |
| void tst_QGraphicsLinearLayout::hiddenItems() |
| { |
| QGraphicsWidget *widget = new QGraphicsWidget; |
| QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Horizontal, widget); |
| layout->setContentsMargins(0, 0, 0, 0); |
| layout->setSpacing(2); |
| |
| RectWidget *w1 = new RectWidget; |
| w1->setPreferredSize(QSizeF(20, 20)); |
| layout->addItem(w1); |
| |
| RectWidget *w2 = new RectWidget; |
| w2->setPreferredSize(QSizeF(20, 20)); |
| layout->addItem(w2); |
| |
| RectWidget *w3 = new RectWidget; |
| w3->setPreferredSize(QSizeF(20, 20)); |
| layout->addItem(w3); |
| |
| QCOMPARE(layout->preferredWidth(), qreal(64)); |
| w2->hide(); |
| QCOMPARE(layout->preferredWidth(), qreal(42)); |
| w2->show(); |
| QCOMPARE(layout->preferredWidth(), qreal(64)); |
| QSizePolicy sp = w2->sizePolicy(); |
| sp.setRetainSizeWhenHidden(true); |
| w2->setSizePolicy(sp); |
| QCOMPARE(layout->preferredWidth(), qreal(64)); |
| w2->hide(); |
| QCOMPARE(layout->preferredWidth(), qreal(64)); |
| sp.setRetainSizeWhenHidden(false); |
| w2->setSizePolicy(sp); |
| QCOMPARE(layout->preferredWidth(), qreal(42)); |
| } |
| |
| QTEST_MAIN(tst_QGraphicsLinearLayout) |
| #include "tst_qgraphicslinearlayout.moc" |
| |