| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the documentation of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:FDL$ |
| ** 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 Free Documentation License Usage |
| ** Alternatively, this file may be used under the terms of the GNU Free |
| ** Documentation License version 1.3 as published by the Free Software |
| ** Foundation and appearing in the file included in the packaging of |
| ** this file. Please review the following information to ensure |
| ** the GNU Free Documentation License version 1.3 requirements |
| ** will be met: https://www.gnu.org/licenses/fdl-1.3.html. |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| /*! |
| \example layouts/flowlayout |
| \title Flow Layout Example |
| \ingroup examples-layout |
| \brief Shows how to arrange widgets for different window sizes. |
| |
| \e{Flow Layout} implements a layout that handles different window sizes. The |
| widget placement changes depending on the width of the application window. |
| |
| \image flowlayout-example.png Screenshot of the Flow Layout example |
| |
| The Flowlayout class mainly uses QLayout and QWidgetItem, while the |
| Window uses QWidget and QLabel. |
| |
| For more information, visit the \l{Layout Management} page. |
| |
| \include examples-run.qdocinc |
| |
| \section1 FlowLayout Class Definition |
| |
| The \c FlowLayout class inherits QLayout. It is a custom layout class |
| that arranges its child widgets horizontally and vertically. |
| |
| \snippet layouts/flowlayout/flowlayout.h 0 |
| |
| We reimplement functions inherited from QLayout. These functions add items to |
| the layout and handle their orientation and geometry. |
| |
| We also declare two private methods, \c doLayout() and \c smartSpacing(). |
| \c doLayout() lays out the layout items, while the \c |
| smartSpacing() function calculates the spacing between them. |
| |
| \section1 FlowLayout Class Implementation |
| |
| We start off by looking at the constructor: |
| |
| \snippet layouts/flowlayout/flowlayout.cpp 1 |
| |
| In the constructor we call \c setContentsMargins() to set the left, top, |
| right and bottom margin. By default, QLayout uses values provided by |
| the current style (see QStyle::PixelMetric). |
| |
| \snippet layouts/flowlayout/flowlayout.cpp 2 |
| |
| In this example we reimplement \c addItem(), which is a pure virtual |
| function. When using \c addItem() the ownership of the layout items is |
| transferred to the layout, and it is therefore the layout's |
| responsibility to delete them. |
| |
| \snippet layouts/flowlayout/flowlayout.cpp 3 |
| |
| \c addItem() is implemented to add items to the layout. |
| |
| \snippet layouts/flowlayout/flowlayout.cpp 4 |
| |
| We implement \c horizontalSpacing() and \c verticalSpacing() to get |
| hold of the spacing between the widgets inside the layout. If the value |
| is less than or equal to 0, this value will be used. If not, |
| \c smartSpacing() will be called to calculate the spacing. |
| |
| \snippet layouts/flowlayout/flowlayout.cpp 5 |
| |
| We then implement \c count() to return the number of items in the |
| layout. To navigate the list of items we use \c itemAt() and |
| takeAt() to remove and return items from the list. If an item is |
| removed, the remaining items will be renumbered. All three |
| functions are pure virtual functions from QLayout. |
| |
| \snippet layouts/flowlayout/flowlayout.cpp 6 |
| |
| \c expandingDirections() returns the \l{Qt::Orientation}s in which the |
| layout can make use of more space than its \c sizeHint(). |
| |
| \snippet layouts/flowlayout/flowlayout.cpp 7 |
| |
| To adjust to widgets of which height is dependent on width, we implement \c |
| heightForWidth(). The function \c hasHeightForWidth() is used to test for this |
| dependency, and \c heightForWidth() passes the width on to \c doLayout() which |
| in turn uses the width as an argument for the layout rect, i.e., the bounds in |
| which the items are laid out. This rect does not include the layout margin(). |
| |
| \snippet layouts/flowlayout/flowlayout.cpp 8 |
| |
| \c setGeometry() is normally used to do the actual layout, i.e., calculate |
| the geometry of the layout's items. In this example, it calls \c doLayout() |
| and passes the layout rect. |
| |
| \c sizeHint() returns the preferred size of the layout and \c minimumSize() |
| returns the minimum size of the layout. |
| |
| \snippet layouts/flowlayout/flowlayout.cpp 9 |
| |
| \c doLayout() handles the layout if \c horizontalSpacing() or \c |
| verticalSpacing() don't return the default value. It uses |
| \c getContentsMargins() to calculate the area available to the |
| layout items. |
| |
| \snippet layouts/flowlayout/flowlayout.cpp 10 |
| |
| It then sets the proper amount of spacing for each widget in the |
| layout, based on the current style. |
| |
| \snippet layouts/flowlayout/flowlayout.cpp 11 |
| |
| The position of each item in the layout is then calculated by |
| adding the items width and the line height to the initial x and y |
| coordinates. This in turn lets us find out whether the next item |
| will fit on the current line or if it must be moved down to the next. |
| We also find the height of the current line based on the widgets height. |
| |
| \snippet layouts/flowlayout/flowlayout.cpp 12 |
| |
| \c smartSpacing() is designed to get the default spacing for either |
| the top-level layouts or the sublayouts. The default spacing for |
| top-level layouts, when the parent is a QWidget, will be determined |
| by querying the style. The default spacing for sublayouts, when |
| the parent is a QLayout, will be determined by querying the spacing |
| of the parent layout. |
| |
| */ |