| /**************************************************************************** |
| ** |
| ** 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 graphicsview/basicgraphicslayouts |
| \title Basic Graphics Layouts Example |
| \ingroup examples-graphicsview-layout |
| \brief Demonstrates how to create basic graphics layout. |
| |
| The Basic Graphics Layouts example shows how to use the layout classes |
| in QGraphicsView: QGraphicsLinearLayout and QGraphicsGridLayout. |
| In addition to that it shows how to write your own custom layout item. |
| |
| \image basicgraphicslayouts-example.png Screenshot of the Basic Layouts Example |
| |
| \section1 Window Class Definition |
| |
| The \c Window class is a subclass of QGraphicsWidget. It has a |
| constructor with a QGraphicsWidget \a parent as its parameter. |
| |
| \snippet graphicsview/basicgraphicslayouts/window.h 0 |
| |
| \section1 Window Class Implementation |
| |
| The constructor of \c Window instantiates a QGraphicsLinearLayout object, |
| \c windowLayout, with vertical orientation. We instantiate another |
| QGraphicsLinearLayout object, \c linear, whose parent is \c windowLayout. |
| Next, we create a \c LayoutItem object, \c item and add it to \c linear |
| with the \l{QGraphicsLinearLayout::}{addItem()} function. We also provide |
| \c item with a \l{QGraphicsLinearLayout::setStretchFactor()} |
| {stretchFactor}. |
| |
| \snippet graphicsview/basicgraphicslayouts/window.cpp 0 |
| |
| We repeat the process: |
| |
| \list |
| \li create a new \c LayoutItem, |
| \li add the item \c linear, and |
| \li provide a stretch factor. |
| \endlist |
| |
| \snippet graphicsview/basicgraphicslayouts/window.cpp 1 |
| |
| We then add \c linear to \c windowLayout, nesting two |
| QGraphicsLinearLayout objects. Apart from the QGraphicsLinearLayout, we |
| also use a QGraphicsGridLayout object, \c grid, which is a 4x3 grid with |
| some cells spanning to other rows. |
| |
| We create seven \c LayoutItem objects and place them into \c grid with |
| the \l{QGraphicsGridLayout::}{addItem()} function as shown in the code |
| snippet below: |
| |
| \snippet graphicsview/basicgraphicslayouts/window.cpp 2 |
| |
| The first item we add to \c grid is placed in the top left cell, |
| spanning four rows. The next two items are placed in the second column, |
| and they span two rows. Each item's \l{QGraphicsWidget::}{maximumHeight()} |
| and \l{QGraphicsWidget::}{minimumHeight()} are set to be equal so that |
| they do not expand vertically. As a result, these items will not |
| fit vertically in their cells. So, we specify that they should be |
| vertically aligned in the center of the cell using Qt::AlignVCenter. |
| |
| Finally, \c grid itself is added to \c windowLayout. Unlike |
| QGridLayout::addItem(), QGraphicsGridLayout::addItem() requires a row |
| and a column for its argument, specifying which cell the item should be |
| positioned in. Also, if the \c rowSpan and \c columnSpan arguments |
| are omitted, they will default to 1. |
| |
| Note that we do not specify a parent for each \c LayoutItem that we |
| construct, as all these items will be added to \c windowLayout. When we |
| add an item to a layout, it will be automatically reparented to the widget |
| on which the layout is installed. |
| |
| \snippet graphicsview/basicgraphicslayouts/window.cpp 3 |
| |
| Now that we have set up \c grid and added it to \c windowLayout, we |
| install \c windowLayout onto the window object using |
| QGraphicsWidget::setLayout() and we set the window title. |
| |
| \section1 LayoutItem Class Definition |
| |
| The \c LayoutItem class is a subclass of QGraphicsLayoutItem and |
| QGraphicsItem. It has a constructor, a destructor, and some required |
| reimplementations. |
| Since it inherits QGraphicsLayoutItem it must reimplement |
| {QGraphicsLayoutItem::setGeometry()}{setGeometry()} and |
| {QGraphicsLayoutItem::sizeHint()}{sizeHint()}. |
| In addition to that it inherits QGraphicsItem, so it must reimplement |
| {QGraphicsItem::boundingRect()}{boundingRect()} and |
| {QGraphicsItem::paint()}{paint()}. |
| |
| \snippet graphicsview/basicgraphicslayouts/layoutitem.h 0 |
| |
| The \c LayoutItem class also has a private instance of QPixmap, \c m_pix. |
| |
| \section1 LayoutItem Class Implementation |
| |
| In \c{LayoutItem}'s constructor, \c m_pix is instantiated and the |
| \c{block.png} image is loaded into it. |
| |
| \snippet graphicsview/basicgraphicslayouts/layoutitem.cpp 0 |
| |
| We use the Q_UNUSED() macro to prevent the compiler from generating |
| warnings regarding unused parameters. |
| |
| \snippet graphicsview/basicgraphicslayouts/layoutitem.cpp 1 |
| |
| The idea behind the \c paint() function is to paint the |
| background rect then paint a rect around the pixmap. |
| |
| \snippet graphicsview/basicgraphicslayouts/layoutitem.cpp 2 |
| |
| The reimplementation of \l{QGraphicsItem::}{boundingRect()} |
| will set the top left corner at (0,0), and the size of it will be |
| the size of the layout items |
| \l{QGraphicsLayoutItem::}{geometry()}. This is the area that |
| we paint within. |
| |
| \snippet graphicsview/basicgraphicslayouts/layoutitem.cpp 3 |
| |
| |
| The reimplementation of \l{QGraphicsLayoutItem::setGeometry()}{setGeometry()} |
| simply calls its baseclass implementation. However, since this will change |
| the boundingRect we must also call |
| \l{QGraphicsItem::prepareGeometryChange()}{prepareGeometryChange()}. |
| Finally, we move the item according to \c geom.topLeft(). |
| |
| \snippet graphicsview/basicgraphicslayouts/layoutitem.cpp 4 |
| |
| |
| Since we don't want the size of the item to be smaller than the pixmap, we |
| must make sure that we return a size hint that is larger than \c m_pix. |
| We also add some extra space around for borders that we will paint later. |
| Alternatively, you could scale the pixmap to prevent the item from |
| becoming smaller than the pixmap. |
| The preferred size is the same as the minimum size hint, while we set |
| maximum to be a large value |
| |
| \snippet graphicsview/basicgraphicslayouts/layoutitem.cpp 5 |
| |
| */ |