aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/doc/src/concepts/layouts/qtquicklayouts-overview.qdoc
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick/doc/src/concepts/layouts/qtquicklayouts-overview.qdoc')
-rw-r--r--src/quick/doc/src/concepts/layouts/qtquicklayouts-overview.qdoc323
1 files changed, 190 insertions, 133 deletions
diff --git a/src/quick/doc/src/concepts/layouts/qtquicklayouts-overview.qdoc b/src/quick/doc/src/concepts/layouts/qtquicklayouts-overview.qdoc
index 369c2f4444..6173e78f6d 100644
--- a/src/quick/doc/src/concepts/layouts/qtquicklayouts-overview.qdoc
+++ b/src/quick/doc/src/concepts/layouts/qtquicklayouts-overview.qdoc
@@ -1,117 +1,187 @@
-/****************************************************************************
-**
-** 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$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page qtquicklayouts-overview.html
\title Qt Quick Layouts Overview
\brief A set of APIs for arranging QML items in a user interface.
- Qt Quick Layouts are items that are used to arrange items in a user interface. Since Qt Quick
- Layouts also resize their items, they are well suited for resizable user interfaces.
+ Use Qt Quick Layouts to arrange items in a user interface. Qt Quick Layouts
+ resize their items, which makes them well suited for resizable user
+ interfaces.
- \section1 Getting Started
+ \section1 Key features
- The QML types can be imported into your application using the following import statement in your \c {.qml} file.
-
- \qml
- import QtQuick.Layouts
- \endqml
-
- \section1 Key Features
-
-
- Some of the key features are:
+ Some of the key features of Qt Quick Layouts are:
\list
- \li \l{Layout::alignment}{Alignment} of items can be specified with the
- \l{Layout::alignment}{Layout.alignment} property
- \li \l{Layout::fillWidth}{Resizable items} can be specified with the
- \l{Layout::fillWidth}{Layout.fillWidth} and \l{Layout::fillHeight}{Layout.fillHeight}
- properties.
- \li \l{Size constraints} can be specified with
+ \li \l{Layout::alignment}{Align} items with the
+ \l{Layout::alignment}{Layout.alignment} property.
+ \li Specify \l{Layout::fillWidth}{resizable items} with the
+ \l{Layout::fillWidth}{Layout.fillWidth} and
+ \l{Layout::fillHeight}{Layout.fillHeight} properties.
+ \li Set \l{Size constraints}{size constraints} with the
\l{Layout::minimumWidth}{Layout.minimumWidth},
\l{Layout::preferredWidth}{Layout.preferredWidth}, and
- \l{Layout::maximumWidth}{Layout.maximumWidth} properties ("Width" can be replaced
- with "Height" for specifying similar constraints to the height).
- \li \l{RowLayout::spacing}{Spacings} can be specified with \l{RowLayout::spacing}{spacing},
- \l{GridLayout::rowSpacing}{rowSpacing} or \l{GridLayout::columnSpacing}{columnSpacing}
+ \l{Layout::maximumWidth}{Layout.maximumWidth} properties -- "Width"
+ can be replaced with "Height" for specifying similar constraints to
+ the height.
+ \li You can specify \l {RowLayout::spacing}{spacing} with
+ \l{RowLayout::spacing}{spacing},
+ \l{GridLayout::rowSpacing}{rowSpacing},
+ or \l{GridLayout::columnSpacing}{columnSpacing}.
+ \li Stretch items both horizontally and vertically with
+ \l{Layout::horizontalStretchFactor}{stretch factors}.
\endlist
- In addition to the above features, GridLayout adds these features:
+ In addition, GridLayout adds these features:
\list
- \li \l{Layout::row}{Grid coordinates} can be specified with the \l{Layout::row}{Layout.row} and
- \l{Layout::column}{Layout.column} properties.
- \li \l{GridLayout::flow}{Automatic grid coordinates} used together with the
- \l{GridLayout::flow}{flow}, \l{GridLayout::rows}{rows}, and
- \l{GridLayout::columns}{columns} properties.
- \li \l{Layout::columnSpan}{Spans} across rows or columns can be specified with the
- \l{Layout::rowSpan}{Layout.rowSpan} and \l{Layout::columnSpan}{Layout.columnSpan}
+ \li \l{Layout::row}{Grid coordinates}, controlled by the
+ \l{Layout::row}{Layout.row} and \l{Layout::column}{Layout.column}
properties.
+ \li \l{GridLayout::flow}{Automatic grid coordinates} used together with
+ the \l{GridLayout::flow}{flow}, \l{GridLayout::rows}{rows}, and
+ \l{GridLayout::columns}{columns} properties.
+ \li \l{Layout::columnSpan}{Spans} across rows or columns, that you can
+ specify with the \l{Layout::rowSpan}{Layout.rowSpan} and
+ \l{Layout::columnSpan}{Layout.columnSpan} properties.
\endlist
+ \section1 Getting started
+
+ To get started using Qt Quick Layouts, import the QML types into your
+ application with the following import statement in your \c {.qml} file:
+
+ \qml
+ import QtQuick.Layouts
+ \endqml
+
+ The next step is to create a \l {A simple layout}{simple layout}. You can
+ also study the \l {Qt Quick Layouts - Basic Example}.
+
+ \section2 A simple layout
- \section1 A Simple Layout
+ The intention of using a layout is to rearrange its children whenever the
+ layout changes size. This means the application must ensure that the layout
+ gets resized. In the following snippet, the \e RowLayout ensures that by
+ specifying \c{anchors.fill: parent}. However, you can also achieve this by
+ other means, such as specifying the \l{Item::width}{width} and
+ \l{Item::height}{height} properties. In the same snippet, the \e {orange
+ Rectangle} has a fixed size of \e 100 by \e 150 pixels, and the \e {plum
+ Rectangle} will expand to occupy all the space it gets allocated.
\snippet qml/layout-simple.qml 1
+ \target simple-layout-snippet
- As the intention of using a layout is to rearrange its children whenever the layout changes
- size, the application should make sure that the layout gets resized. In the above snippet the
- RowLayout ensures that by specifying \c{anchors.fill: parent}. However, it can also be by other
- means, such as directly specifying \l{Item::width}{width} and \l{Item::height}{height}
- properties. In the same snippet, the \c azure Rectangle has a fixed size of \c{(100, 150)}
- pixels, and the \c plum Rectangle will expand to occupy all the space it gets allocated.
+ Layouts are responsible for their children's geometry.
+ This includes properties such as \l{Item::width}{width},
+ \l{Item::height}{height}, \l{Item::x}{x}, \l{Item::y}{y},
+ \l{Item::anchors}{anchors}), etc.
- \note A layout is responsible for its children's geometry. You should
- therefore not specify \l{Item::width}{width}, \l{Item::height}{height}, \l{Item::x}{x},
- \l{Item::y}{y} or any other properties that might influence those properties (such as
- \l{Item::anchors}{anchors}) on those items. Otherwise there would be a conflict of interest,
- and the result is undefined. This is also the case if the child item is a layout. Therefore,
- only layouts with no parent layout can have \c{anchors.fill: parent}.
+ \important Don't specify properties that influence the geometry of child
+ items in your application. Setting these properties on a child item causes
+ a conflict of interest, and the result is undefined. This also applies when
+ the child item is a layout. Therefore, only layouts with no parent layout
+ can have \c{anchors.fill: parent}.
- All items in the layout will have 6 pixels of spacing between them:
+ \section3 Spacing
+ As seen in the \l {simple-layout-snippet}{previous snippet}, the \e spacing
+ for the \e RowLayout is set to \e 6. This ensures that all items in the
+ layout have 6 pixels of spacing between them:
\snippet qml/layout-simple.qml spacing
+ If you omit specifying a spacing value, the layout will use a default of
+ \e 5 pixels. The spacing, as well as the \e implicitWidth of any children,
+ contributes to the \e implicitWidth of the layout. This is important to
+ keep in mind if you rely on default behavior, as it may impact your layout
+ design. For example, the two \e {ColumnLayout}s both set
+ \e {Layout.fillWidth: true} in the following snippet. It's natural to think
+ that they would both get the same width. However, because of the default 5
+ pixel spacing between the items in the inner \e RowLayout, the
+ \e implicitWidth of the first \e ColumnLayout becomes larger, leaving less
+ room for the second one. For example:
- \section2 Size Constraints
+ \snippet qml/layout_with_default_spacing.qml layout-with-default-spacing
+
+ This snippet will produce a layout that looks like this:
+
+ \image layout-with-default-spacing.png "A QML layout with default spacing"
+
+ To ensure equal size of these two columns, you can either
+ \list a
+ \li set the spacing of the \e RowLayout to \c 0, or
+ \li set \e preferredWidth to equal values on both \e {ColumnLayout}s.
+ \endlist
+
+ \section2 Specifying preferred size
+ For each item, the effective preferred size may come from one of several
+ candidate properties. For determining the effective preferred size, an item
+ queries these candidate properties in the following order, and will use the
+ first candidate with a valid width or height.
+
+ \table
+ \header
+ \li Candidate properties
+ \li Description
+ \row
+ \li \l{Layout::preferredWidth}{Layout.preferredWidth} or
+ \l{Layout::preferredHeight}{Layout.preferredHeight}
+ \li These properties are supposed to be modified by the application if
+ the default implicit size does not give the optimal arrangement.
+ \row
+ \li \l{Item::implicitWidth}{implicitWidth} or
+ \l{Item::implicitHeight}{implicitHeight}.
+ \li These properties are supposed to be supplied by each item to give a
+ meaningful ideal size. For example, the size needed to display all
+ the contents of a \l Text type. An implicit width or height of \c 0
+ is interpreted as invalid.
+ \endtable
+
+ An item can specify \l{Layout::preferredWidth}{Layout.preferredWidth}
+ without having to specify
+ \l{Layout::preferredHeight}{Layout.preferredHeight}. In such cases, the
+ effective preferred height is determined from the
+ \l{Item::implicitHeight}{implicitHeight}.
+
+ \note If you don't specify neither preferredWidth nor implicitWidth, the
+ Layout will query \l {Item::}{width} as an ultimate value for the effective
+ preferred width. However, you shouldn't rely on \l {Item::}{width} as a
+ source for the effective preferred width, as that may cause unexpected
+ behavior. For instance, changing the \l{Item::}{width} or
+ \l{Item::height}{height} properties won't trigger a layout rearrangement,
+ or the layout might use the actual width and height -- not the width and
+ height specified in your QML file -- when forced to do a full rebuild.
+
+ \section2 Size constraints
Since an item can be resized by its layout, the layout needs to know the
\l{Layout::minimumWidth}{minimum}, \l{Layout::preferredWidth}{preferred},
- and \l{Layout::maximumWidth}{maximum} sizes of all items where \l{Layout::fillWidth}{Layout.fillWidth} or
- \l{Layout::fillHeight}{Layout.fillHeight} is set to \c true.
- For instance, the following will produce a layout with two rectangles lying side-by-side that
- stretches horizontally. The azure rectangle can be resized from 50x150 to 300x150, and the plum
- rectangle can be resized from 100x100 to ∞x100.
+ and \l{Layout::maximumWidth}{maximum} sizes of all items where
+ \l{Layout::fillWidth}{Layout.fillWidth} or
+ \l{Layout::fillHeight}{Layout.fillHeight} is set to \e true.
+
+ The \l{Layout::preferredWidth}{preferred} width and height is the \e actual
+ width and height of an item, if the layout is not bound to a specific size
+ itself. If the layout is set to a specific size, it distributes additional
+ space based on the ratio of preferred sizes of its items, while taking
+ minimum and maximum sizes into account. The preferred and implicit sizes
+ act as ratios and weights when all items set \e fillWidth and
+ \e fillHeight.
+
+ For instance, the following produces a layout with two rectangles lying
+ side-by-side that stretches horizontally. The \e {orange Rectangle} can be
+ resized from 50x150 to 300x150, and the \e {plum Rectangle} can be resized
+ from 100x100 to ∞x100. As long as the minimum and maximum width of each
+ item isn't exceeded, the plum rectangle will have twice the width of the
+ orange one.
\snippet qml/windowconstraints.qml rowlayout
\image rowlayout-minimum.png "RowLayout at its minimum"
- Combining each item's constraints will give these implicit constraints to the layout element:
+ Combining each item's constraints gives these implicit constraints to the
+ layout element:
\table
\header
@@ -131,69 +201,56 @@
\li 150
\endtable
- Thus, the layout cannot be narrower than 156 or be taller or shorter than 150 without breaking
- any of the constraints of its child items.
+ Thus, the layout cannot be narrower than 156, nor can it be taller or
+ shorter than 150, without breaking any of the constraints of its child items.
- \section2 Specifying Preferred Size
- For each item, the effective preferred size may come from one of several candidate properties.
- For determining the effective preferred size, it will query these candidate properties in the
- following order, and use the first candidate with a valid width or height.
-
- \table
- \header
- \li Candidate properties
- \li Description
- \row
- \li \l{Layout::preferredWidth}{Layout.preferredWidth} or
- \l{Layout::preferredHeight}{Layout.preferredHeight}
- \li These properties are supposed to be modified by the application if the default implicit
- size does not give the optimal arrangement.
- \row
- \li \l{Item::implicitWidth}{implicitWidth} or \l{Item::implicitHeight}{implicitHeight}
- \li These properties are supposed to be supplied by each item to give a meaningful ideal size,
- for example the size needed to display all the contents of a \l Text type.
- An implicit width or height of \c 0 is interpreted as invalid.
- \row
- \li \l{Item::width}{width} and \l{Item::height}{height}
- \li If none of the above properties are valid, the layout will resort to the
- \l{Item::width}{width} and \l{Item::height}{height} properties.
- \endtable
-
- An item can specify \l{Layout::preferredWidth}{Layout.preferredWidth} without having to specify
- \l{Layout::preferredHeight}{Layout.preferredHeight}. In this case, the effective preferred
- height will be determined from the \l{Item::implicitHeight}{implicitHeight} (or ultimately
- \l{Item::height}{height}).
-
- \note Resorting to \l{Item::width}{width} or \l{Item::height}{height} properties is only
- provided as a final fallback. If you want to override the preferred size, it is recommended to
- use \l{Layout::preferredWidth}{Layout.preferredWidth} or
- \l{Layout::preferredHeight}{Layout.preferredHeight}. Relying on the \l{Item::width}{width} or
- \l{Item::height}{height} properties for specifying the preferred size might give some
- unexpected behavior. For instance, changing the \l{Item::width}{width} or
- \l{Item::height}{height} properties won't trigger a layout rearrangement. Also, when the layout
- is forced to do a full rebuild it might use the actual width and height, and not the width and
- height specified in the QML file.
-
-
- \section1 Connecting Windows and Layouts
- You can just use normal anchoring concepts to ensure that the layout will follow the window
- resizing.
+ \section1 Connecting windows and layouts
+ You can use normal anchoring concepts to ensure that your layout follows
+ the window resizing.
\snippet qml/windowconstraints.qml anchoring
- The size constraints of layouts can be used to ensure that the window cannot be resized beyond
- the layout constraints. You can take the size constraints from the layout and set these
- constraints on the minimumWidth, minimumHeight, maximumWidth, and maximumHeight of the Window
- element. The following code ensures that the window cannot be resized beyond the constraints of
- the layout:
+ You can rely on the size constraints of layouts to ensure that the window
+ cannot be resized beyond the layout constraints. You can take the size
+ constraints from the layout and set these constraints on the \e minimumWidth,
+ \e minimumHeight, \e maximumWidth, and \e maximumHeight of the
+ \l [Qml]{Window} element. The following code ensures that the window cannot
+ be resized beyond the constraints of the layout:
\snippet qml/windowconstraints.qml bindconstraints
- \note Since layout.Layout.maximumWidth is infinite in this case, we cannot bind that to the
- maximumWidth property of Window, since that is an integer number. We therefore set a fixed
- maximum width to 1000.
+ \note Because \e {layout.Layout.maximumWidth} is infinite in this case, we
+ cannot bind that to the \e maximumWidth property of Window, as that is an
+ integer number. Therefore, the maximum width is set to a fixed value of
+ \c 1000.
- Finally, you usually want the initial size of the window to be the layout's implicit size:
+ Finally, set the initial size of the window to be the layout's implicit
+ size:
\snippet qml/windowconstraints.qml binddefaultsize
+
+ \section1 Spanning and stretching Items
+
+ Use \l {Layout::columnSpan}{spans} in a GridLayout to make child items
+ occupy more than one cell. For example, you may have a GridLayout with six
+ cells across two rows. The top row contains the \e {Item}s item1, item2,
+ and item3. The bottom row contains the \e Item item4, which specifies
+ \e {columnSpan: 3} and \e {alignment: Qt.AlignHCenter}. This places item4
+ in the middle of the three cells that make up the bottom row. The following
+ snippet serves as an example:
+
+ \snippet qml/gridlayout_with_span.qml gridlayout-with-span
+
+ The size of rows and columns are given implicitly by their contents.
+ For example, a Button may impact the width of the column it's in, or the
+ height of the row it's in. This means GridLayout doesn't have uniform
+ distribution. Because of this, you can't use a span to stretch a layout.
+ To manipulate the stretch of an item or layout, use
+ \l {Layout::horizontalStretchFactor}{stretchFactor}s and/or size hints
+ instead.
+
+ \note When setting implicit or preferred sizes, don't bind the respective
+ properties to the width or height of the layout itself or items it depends
+ on for its size calculations, as this can cause cyclic dependencies that
+ are hard to track down.
*/