diff options
Diffstat (limited to 'examples/datavisualization/graphgallery/rainfalldata.cpp')
-rw-r--r-- | examples/datavisualization/graphgallery/rainfalldata.cpp | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/examples/datavisualization/graphgallery/rainfalldata.cpp b/examples/datavisualization/graphgallery/rainfalldata.cpp new file mode 100644 index 00000000..66a2553a --- /dev/null +++ b/examples/datavisualization/graphgallery/rainfalldata.cpp @@ -0,0 +1,117 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "rainfalldata.h" +#include <QtDataVisualization/q3dscene.h> +#include <QtDataVisualization/q3dcamera.h> +#include <QtDataVisualization/qbar3dseries.h> +#include <QtDataVisualization/q3dtheme.h> +#include <QtCore/qtextstream.h> +#include <QtCore/qfile.h> + +using namespace Qt::StringLiterals; + +RainfallData::RainfallData() +{ + // In data file the months are in numeric format, so create custom list + for (int i = 1; i <= 12; ++i) + m_numericMonths << QString::number(i); + + m_columnCount = m_numericMonths.size(); + + updateYearsList(2010, 2022); + + // Create proxy and series + //! [0] + m_proxy = new VariantBarDataProxy; + m_series = new QBar3DSeries(m_proxy); + //! [0] + + m_series->setItemLabelFormat(u"%.1f mm"_s); + + // Create the axes + m_rowAxis = new QCategory3DAxis(this); + m_colAxis = new QCategory3DAxis(this); + m_valueAxis = new QValue3DAxis(this); + m_rowAxis->setAutoAdjustRange(true); + m_colAxis->setAutoAdjustRange(true); + m_valueAxis->setAutoAdjustRange(true); + + // Set axis labels and titles + QStringList months{"January", "February", "March", "April", + "May", "June", "July", "August", "September", "October", + "November","December"}; + m_rowAxis->setTitle("Year"); + m_colAxis->setTitle("Month"); + m_valueAxis->setTitle("rainfall (mm)"); + m_valueAxis->setSegmentCount(5); + m_rowAxis->setLabels(m_years); + m_colAxis->setLabels(months); + m_rowAxis->setTitleVisible(true); + m_colAxis->setTitleVisible(true); + m_valueAxis->setTitleVisible(true); + + addDataSet(); +} + +RainfallData::~RainfallData() +{ + delete m_mapping; + delete m_dataSet; + delete m_proxy; +} + +void RainfallData::updateYearsList(int start, int end) +{ + m_years.clear(); + + for (int i = start; i <= end; ++i) + m_years << QString::number(i); + + m_rowCount = m_years.size(); +} + +//! [1] +void RainfallData::addDataSet() +{ + // Create a new variant data set and data item list + m_dataSet = new VariantDataSet; + auto *itemList = new VariantDataItemList; + + // Read data from a data file into the data item list + QFile dataFile(":/data/raindata.txt"); + if (dataFile.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream stream(&dataFile); + while (!stream.atEnd()) { + QString line = stream.readLine(); + if (line.startsWith('#')) // Ignore comments + continue; + const auto strList = QStringView{line}.split(',', Qt::SkipEmptyParts); + // Each line has three data items: Year, month, and rainfall value + if (strList.size() < 3) { + qWarning() << "Invalid row read from data:" << line; + continue; + } + // Store year and month as strings, and rainfall value as double + // into a variant data item and add the item to the item list. + auto *newItem = new VariantDataItem; + for (int i = 0; i < 2; ++i) + newItem->append(strList.at(i).trimmed().toString()); + newItem->append(strList.at(2).trimmed().toDouble()); + itemList->append(newItem); + } + } else { + qWarning() << "Unable to open data file:" << dataFile.fileName(); + } + //! [1] + + //! [2] + // Add items to the data set and set it to the proxy + m_dataSet->addItems(itemList); + m_proxy->setDataSet(m_dataSet); + + // Create new mapping for the data and set it to the proxy + m_mapping = new VariantBarDataMapping(0, 1, 2, m_years, m_numericMonths); + m_proxy->setMapping(m_mapping); + //! [2] +} |