blob: 60815d4838368a85541696d2734e9c55b0a20a3e [file] [log] [blame]
/****************************************************************************
**
** 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 qmlbars
\title Qt Quick 2 Bars Example
\ingroup qtdatavisualization_examples
\brief Using Bars3D in a QML application.
The Qt Quick 2 bars example shows how to make a simple 3D bar graph using Bars3D and Qt
Quick 2.
\image qmlbars-example.png
The interesting thing about this example is switching series and displaying more than one series
at once. We'll concentrate on those and skip explaining the basic Bars3D functionality - for
more detailed QML example documentation, see \l{Qt Quick 2 Scatter Example}.
\include examples-run.qdocinc
\section1 Data
The example data is monthly income and expenses of a fictional company over several years.
The data is defined in a list model in \c Data.qml like this:
\snippet qmlbars/qml/qmlbars/Data.qml 0
\dots
Each data item has three roles: timestamp, income, and expenses. The timestamp value is in
format: \c{<four digit year>-<two digit month>}. Years and months are natural to map to rows and
columns of a bar chart, but we can only show either income or expenses as the value.
Now we need to add the data to the Bars3D graph. We will create two Bar3DSeries inside it,
starting with a series for the income:
\snippet qmlbars/qml/qmlbars/main.qml 3
\dots
The data is attached to the \c itemModel property of the ItemModelBarDataProxy inside the
series. For \c valueRole we simply specify the \c income field, as it contains the value we
want, but getting the years and months is a bit more complicated, since they are both found
in the same field. To extract those values, we specify the \c timestamp field for both
\c rowRole and \c columnRole, and additionally specify a search pattern and a replace rule
for those roles to extract the correct portion of the field contents for each role.
The search pattern is a normal JavaScript regular expression and the replace rule specifies
what the field content that matches the regular expression is replaced with.
In this case we want to replace the entire field content with just the year or the month,
which is the first captured substring for both rows and columns.
For more information how the replace using regular expressions works, see
QString::replace(const QRegExp &rx, const QString &after) function documentation.
The \c multiMatchBehavior property specifies what to do in case multiple item model items match
the same row/column combination. In this case we want to add their values together.
This property has no effect when we are showing values for each month, as there are no
duplicate months in our item model, but it becomes relevant later when we want to show
the yearly totals.
Then we add another series for the expenses:
\snippet qmlbars/qml/qmlbars/main.qml 4
\dots
The model contains expenses as negative values, but we want to show them as positive bars, so
that we can easily compare them to income bars. We use \c valueRolePattern to remove the minus
sign to achieve this. No replacement string needs to be specified as the default replacement
is an empty string.
We use the \c visible property of the series to hide the second series for now.
\section1 Custom Axis Labels
One interesting tidbit about axes is that we redefine the category labels for column axis in
\c Axes.qml. This is done because the data contains numbers for months, which we don't want
to use for our column labels:
\snippet qmlbars/qml/qmlbars/Axes.qml 0
We also set automatic axis label rotation to make axis labels more readable at low camera
angles.
\section1 Switching Series
In the \c main.qml, we set up the graph and various UI elements. There are three interesting
code blocks we want to highlight here. The first one shows how to change the
visualized data between income, expenses, and both, by simply changing visibility of the two
series:
\snippet qmlbars/qml/qmlbars/main.qml 0
The axis label format and item selection label formats are tweaked to get the negative sign
showing properly for expenses, which were actually resolved as positive values.
The second interesting block is where we change the visualized data by adjusting the proxy
propertes:
\snippet qmlbars/qml/qmlbars/main.qml 1
To show yearly totals, we need to combine the twelve months of each year into a single bar.
We achieve this by specifying a \c columnRolePattern that matches all model items. That way
the data proxy will only have a single column. The cumulative \c multiMatchBehavior we
specified earlier for the proxy becomes relevant now, causing the values of all twelve months
of each year to be added up into a single bar.
To show just a subset of years, we set \c autoRowCategories to false on the
ItemModelBarDataProxy item and define the row categories explicitly. This way, only the items
in specified row categories are visualized.
The third interesting block shows how to get the row and column index of an item if you know the
row and column values by using ItemModelBarDataProxy methods \c rowCategoryIndex() and \c columnCategoryIndex():
\snippet qmlbars/qml/qmlbars/main.qml 2
*/