##// END OF EJS Templates
removed mention to Finland and modified temperatures in example to avoid possible copyright issues. Using fictional data now.
removed mention to Finland and modified temperatures in example to avoid possible copyright issues. Using fictional data now.

File last commit:

r1896:232ea264e05e
r1953:19301f21f096
Show More
themewidget.cpp
371 lines | 12.5 KiB | text/x-c | CppLexer
Michal Klocek
Updates chartstheme demo, small refactor
r748 /****************************************************************************
Jani Honkonen
Add/modify license headers
r830 **
** Copyright (C) 2012 Digia Plc
** All rights reserved.
** For any questions to Digia, please use contact form at http://qt.digia.com
**
** This file is part of the Qt Commercial Charts Add-on.
**
** $QT_BEGIN_LICENSE$
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia.
**
** If you have questions regarding the use of this file, please use
** contact form at http://qt.digia.com
** $QT_END_LICENSE$
**
****************************************************************************/
Michal Klocek
Updates chartstheme demo, small refactor
r748
#include "themewidget.h"
#include <QChartView>
#include <QPieSeries>
#include <QPieSlice>
sauimone
renamed barseries files to abstractbarseries
r1586 #include <QAbstractBarSeries>
Michal Klocek
Updates chartstheme demo, small refactor
r748 #include <QPercentBarSeries>
#include <QStackedBarSeries>
sauimone
refactored baranimations
r1673 #include <QBarSeries>
Michal Klocek
Updates chartstheme demo, small refactor
r748 #include <QBarSet>
#include <QLineSeries>
#include <QSplineSeries>
#include <QScatterSeries>
#include <QAreaSeries>
sauimone
legend pos to theme example, legend padding
r803 #include <QLegend>
Michal Klocek
Updates chartstheme demo, small refactor
r748 #include <QGridLayout>
#include <QFormLayout>
#include <QComboBox>
#include <QSpinBox>
#include <QCheckBox>
#include <QGroupBox>
#include <QLabel>
#include <QTime>
Marek Rosa
QBarCategoriesAxis renamed to QBarCategoryAxis
r1809 #include <QBarCategoryAxis>
Michal Klocek
Updates chartstheme demo, small refactor
r748
ThemeWidget::ThemeWidget(QWidget* parent) :
QWidget(parent),
m_listCount(3),
Tero Ahola
Better test data for theme demo
r843 m_valueMax(10),
m_valueCount(7),
Michal Klocek
Updates chartstheme demo, small refactor
r748 m_dataTable(generateRandomData(m_listCount,m_valueMax,m_valueCount)),
m_themeComboBox(createThemeBox()),
Tero Ahola
Removed default theme, now using light as the default
r853 m_antialiasCheckBox(new QCheckBox("Anti-aliasing")),
sauimone
legend pos to theme example, legend padding
r803 m_animatedComboBox(createAnimationBox()),
m_legendComboBox(createLegendBox())
Michal Klocek
Updates chartstheme demo, small refactor
r748 {
connectSignals();
// create layout
QGridLayout* baseLayout = new QGridLayout();
QHBoxLayout *settingsLayout = new QHBoxLayout();
settingsLayout->addWidget(new QLabel("Theme:"));
settingsLayout->addWidget(m_themeComboBox);
settingsLayout->addWidget(new QLabel("Animation:"));
settingsLayout->addWidget(m_animatedComboBox);
Michal Klocek
Refactor qledgend handling...
r855 settingsLayout->addWidget(new QLabel("Legend:"));
sauimone
legend pos to theme example, legend padding
r803 settingsLayout->addWidget(m_legendComboBox);
Michal Klocek
Updates chartstheme demo, small refactor
r748 settingsLayout->addWidget(m_antialiasCheckBox);
settingsLayout->addStretch();
baseLayout->addLayout(settingsLayout, 0, 0, 1, 3);
//create charts
QChartView *chartView;
chartView = new QChartView(createAreaChart());
baseLayout->addWidget(chartView, 1, 0);
m_charts << chartView;
chartView = new QChartView(createBarChart(m_valueCount));
baseLayout->addWidget(chartView, 1, 1);
m_charts << chartView;
chartView = new QChartView(createLineChart());
baseLayout->addWidget(chartView, 1, 2);
m_charts << chartView;
chartView = new QChartView(createPieChart());
chartView->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); // funny things happen if the pie slice labels no not fit the screen...
baseLayout->addWidget(chartView, 2, 0);
m_charts << chartView;
chartView = new QChartView(createSplineChart());
baseLayout->addWidget(chartView, 2, 1);
m_charts << chartView;
Michal Klocek
minor. typo
r754 chartView = new QChartView(createScatterChart());
Michal Klocek
Updates chartstheme demo, small refactor
r748 baseLayout->addWidget(chartView, 2, 2);
m_charts << chartView;
setLayout(baseLayout);
Tero Ahola
Better test data for theme demo
r843
// Set defaults
m_antialiasCheckBox->setChecked(true);
Michal Klocek
Refactor qledgend handling...
r855 updateUI();
Michal Klocek
Updates chartstheme demo, small refactor
r748 }
ThemeWidget::~ThemeWidget()
{
}
void ThemeWidget::connectSignals()
{
connect(m_themeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updateUI()));
connect(m_antialiasCheckBox, SIGNAL(toggled(bool)), this, SLOT(updateUI()));
connect(m_animatedComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updateUI()));
sauimone
legend pos to theme example, legend padding
r803 connect(m_legendComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updateUI()));
Michal Klocek
Updates chartstheme demo, small refactor
r748 }
DataTable ThemeWidget::generateRandomData(int listCount,int valueMax,int valueCount) const
{
DataTable dataTable;
// set seed for random stuff
qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
// generate random data
for (int i(0); i < listCount; i++) {
DataList dataList;
Tero Ahola
Better test data for theme demo
r843 qreal yValue(0);
Michal Klocek
Updates chartstheme demo, small refactor
r748 for (int j(0); j < valueCount; j++) {
Tero Ahola
Better test data for theme demo
r843 yValue = yValue + (qreal) (qrand() % valueMax) / (qreal) valueCount;
QPointF value((j + (qreal) rand() / (qreal) RAND_MAX) * ((qreal) m_valueMax / (qreal) valueCount),
yValue);
Tero Ahola
Theme example sets and slices renamed (shown if legend enabled)
r945 QString label = "Slice " + QString::number(i) + ":" + QString::number(j);
Michal Klocek
Updates chartstheme demo, small refactor
r748 dataList << Data(value, label);
}
dataTable << dataList;
}
return dataTable;
}
QComboBox* ThemeWidget::createThemeBox() const
{
// settings layout
QComboBox* themeComboBox = new QComboBox();
themeComboBox->addItem("Light", QChart::ChartThemeLight);
themeComboBox->addItem("Blue Cerulean", QChart::ChartThemeBlueCerulean);
themeComboBox->addItem("Dark", QChart::ChartThemeDark);
themeComboBox->addItem("Brown Sand", QChart::ChartThemeBrownSand);
themeComboBox->addItem("Blue NCS", QChart::ChartThemeBlueNcs);
Tero Ahola
Added Icy Blue and High Contrast theme
r757 themeComboBox->addItem("High Contrast", QChart::ChartThemeHighContrast);
themeComboBox->addItem("Blue Icy", QChart::ChartThemeBlueIcy);
Michal Klocek
Updates chartstheme demo, small refactor
r748 return themeComboBox;
}
QComboBox* ThemeWidget::createAnimationBox() const
{
// settings layout
QComboBox* animationComboBox = new QComboBox();
animationComboBox->addItem("No Animations", QChart::NoAnimation);
animationComboBox->addItem("GridAxis Animations", QChart::GridAxisAnimations);
animationComboBox->addItem("Series Animations", QChart::SeriesAnimations);
animationComboBox->addItem("All Animations", QChart::AllAnimations);
return animationComboBox;
}
sauimone
legend pos to theme example, legend padding
r803 QComboBox* ThemeWidget::createLegendBox() const
{
QComboBox* legendComboBox = new QComboBox();
Michal Klocek
Refactor qledgend handling...
r855 legendComboBox->addItem("No Legend ", 0);
Tero Ahola
Qml ChartView properties; legend to use Qt alignments
r1357 legendComboBox->addItem("Legend Top", Qt::AlignTop);
legendComboBox->addItem("Legend Bottom", Qt::AlignBottom);
legendComboBox->addItem("Legend Left", Qt::AlignLeft);
legendComboBox->addItem("Legend Right", Qt::AlignRight);
sauimone
legend pos to theme example, legend padding
r803 return legendComboBox;
}
Michal Klocek
Updates chartstheme demo, small refactor
r748 QChart* ThemeWidget::createAreaChart() const
{
QChart *chart = new QChart();
Michal Klocek
Refactors QAxis to QAbstractAxis...
r1541 // chart->axisX()->setNiceNumbersEnabled(true);
// chart->axisY()->setNiceNumbersEnabled(true);
Michal Klocek
Updates chartstheme demo, small refactor
r748 chart->setTitle("Area chart");
Tero Ahola
Better test data for theme demo
r843
// The lower series initialized to zero values
Tero Ahola
Simpler area series in the theme demo
r845 QLineSeries *lowerSeries = 0;
Tero Ahola
Removed key zoom/scroll from QChartView
r958 QString name("Series ");
int nameIndex = 0;
Tero Ahola
Better test data for theme demo
r843 for (int i(0); i < m_dataTable.count(); i++) {
QLineSeries *upperSeries = new QLineSeries(chart);
for (int j(0); j < m_dataTable[i].count(); j++) {
Data data = m_dataTable[i].at(j);
Michal Klocek
Fixes and improvments to series API...
r1057 if (lowerSeries){
const QList<QPointF>& points = lowerSeries->points();
upperSeries->append(QPointF(j, points[i].y() + data.first.y()));
}else
Tero Ahola
Simpler area series in the theme demo
r845 upperSeries->append(QPointF(j, data.first.y()));
Michal Klocek
Updates chartstheme demo, small refactor
r748 }
Tero Ahola
Better test data for theme demo
r843 QAreaSeries *area = new QAreaSeries(upperSeries, lowerSeries);
area->setName(name + QString::number(nameIndex));
nameIndex++;
chart->addSeries(area);
Marek Rosa
Updated chartthemes demo
r1582 chart->createDefaultAxes();
Tero Ahola
Better test data for theme demo
r843 lowerSeries = upperSeries;
Michal Klocek
Updates chartstheme demo, small refactor
r748 }
Tero Ahola
Removed key zoom/scroll from QChartView
r958
Michal Klocek
Updates chartstheme demo, small refactor
r748 return chart;
}
QChart* ThemeWidget::createBarChart(int valueCount) const
{
sauimone
removed warning from chartthemes demo
r1675 Q_UNUSED(valueCount);
Michal Klocek
Updates chartstheme demo, small refactor
r748 QChart* chart = new QChart();
chart->setTitle("Bar chart");
Tero Ahola
Removed key zoom/scroll from QChartView
r958
sauimone
theme widget fix
r1113 QStackedBarSeries* series = new QStackedBarSeries(chart);
Tero Ahola
Better test data for theme demo
r843 for (int i(0); i < m_dataTable.count(); i++) {
Tero Ahola
Theme example sets and slices renamed (shown if legend enabled)
r945 QBarSet *set = new QBarSet("Bar set " + QString::number(i));
Tero Ahola
Better test data for theme demo
r843 foreach (Data data, m_dataTable[i])
*set << data.first.y();
sauimone
Renamed appendBarSet to append, removeBarSet to remove
r1194 series->append(set);
Michal Klocek
Updates chartstheme demo, small refactor
r748 }
Tero Ahola
Better test data for theme demo
r843 chart->addSeries(series);
Michal Klocek
Refactor QChart API...
r1577 chart->createDefaultAxes();
Tero Ahola
Removed key zoom/scroll from QChartView
r958
Michal Klocek
Updates chartstheme demo, small refactor
r748 return chart;
}
QChart* ThemeWidget::createLineChart() const
{
QChart* chart = new QChart();
chart->setTitle("Line chart");
Tero Ahola
Removed key zoom/scroll from QChartView
r958
sauimone
updated theme example. minor fix to legend
r786 QString name("Series ");
int nameIndex = 0;
Michal Klocek
Updates chartstheme demo, small refactor
r748 foreach (DataList list, m_dataTable) {
QLineSeries *series = new QLineSeries(chart);
foreach (Data data, list)
Jani Honkonen
rename functions add() -> append()
r796 series->append(data.first);
sauimone
updated theme example. minor fix to legend
r786 series->setName(name + QString::number(nameIndex));
nameIndex++;
Michal Klocek
Updates chartstheme demo, small refactor
r748 chart->addSeries(series);
}
Michal Klocek
Adds createDefaultAxes logic
r1588 chart->createDefaultAxes();
Tero Ahola
Removed key zoom/scroll from QChartView
r958
Michal Klocek
Updates chartstheme demo, small refactor
r748 return chart;
}
QChart* ThemeWidget::createPieChart() const
{
QChart* chart = new QChart();
chart->setTitle("Pie chart");
Tero Ahola
Removed key zoom/scroll from QChartView
r958
Michal Klocek
Updates chartstheme demo, small refactor
r748 qreal pieSize = 1.0 / m_dataTable.count();
for (int i = 0; i < m_dataTable.count(); i++) {
QPieSeries *series = new QPieSeries(chart);
foreach (Data data, m_dataTable[i]) {
Jani Honkonen
pie: change the order of parameters when creating slices to be more intuitive
r1206 QPieSlice *slice = series->append(data.second, data.first.y());
Michal Klocek
Updates chartstheme demo, small refactor
r748 if (data == m_dataTable[i].first()) {
slice->setLabelVisible();
slice->setExploded();
}
}
qreal hPos = (pieSize / 2) + (i / (qreal) m_dataTable.count());
series->setPieSize(pieSize);
Tero Ahola
QSeries name and QPieSeries properties to QML api
r884 series->setHorizontalPosition(hPos);
series->setVerticalPosition(0.5);
Michal Klocek
Updates chartstheme demo, small refactor
r748 chart->addSeries(series);
}
return chart;
}
QChart* ThemeWidget::createSplineChart() const
{ // spine chart
QChart* chart = new QChart();
chart->setTitle("Spline chart");
sauimone
updated theme example. minor fix to legend
r786 QString name("Series ");
int nameIndex = 0;
Michal Klocek
Updates chartstheme demo, small refactor
r748 foreach (DataList list, m_dataTable) {
QSplineSeries *series = new QSplineSeries(chart);
foreach (Data data, list)
Jani Honkonen
rename functions add() -> append()
r796 series->append(data.first);
sauimone
updated theme example. minor fix to legend
r786 series->setName(name + QString::number(nameIndex));
nameIndex++;
Michal Klocek
Updates chartstheme demo, small refactor
r748 chart->addSeries(series);
}
Michal Klocek
Adds createDefaultAxes logic
r1588 chart->createDefaultAxes();
Michal Klocek
Updates chartstheme demo, small refactor
r748 return chart;
}
QChart* ThemeWidget::createScatterChart() const
{ // scatter chart
QChart* chart = new QChart();
chart->setTitle("Scatter chart");
sauimone
updated theme example. minor fix to legend
r786 QString name("Series ");
int nameIndex = 0;
Michal Klocek
Updates chartstheme demo, small refactor
r748 foreach (DataList list, m_dataTable) {
QScatterSeries *series = new QScatterSeries(chart);
foreach (Data data, list)
Jani Honkonen
rename functions add() -> append()
r796 series->append(data.first);
sauimone
updated theme example. minor fix to legend
r786 series->setName(name + QString::number(nameIndex));
nameIndex++;
Michal Klocek
Updates chartstheme demo, small refactor
r748 chart->addSeries(series);
}
Michal Klocek
Adds createDefaultAxes logic
r1588 chart->createDefaultAxes();
Michal Klocek
Updates chartstheme demo, small refactor
r748 return chart;
}
void ThemeWidget::updateUI()
{
QChart::ChartTheme theme = (QChart::ChartTheme) m_themeComboBox->itemData(m_themeComboBox->currentIndex()).toInt();
if (m_charts.at(0)->chart()->theme() != theme) {
foreach (QChartView *chartView, m_charts)
chartView->chart()->setTheme(theme);
QPalette pal = window()->palette();
if (theme == QChart::ChartThemeLight) {
pal.setColor(QPalette::Window, QRgb(0xf0f0f0));
pal.setColor(QPalette::WindowText, QRgb(0x404044));
Tero Ahola
Added Icy Blue and High Contrast theme
r757 } else if (theme == QChart::ChartThemeDark) {
Michal Klocek
Updates chartstheme demo, small refactor
r748 pal.setColor(QPalette::Window, QRgb(0x121218));
pal.setColor(QPalette::WindowText, QRgb(0xd6d6d6));
Tero Ahola
Added Icy Blue and High Contrast theme
r757 } else if (theme == QChart::ChartThemeBlueCerulean) {
Michal Klocek
Updates chartstheme demo, small refactor
r748 pal.setColor(QPalette::Window, QRgb(0x40434a));
pal.setColor(QPalette::WindowText, QRgb(0xd6d6d6));
Tero Ahola
Added Icy Blue and High Contrast theme
r757 } else if (theme == QChart::ChartThemeBrownSand) {
Michal Klocek
Updates chartstheme demo, small refactor
r748 pal.setColor(QPalette::Window, QRgb(0x9e8965));
pal.setColor(QPalette::WindowText, QRgb(0x404044));
Tero Ahola
Added Icy Blue and High Contrast theme
r757 } else if (theme == QChart::ChartThemeBlueNcs) {
Michal Klocek
Updates chartstheme demo, small refactor
r748 pal.setColor(QPalette::Window, QRgb(0x018bba));
pal.setColor(QPalette::WindowText, QRgb(0x404044));
Tero Ahola
Added Icy Blue and High Contrast theme
r757 } else if (theme == QChart::ChartThemeHighContrast) {
pal.setColor(QPalette::Window, QRgb(0xffab03));
pal.setColor(QPalette::WindowText, QRgb(0x181818));
} else if (theme == QChart::ChartThemeBlueIcy) {
pal.setColor(QPalette::Window, QRgb(0xcee7f0));
pal.setColor(QPalette::WindowText, QRgb(0x404044));
} else {
Michal Klocek
Updates chartstheme demo, small refactor
r748 pal.setColor(QPalette::Window, QRgb(0xf0f0f0));
pal.setColor(QPalette::WindowText, QRgb(0x404044));
}
window()->setPalette(pal);
}
bool checked = m_antialiasCheckBox->isChecked();
foreach (QChartView *chart, m_charts)
chart->setRenderHint(QPainter::Antialiasing, checked);
QChart::AnimationOptions options(m_animatedComboBox->itemData(m_animatedComboBox->currentIndex()).toInt());
if (m_charts.at(0)->chart()->animationOptions() != options) {
foreach (QChartView *chartView, m_charts)
chartView->chart()->setAnimationOptions(options);
}
sauimone
legend pos to theme example, legend padding
r803
Tero Ahola
Qml ChartView properties; legend to use Qt alignments
r1357 Qt::Alignment alignment(m_legendComboBox->itemData(m_legendComboBox->currentIndex()).toInt());
Michal Klocek
Refactor qledgend handling...
r855
if (!alignment) {
Tero Ahola
Added option for disabling legend in chart theme demo
r848 foreach (QChartView *chartView, m_charts) {
Michal Klocek
Refactor qledgend handling...
r855 chartView->chart()->legend()->hide();
Tero Ahola
Added option for disabling legend in chart theme demo
r848 }
Tero Ahola
Removed key zoom/scroll from QChartView
r958 } else {
Tero Ahola
Added option for disabling legend in chart theme demo
r848 foreach (QChartView *chartView, m_charts) {
Jani Honkonen
Spelling fix QLegend::setAlignmnent -> setAlignment
r907 chartView->chart()->legend()->setAlignment(alignment);
Michal Klocek
Refactor qledgend handling...
r855 chartView->chart()->legend()->show();
Tero Ahola
Added option for disabling legend in chart theme demo
r848 }
Tero Ahola
Removed key zoom/scroll from QChartView
r958 }
Michal Klocek
Updates chartstheme demo, small refactor
r748 }