##// END OF EJS Templates
Remove unnecessary package creation scripts...
Remove unnecessary package creation scripts The package creation scripts are no longer needed as the structure of the module has changed and the packages are now created with general Qt scripts. Change-Id: I83744a2dcc98e7d53f297e27560d365a7b4a1f41 Task-number: QTRD-3219 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@theqtcompany.com>

File last commit:

r2740:377e4516d036
r2741:c0570bb33acb
Show More
mainwindow.cpp
1197 lines | 43.1 KiB | text/x-c | CppLexer
/****************************************************************************
**
** Copyright (C) 2014 Digia Plc
** All rights reserved.
** For any questions to Digia, please use contact form at http://qt.io
**
** This file is part of the Qt Charts module.
**
** Licensees holding valid commercial license for Qt may use this file in
** accordance with the Qt 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.io
**
****************************************************************************/
#include "mainwindow.h"
#include "chartview.h"
#include <QtCharts/QScatterSeries>
#include <QtCharts/QLineSeries>
#include <QtCharts/QSplineSeries>
#include <QtCharts/QAreaSeries>
#include <QtCharts/QBarSeries>
#include <QtCharts/QBarSet>
#include <QtCharts/QValueAxis>
#include <QtCharts/QLogValueAxis>
#include <QtCharts/QDateTimeAxis>
#include <QtCharts/QCategoryAxis>
#include <QtCharts/QPolarChart>
#include <QtCore/QDebug>
#include <QtCore/QtMath>
#include <QtCore/QDateTime>
QT_CHARTS_USE_NAMESPACE
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
m_angularTickCount(9),
m_radialTickCount(11),
m_labelsAngle(0),
m_angularMin(0.0),
m_angularMax(40000.0),
m_radialMin(0.0),
m_radialMax(30000.0),
m_angularShadesVisible(false),
m_radialShadesVisible(false),
m_labelsVisible(true),
m_titleVisible(true),
m_gridVisible(true),
m_arrowVisible(true),
m_angularShadesBrush(new QBrush(Qt::NoBrush)),
m_radialShadesBrush(new QBrush(Qt::NoBrush)),
m_labelBrush(new QBrush(Qt::black)),
m_titleBrush(new QBrush(Qt::black)),
m_backgroundBrush(new QBrush(Qt::white)),
m_plotAreaBackgroundBrush(new QBrush(Qt::NoBrush)),
m_angularShadesPen(new QPen(Qt::NoPen)),
m_radialShadesPen(new QPen(Qt::NoPen)),
m_labelPen(new QPen(Qt::NoPen)),
m_titlePen(new QPen(Qt::NoPen)),
m_gridPen(new QPen(QRgb(0x010101))), // Note: Pure black is default color, so it gets overridden by
m_arrowPen(new QPen(QRgb(0x010101))), // default theme if set to that initially. This is an example of workaround.
m_backgroundPen(new QPen(Qt::NoPen)),
m_plotAreaBackgroundPen(new QPen(Qt::NoPen)),
m_labelFormat(QString("%.2f")),
m_animationOptions(QChart::NoAnimation),
m_angularTitle(QString("Angular Title")),
m_radialTitle(QString("Radial Title")),
m_base(2.0),
m_dateFormat(QString("mm-ss-zzz")),
m_chart(0),
m_angularAxis(0),
m_radialAxis(0),
m_angularAxisMode(AxisModeNone),
m_radialAxisMode(AxisModeNone),
m_moreCategories(false),
m_series1(0),
m_series2(0),
m_series3(0),
m_series4(0),
m_series5(0),
m_series6(0),
m_series7(0)
{
ui->setupUi(this);
ui->angularTicksSpin->setValue(m_angularTickCount);
ui->radialTicksSpin->setValue(m_radialTickCount);
ui->anglesSpin->setValue(m_labelsAngle);
ui->radialMinSpin->setValue(m_radialMin);
ui->radialMaxSpin->setValue(m_radialMax);
ui->angularMinSpin->setValue(m_angularMin);
ui->angularMaxSpin->setValue(m_angularMax);
ui->angularShadesComboBox->setCurrentIndex(0);
ui->radialShadesComboBox->setCurrentIndex(0);
ui->labelFormatEdit->setText(m_labelFormat);
ui->dateFormatEdit->setText(m_dateFormat);
ui->moreCategoriesCheckBox->setChecked(m_moreCategories);
ui->series1checkBox->setChecked(true);
ui->series2checkBox->setChecked(true);
ui->series3checkBox->setChecked(true);
ui->series4checkBox->setChecked(true);
ui->series5checkBox->setChecked(true);
ui->series6checkBox->setChecked(true);
ui->series7checkBox->setChecked(true);
m_currentLabelFont.setFamily(ui->labelFontComboBox->currentFont().family());
m_currentLabelFont.setPixelSize(15);
m_currentTitleFont.setFamily(ui->titleFontComboBox->currentFont().family());
m_currentTitleFont.setPixelSize(30);
ui->labelFontSizeSpin->setValue(m_currentLabelFont.pixelSize());
ui->titleFontSizeSpin->setValue(m_currentTitleFont.pixelSize());
ui->logBaseSpin->setValue(m_base);
initXYValueChart();
setAngularAxis(AxisModeValue);
setRadialAxis(AxisModeValue);
ui->angularAxisComboBox->setCurrentIndex(int(m_angularAxisMode));
ui->radialAxisComboBox->setCurrentIndex(int(m_radialAxisMode));
connect(ui->angularTicksSpin, SIGNAL(valueChanged(int)), this, SLOT(angularTicksChanged(int)));
connect(ui->radialTicksSpin, SIGNAL(valueChanged(int)), this, SLOT(radialTicksChanged(int)));
connect(ui->anglesSpin, SIGNAL(valueChanged(int)), this, SLOT(anglesChanged(int)));
connect(ui->radialMinSpin, SIGNAL(valueChanged(double)), this, SLOT(radialMinChanged(double)));
connect(ui->radialMaxSpin, SIGNAL(valueChanged(double)), this, SLOT(radialMaxChanged(double)));
connect(ui->angularMinSpin, SIGNAL(valueChanged(double)), this, SLOT(angularMinChanged(double)));
connect(ui->angularMaxSpin, SIGNAL(valueChanged(double)), this, SLOT(angularMaxChanged(double)));
connect(ui->angularShadesComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(angularShadesIndexChanged(int)));
connect(ui->radialShadesComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(radialShadesIndexChanged(int)));
connect(ui->animationsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(animationIndexChanged(int)));
connect(ui->labelFormatEdit, SIGNAL(textEdited(QString)), this, SLOT(labelFormatEdited(QString)));
connect(ui->labelFontComboBox, SIGNAL(currentFontChanged(QFont)), this, SLOT(labelFontChanged(QFont)));
connect(ui->labelFontSizeSpin, SIGNAL(valueChanged(int)), this, SLOT(labelFontSizeChanged(int)));
connect(ui->labelComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(labelsIndexChanged(int)));
connect(ui->titleFontComboBox, SIGNAL(currentFontChanged(QFont)), this, SLOT(titleFontChanged(QFont)));
connect(ui->titleFontSizeSpin, SIGNAL(valueChanged(int)), this, SLOT(titleFontSizeChanged(int)));
connect(ui->titleComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(titleIndexChanged(int)));
connect(ui->gridComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(gridIndexChanged(int)));
connect(ui->arrowComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(arrowIndexChanged(int)));
connect(ui->logBaseSpin, SIGNAL(valueChanged(double)), this, SLOT(logBaseChanged(double)));
connect(ui->angularAxisComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(angularAxisIndexChanged(int)));
connect(ui->radialAxisComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(radialAxisIndexChanged(int)));
connect(ui->niceNumbersCheckBox, SIGNAL(clicked()), this, SLOT(niceNumbersChecked()));
connect(ui->dateFormatEdit, SIGNAL(textEdited(QString)), this, SLOT(dateFormatEdited(QString)));
connect(ui->moreCategoriesCheckBox, SIGNAL(clicked()), this, SLOT(moreCategoriesChecked()));
connect(ui->series1checkBox, SIGNAL(clicked()), this, SLOT(series1CheckBoxChecked()));
connect(ui->series2checkBox, SIGNAL(clicked()), this, SLOT(series2CheckBoxChecked()));
connect(ui->series3checkBox, SIGNAL(clicked()), this, SLOT(series3CheckBoxChecked()));
connect(ui->series4checkBox, SIGNAL(clicked()), this, SLOT(series4CheckBoxChecked()));
connect(ui->series5checkBox, SIGNAL(clicked()), this, SLOT(series5CheckBoxChecked()));
connect(ui->series6checkBox, SIGNAL(clicked()), this, SLOT(series6CheckBoxChecked()));
connect(ui->series7checkBox, SIGNAL(clicked()), this, SLOT(series7CheckBoxChecked()));
connect(ui->themeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(themeIndexChanged(int)));
connect(ui->backgroundComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(backgroundIndexChanged(int)));
connect(ui->plotAreaComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(plotAreaIndexChanged(int)));
ui->chartView->setChart(m_chart);
ui->chartView->setRenderHint(QPainter::Antialiasing);
}
MainWindow::~MainWindow()
{
delete ui;
delete m_angularShadesBrush;
delete m_radialShadesBrush;
delete m_angularShadesPen;
delete m_radialShadesPen;
}
void MainWindow::initXYValueChart()
{
qreal seriesAngularMin = 1;
qreal seriesAngularMax = 46000;
qreal seriesRadialMin = 1;
qreal seriesRadialMax = 23500;
qreal radialDimension = seriesRadialMax - seriesRadialMin;
qreal angularDimension = seriesAngularMax - seriesAngularMin;
// Scatter series, points outside min-max ranges should not be drawn
m_series1 = new QScatterSeries();
m_series1->setName("scatter");
qreal scatterCount = 10;
qreal scatterAngularStep = angularDimension / scatterCount;
qreal scatterRadialStep = radialDimension / scatterCount;
for (qreal i = 0.0; i < scatterCount; i++) {
m_series1->append((i * scatterAngularStep) + seriesAngularMin, (i * scatterRadialStep) + seriesRadialMin);
//qDebug() << m_series1->points().last();
}
m_series1->setMarkerSize(10);
*m_series1 << QPointF(50, 50) << QPointF(150, 150) << QPointF(250, 250) << QPointF(350, 350) << QPointF(450, 450);
*m_series1 << QPointF(1050, 0.50) << QPointF(1150, 0.25) << QPointF(1250, 0.12) << QPointF(1350, 0.075) << QPointF(1450, 0.036);
*m_series1 << QPointF(0.50, 2000) << QPointF(0.25, 3500) << QPointF(0.12, 5000) << QPointF(0.075, 6500) << QPointF(0.036, 8000);
// Line series, points outside min-max ranges should not be drawn,
// but lines should be properly interpolated at chart edges
m_series2 = new QLineSeries();
m_series2->setName("line 1");
qreal lineCount = 100;
qreal lineAngularStep = angularDimension / lineCount;
qreal lineRadialStep = radialDimension / lineCount;
for (qreal i = 0.0; i < lineCount; i++) {
m_series2->append((i * lineAngularStep) + seriesAngularMin, (i * lineRadialStep) + seriesRadialMin);
//qDebug() << m_series2->points().last();
}
QPen series2Pen = QPen(Qt::blue, 10);
//series2Pen.setStyle(Qt::DashDotDotLine);
m_series2->setPen(series2Pen);
m_series3 = new QLineSeries();
m_series3->setName("Area upper");
lineCount = 87;
lineAngularStep = angularDimension / lineCount;
lineRadialStep = radialDimension / lineCount;
for (qreal i = 1.0; i <= lineCount; i++) {
m_series3->append((i * lineAngularStep) + seriesAngularMin, (i * lineRadialStep) + seriesRadialMin + 200.0);
//qDebug() << m_series3->points().last();
}
m_series4 = new QLineSeries();
m_series4->setName("Area lower");
lineCount = 89;
lineAngularStep = angularDimension / lineCount;
lineRadialStep = radialDimension / lineCount;
for (qreal i = 1.0; i <= lineCount; i++) {
m_series4->append((i * lineAngularStep) + seriesAngularMin + 100.0, (i * lineRadialStep) + seriesRadialMin + i * 300.0);
//qDebug() << m_series4->points().last();
}
m_series5 = new QAreaSeries();
m_series5->setName("area");
m_series5->setUpperSeries(m_series3);
m_series5->setLowerSeries(m_series4);
m_series5->setOpacity(0.5);
m_series6 = new QSplineSeries();
m_series6->setName("spline");
qreal ad = angularDimension / 20;
qreal rd = radialDimension / 10;
m_series6->append(seriesAngularMin, seriesRadialMin + rd * 2);
m_series6->append(seriesAngularMin + ad, seriesRadialMin + rd * 5);
m_series6->append(seriesAngularMin + ad * 2, seriesRadialMin + rd * 4);
m_series6->append(seriesAngularMin + ad * 3, seriesRadialMin + rd * 9);
m_series6->append(seriesAngularMin + ad * 4, seriesRadialMin + rd * 11);
m_series6->append(seriesAngularMin + ad * 5, seriesRadialMin + rd * 12);
m_series6->append(seriesAngularMin + ad * 6, seriesRadialMin + rd * 9);
m_series6->append(seriesAngularMin + ad * 7, seriesRadialMin + rd * 11);
m_series6->append(seriesAngularMin + ad * 8, seriesRadialMin + rd * 12);
m_series6->append(seriesAngularMin + ad * 9, seriesRadialMin + rd * 6);
m_series6->append(seriesAngularMin + ad * 10, seriesRadialMin + rd * 4);
m_series6->append(seriesAngularMin + ad * 10, seriesRadialMin + rd * 8);
m_series6->append(seriesAngularMin + ad * 11, seriesRadialMin + rd * 9);
m_series6->append(seriesAngularMin + ad * 12, seriesRadialMin + rd * 11);
m_series6->append(seriesAngularMin + ad * 13, seriesRadialMin + rd * 12);
m_series6->append(seriesAngularMin + ad * 14, seriesRadialMin + rd * 6);
m_series6->append(seriesAngularMin + ad * 15, seriesRadialMin + rd * 3);
m_series6->append(seriesAngularMin + ad * 16, seriesRadialMin + rd * 2);
m_series6->append(seriesAngularMin + ad * 17, seriesRadialMin + rd * 6);
m_series6->append(seriesAngularMin + ad * 18, seriesRadialMin + rd * 6);
m_series6->append(seriesAngularMin + ad * 19, seriesRadialMin + rd * 6);
m_series6->append(seriesAngularMin + ad * 20, seriesRadialMin + rd * 6);
m_series6->append(seriesAngularMin + ad * 19, seriesRadialMin + rd * 2);
m_series6->append(seriesAngularMin + ad * 18, seriesRadialMin + rd * 9);
m_series6->append(seriesAngularMin + ad * 17, seriesRadialMin + rd * 7);
m_series6->append(seriesAngularMin + ad * 16, seriesRadialMin + rd * 3);
m_series6->append(seriesAngularMin + ad * 15, seriesRadialMin + rd * 1);
m_series6->append(seriesAngularMin + ad * 14, seriesRadialMin + rd * 7);
m_series6->append(seriesAngularMin + ad * 13, seriesRadialMin + rd * 5);
m_series6->append(seriesAngularMin + ad * 12, seriesRadialMin + rd * 9);
m_series6->append(seriesAngularMin + ad * 11, seriesRadialMin + rd * 1);
m_series6->append(seriesAngularMin + ad * 10, seriesRadialMin + rd * 4);
m_series6->append(seriesAngularMin + ad * 9, seriesRadialMin + rd * 1);
m_series6->append(seriesAngularMin + ad * 8, seriesRadialMin + rd * 2);
m_series6->append(seriesAngularMin + ad * 7, seriesRadialMin + rd * 4);
m_series6->append(seriesAngularMin + ad * 6, seriesRadialMin + rd * 8);
m_series6->append(seriesAngularMin + ad * 5, seriesRadialMin + rd * 12);
m_series6->append(seriesAngularMin + ad * 4, seriesRadialMin + rd * 9);
m_series6->append(seriesAngularMin + ad * 3, seriesRadialMin + rd * 8);
m_series6->append(seriesAngularMin + ad * 2, seriesRadialMin + rd * 7);
m_series6->append(seriesAngularMin + ad, seriesRadialMin + rd * 4);
m_series6->append(seriesAngularMin, seriesRadialMin + rd * 10);
m_series6->setPointsVisible(true);
QPen series6Pen = QPen(Qt::red, 10);
//series6Pen.setStyle(Qt::DashDotDotLine);
m_series6->setPen(series6Pen);
// m_series7 shows points at category intersections
m_series7 = new QScatterSeries();
m_series7->setName("Category check");
m_series7->setMarkerSize(7);
m_series7->setBrush(QColor(Qt::red));
m_series7->setMarkerShape(QScatterSeries::MarkerShapeRectangle);
*m_series7 << QPointF(1000, 1000)
<< QPointF(1000, 2000)
<< QPointF(1000, 4000)
<< QPointF(1000, 9000)
<< QPointF(1000, 14000)
<< QPointF(1000, 16500)
<< QPointF(1000, 19000)
<< QPointF(4000, 1000)
<< QPointF(4000, 2000)
<< QPointF(4000, 4000)
<< QPointF(4000, 9000)
<< QPointF(4000, 14000)
<< QPointF(4000, 16500)
<< QPointF(4000, 19000)
<< QPointF(7000, 1000)
<< QPointF(7000, 2000)
<< QPointF(7000, 4000)
<< QPointF(7000, 9000)
<< QPointF(7000, 14000)
<< QPointF(7000, 16500)
<< QPointF(7000, 19000)
<< QPointF(12000, 1000)
<< QPointF(12000, 2000)
<< QPointF(12000, 4000)
<< QPointF(12000, 9000)
<< QPointF(12000, 14000)
<< QPointF(12000, 16500)
<< QPointF(12000, 19000)
<< QPointF(17000, 1000)
<< QPointF(17000, 2000)
<< QPointF(17000, 4000)
<< QPointF(17000, 9000)
<< QPointF(17000, 14000)
<< QPointF(17000, 16500)
<< QPointF(17000, 19000)
<< QPointF(22000, 1000)
<< QPointF(22000, 2000)
<< QPointF(22000, 4000)
<< QPointF(22000, 9000)
<< QPointF(22000, 14000)
<< QPointF(22000, 16500)
<< QPointF(22000, 19000)
<< QPointF(28000, 1000)
<< QPointF(28000, 2000)
<< QPointF(28000, 4000)
<< QPointF(28000, 9000)
<< QPointF(28000, 14000)
<< QPointF(28000, 16500)
<< QPointF(28000, 19000);
m_chart = new QPolarChart();
m_chart->addSeries(m_series1);
m_chart->addSeries(m_series2);
m_chart->addSeries(m_series3);
m_chart->addSeries(m_series4);
m_chart->addSeries(m_series5);
m_chart->addSeries(m_series6);
m_chart->addSeries(m_series7);
connect(m_series1, SIGNAL(clicked(QPointF)), this, SLOT(seriesClicked(QPointF)));
connect(m_series2, SIGNAL(clicked(QPointF)), this, SLOT(seriesClicked(QPointF)));
connect(m_series3, SIGNAL(clicked(QPointF)), this, SLOT(seriesClicked(QPointF)));
connect(m_series4, SIGNAL(clicked(QPointF)), this, SLOT(seriesClicked(QPointF)));
connect(m_series5, SIGNAL(clicked(QPointF)), this, SLOT(seriesClicked(QPointF)));
connect(m_series6, SIGNAL(clicked(QPointF)), this, SLOT(seriesClicked(QPointF)));
connect(m_series7, SIGNAL(clicked(QPointF)), this, SLOT(seriesClicked(QPointF)));
connect(m_series1, SIGNAL(hovered(QPointF, bool)), this, SLOT(seriesHovered(QPointF, bool)));
connect(m_series2, SIGNAL(hovered(QPointF, bool)), this, SLOT(seriesHovered(QPointF, bool)));
connect(m_series3, SIGNAL(hovered(QPointF, bool)), this, SLOT(seriesHovered(QPointF, bool)));
connect(m_series4, SIGNAL(hovered(QPointF, bool)), this, SLOT(seriesHovered(QPointF, bool)));
connect(m_series5, SIGNAL(hovered(QPointF, bool)), this, SLOT(seriesHovered(QPointF, bool)));
connect(m_series6, SIGNAL(hovered(QPointF, bool)), this, SLOT(seriesHovered(QPointF, bool)));
connect(m_series7, SIGNAL(hovered(QPointF, bool)), this, SLOT(seriesHovered(QPointF, bool)));
m_chart->setTitle("Use arrow keys to scroll and +/- to zoom");
m_chart->setAnimationOptions(m_animationOptions);
//m_chart->legend()->setVisible(false);
m_chart->setAcceptHoverEvents(true);
m_chart->setBackgroundBrush(*m_backgroundBrush);
m_chart->setBackgroundPen(*m_backgroundPen);
m_chart->setPlotAreaBackgroundBrush(*m_plotAreaBackgroundBrush);
m_chart->setPlotAreaBackgroundPen(*m_plotAreaBackgroundPen);
}
void MainWindow::setAngularAxis(MainWindow::AxisMode mode)
{
if (m_angularAxis) {
m_chart->removeAxis(m_angularAxis);
delete m_angularAxis;
m_angularAxis = 0;
}
m_angularAxisMode = mode;
switch (m_angularAxisMode) {
case AxisModeNone:
return;
case AxisModeValue:
m_angularAxis = new QValueAxis();
static_cast<QValueAxis *>(m_angularAxis)->setTickCount(m_angularTickCount);
static_cast<QValueAxis *>(m_angularAxis)->setLabelFormat(m_labelFormat);
break;
case AxisModeLogValue:
m_angularAxis = new QLogValueAxis();
static_cast<QLogValueAxis *>(m_angularAxis)->setBase(m_base);
static_cast<QLogValueAxis *>(m_angularAxis)->setLabelFormat(m_labelFormat);
break;
case AxisModeDateTime:
m_angularAxis = new QDateTimeAxis();
static_cast<QDateTimeAxis *>(m_angularAxis)->setTickCount(m_angularTickCount);
static_cast<QDateTimeAxis *>(m_angularAxis)->setFormat(m_dateFormat);
break;
case AxisModeCategory:
m_angularAxis = new QCategoryAxis();
applyCategories();
break;
default:
qWarning() << "Unsupported AxisMode";
break;
}
m_angularAxis->setLabelsAngle(m_labelsAngle);
m_angularAxis->setLabelsFont(m_currentLabelFont);
m_angularAxis->setLabelsBrush(*m_labelBrush);
m_angularAxis->setLabelsPen(*m_labelPen);
m_angularAxis->setLabelsVisible(m_labelsVisible);
m_angularAxis->setShadesBrush(*m_angularShadesBrush);
m_angularAxis->setShadesPen(*m_angularShadesPen);
m_angularAxis->setShadesVisible(m_angularShadesVisible);
m_angularAxis->setTitleFont(m_currentTitleFont);
m_angularAxis->setTitleBrush(*m_titleBrush);
m_angularAxis->setTitlePen(*m_titlePen);
m_angularAxis->setTitleVisible(m_titleVisible);
m_angularAxis->setTitleText(m_angularTitle);
m_angularAxis->setGridLinePen(*m_gridPen);
m_angularAxis->setGridLineVisible(m_gridVisible);
m_angularAxis->setLinePen(*m_arrowPen);
m_angularAxis->setLineVisible(m_arrowVisible);
m_chart->addAxis(m_angularAxis, QPolarChart::PolarOrientationAngular);
m_series1->attachAxis(m_angularAxis);
m_series2->attachAxis(m_angularAxis);
m_series3->attachAxis(m_angularAxis);
m_series4->attachAxis(m_angularAxis);
m_series5->attachAxis(m_angularAxis);
m_series6->attachAxis(m_angularAxis);
m_series7->attachAxis(m_angularAxis);
applyRanges();
//connect(m_angularAxis, SIGNAL(rangeChanged(qreal, qreal)), this, SLOT(angularRangeChanged(qreal, qreal)));
}
void MainWindow::setRadialAxis(MainWindow::AxisMode mode)
{
if (m_radialAxis) {
m_chart->removeAxis(m_radialAxis);
delete m_radialAxis;
m_radialAxis = 0;
}
m_radialAxisMode = mode;
switch (m_radialAxisMode) {
case AxisModeNone:
return;
case AxisModeValue:
m_radialAxis = new QValueAxis();
static_cast<QValueAxis *>(m_radialAxis)->setTickCount(m_radialTickCount);
static_cast<QValueAxis *>(m_radialAxis)->setLabelFormat(m_labelFormat);
break;
case AxisModeLogValue:
m_radialAxis = new QLogValueAxis();
static_cast<QLogValueAxis *>(m_radialAxis)->setBase(m_base);
static_cast<QLogValueAxis *>(m_radialAxis)->setLabelFormat(m_labelFormat);
break;
case AxisModeDateTime:
m_radialAxis = new QDateTimeAxis();
static_cast<QDateTimeAxis *>(m_radialAxis)->setTickCount(m_radialTickCount);
static_cast<QDateTimeAxis *>(m_radialAxis)->setFormat(m_dateFormat);
break;
case AxisModeCategory:
m_radialAxis = new QCategoryAxis();
applyCategories();
break;
default:
qWarning() << "Unsupported AxisMode";
break;
}
m_radialAxis->setLabelsAngle(m_labelsAngle);
m_radialAxis->setLabelsFont(m_currentLabelFont);
m_radialAxis->setLabelsBrush(*m_labelBrush);
m_radialAxis->setLabelsPen(*m_labelPen);
m_radialAxis->setLabelsVisible(m_labelsVisible);
m_radialAxis->setShadesBrush(*m_radialShadesBrush);
m_radialAxis->setShadesPen(*m_radialShadesPen);
m_radialAxis->setShadesVisible(m_radialShadesVisible);
m_radialAxis->setTitleFont(m_currentTitleFont);
m_radialAxis->setTitleBrush(*m_titleBrush);
m_radialAxis->setTitlePen(*m_titlePen);
m_radialAxis->setTitleVisible(m_titleVisible);
m_radialAxis->setTitleText(m_radialTitle);
m_radialAxis->setGridLinePen(*m_gridPen);
m_radialAxis->setGridLineVisible(m_gridVisible);
m_radialAxis->setLinePen(*m_arrowPen);
m_radialAxis->setLineVisible(m_arrowVisible);
m_chart->addAxis(m_radialAxis, QPolarChart::PolarOrientationRadial);
m_series1->attachAxis(m_radialAxis);
m_series2->attachAxis(m_radialAxis);
m_series3->attachAxis(m_radialAxis);
m_series4->attachAxis(m_radialAxis);
m_series5->attachAxis(m_radialAxis);
m_series6->attachAxis(m_radialAxis);
m_series7->attachAxis(m_radialAxis);
applyRanges();
series1CheckBoxChecked();
series2CheckBoxChecked();
series3CheckBoxChecked();
series4CheckBoxChecked();
series5CheckBoxChecked();
series6CheckBoxChecked();
series7CheckBoxChecked();
//connect(m_radialAxis, SIGNAL(rangeChanged(qreal, qreal)), this, SLOT(radialRangeChanged(qreal, qreal)));
}
void MainWindow::applyRanges()
{
if (ui->niceNumbersCheckBox->isChecked()) {
if (m_angularAxisMode == AxisModeValue) {
static_cast<QValueAxis *>(m_angularAxis)->applyNiceNumbers();
m_angularMin = static_cast<QValueAxis *>(m_angularAxis)->min();
m_angularMax = static_cast<QValueAxis *>(m_angularAxis)->max();
m_angularTickCount = static_cast<QValueAxis *>(m_angularAxis)->tickCount();
}
if (m_radialAxisMode == AxisModeValue) {
static_cast<QValueAxis *>(m_radialAxis)->applyNiceNumbers();
m_radialMin = static_cast<QValueAxis *>(m_radialAxis)->min();
m_radialMax = static_cast<QValueAxis *>(m_radialAxis)->max();
m_radialTickCount = static_cast<QValueAxis *>(m_radialAxis)->tickCount();
}
}
if (m_angularAxis)
m_angularAxis->setRange(m_angularMin, m_angularMax);
if (m_radialAxis)
m_radialAxis->setRange(m_radialMin, m_radialMax);
}
void MainWindow::angularTicksChanged(int value)
{
m_angularTickCount = value;
if (m_angularAxisMode == AxisModeValue)
static_cast<QValueAxis *>(m_angularAxis)->setTickCount(m_angularTickCount);
else if (m_angularAxisMode == AxisModeDateTime)
static_cast<QDateTimeAxis *>(m_angularAxis)->setTickCount(m_angularTickCount);
}
void MainWindow::radialTicksChanged(int value)
{
m_radialTickCount = value;
if (m_radialAxisMode == AxisModeValue)
static_cast<QValueAxis *>(m_radialAxis)->setTickCount(m_radialTickCount);
else if (m_radialAxisMode == AxisModeDateTime)
static_cast<QDateTimeAxis *>(m_radialAxis)->setTickCount(m_radialTickCount);
}
void MainWindow::anglesChanged(int value)
{
m_labelsAngle = value;
m_radialAxis->setLabelsAngle(m_labelsAngle);
m_angularAxis->setLabelsAngle(m_labelsAngle);
}
void MainWindow::angularMinChanged(double value)
{
m_angularMin = value;
if (m_angularAxisMode != AxisModeDateTime) {
m_angularAxis->setMin(m_angularMin);
} else {
QDateTime dateTime;
dateTime.setMSecsSinceEpoch(qint64(m_angularMin));
m_angularAxis->setMin(dateTime);
}
}
void MainWindow::angularMaxChanged(double value)
{
m_angularMax = value;
if (m_angularAxisMode != AxisModeDateTime) {
m_angularAxis->setMax(m_angularMax);
} else {
QDateTime dateTime;
dateTime.setMSecsSinceEpoch(qint64(m_angularMax));
m_angularAxis->setMax(dateTime);
}
}
void MainWindow::radialMinChanged(double value)
{
m_radialMin = value;
if (m_radialAxisMode != AxisModeDateTime) {
m_radialAxis->setMin(m_radialMin);
} else {
QDateTime dateTime;
dateTime.setMSecsSinceEpoch(qint64(m_radialMin));
m_radialAxis->setMin(dateTime);
}
}
void MainWindow::radialMaxChanged(double value)
{
m_radialMax = value;
if (m_radialAxisMode != AxisModeDateTime) {
m_radialAxis->setMax(m_radialMax);
} else {
QDateTime dateTime;
dateTime.setMSecsSinceEpoch(qint64(m_radialMax));
m_radialAxis->setMax(dateTime);
}
}
void MainWindow::angularShadesIndexChanged(int index)
{
delete m_angularShadesBrush;
delete m_angularShadesPen;
switch (index) {
case 0:
m_angularShadesBrush = new QBrush(Qt::NoBrush);
m_angularShadesPen = new QPen(Qt::NoPen);
m_angularShadesVisible = false;
break;
case 1:
m_angularShadesBrush = new QBrush(Qt::lightGray);
m_angularShadesPen = new QPen(Qt::NoPen);
m_angularShadesVisible = true;
break;
case 2:
m_angularShadesBrush = new QBrush(Qt::yellow);
m_angularShadesPen = new QPen(Qt::DotLine);
m_angularShadesPen->setWidth(2);
m_angularShadesVisible = true;
break;
default:
break;
}
m_angularAxis->setShadesBrush(*m_angularShadesBrush);
m_angularAxis->setShadesPen(*m_angularShadesPen);
m_angularAxis->setShadesVisible(m_angularShadesVisible);
}
void MainWindow::radialShadesIndexChanged(int index)
{
delete m_radialShadesBrush;
delete m_radialShadesPen;
switch (index) {
case 0:
m_radialShadesBrush = new QBrush(Qt::NoBrush);
m_radialShadesPen = new QPen(Qt::NoPen);
m_radialShadesVisible = false;
break;
case 1:
m_radialShadesBrush = new QBrush(Qt::green);
m_radialShadesPen = new QPen(Qt::NoPen);
m_radialShadesVisible = true;
break;
case 2:
m_radialShadesBrush = new QBrush(Qt::blue);
m_radialShadesPen = new QPen(Qt::DotLine);
m_radialShadesPen->setWidth(2);
m_radialShadesVisible = true;
break;
default:
break;
}
m_radialAxis->setShadesBrush(*m_radialShadesBrush);
m_radialAxis->setShadesPen(*m_radialShadesPen);
m_radialAxis->setShadesVisible(m_radialShadesVisible);
}
void MainWindow::labelFormatEdited(const QString &text)
{
m_labelFormat = text;
if (m_angularAxisMode == AxisModeValue)
static_cast<QValueAxis *>(m_angularAxis)->setLabelFormat(m_labelFormat);
else if (m_angularAxisMode == AxisModeLogValue)
static_cast<QLogValueAxis *>(m_angularAxis)->setLabelFormat(m_labelFormat);
if (m_radialAxisMode == AxisModeValue)
static_cast<QValueAxis *>(m_radialAxis)->setLabelFormat(m_labelFormat);
else if (m_radialAxisMode == AxisModeLogValue)
static_cast<QLogValueAxis *>(m_radialAxis)->setLabelFormat(m_labelFormat);
}
void MainWindow::labelFontChanged(const QFont &font)
{
m_currentLabelFont = font;
m_currentLabelFont.setPixelSize(ui->labelFontSizeSpin->value());
m_angularAxis->setLabelsFont(m_currentLabelFont);
m_radialAxis->setLabelsFont(m_currentLabelFont);
}
void MainWindow::labelFontSizeChanged(int value)
{
m_currentLabelFont = ui->labelFontComboBox->currentFont();
m_currentLabelFont.setPixelSize(value);
m_angularAxis->setLabelsFont(m_currentLabelFont);
m_radialAxis->setLabelsFont(m_currentLabelFont);
}
void MainWindow::animationIndexChanged(int index)
{
switch (index) {
case 0:
m_animationOptions = QChart::NoAnimation;
break;
case 1:
m_animationOptions = QChart::SeriesAnimations;
break;
case 2:
m_animationOptions = QChart::GridAxisAnimations;
break;
case 3:
m_animationOptions = QChart::AllAnimations;
break;
default:
break;
}
m_chart->setAnimationOptions(m_animationOptions);
}
void MainWindow::labelsIndexChanged(int index)
{
delete m_labelBrush;
delete m_labelPen;
switch (index) {
case 0:
m_labelBrush = new QBrush(Qt::NoBrush);
m_labelPen = new QPen(Qt::NoPen);
m_labelsVisible = false;
break;
case 1:
m_labelBrush = new QBrush(Qt::black);
m_labelPen = new QPen(Qt::NoPen);
m_labelsVisible = true;
break;
case 2:
m_labelBrush = new QBrush(Qt::white);
m_labelPen = new QPen(Qt::blue);
m_labelsVisible = true;
break;
default:
break;
}
m_radialAxis->setLabelsBrush(*m_labelBrush);
m_radialAxis->setLabelsPen(*m_labelPen);
m_radialAxis->setLabelsVisible(m_labelsVisible);
m_angularAxis->setLabelsBrush(*m_labelBrush);
m_angularAxis->setLabelsPen(*m_labelPen);
m_angularAxis->setLabelsVisible(m_labelsVisible);
}
void MainWindow::titleIndexChanged(int index)
{
delete m_titleBrush;
delete m_titlePen;
switch (index) {
case 0:
m_titleBrush = new QBrush(Qt::NoBrush);
m_titlePen = new QPen(Qt::NoPen);
m_titleVisible = false;
m_angularTitle = QString();
m_radialTitle = QString();
break;
case 1:
m_titleBrush = new QBrush(Qt::NoBrush);
m_titlePen = new QPen(Qt::NoPen);
m_titleVisible = true;
m_angularTitle = QString();
m_radialTitle = QString();
break;
case 2:
m_titleBrush = new QBrush(Qt::NoBrush);
m_titlePen = new QPen(Qt::NoPen);
m_titleVisible = false;
m_angularTitle = QString("Invisible Ang. Title!");
m_radialTitle = QString("Invisible Rad. Title!");
break;
case 3:
m_titleBrush = new QBrush(Qt::black);
m_titlePen = new QPen(Qt::NoPen);
m_titleVisible = true;
m_angularTitle = QString("Angular Title");
m_radialTitle = QString("Radial Title");
break;
case 4:
m_titleBrush = new QBrush(Qt::white);
m_titlePen = new QPen(Qt::blue);
m_titleVisible = true;
m_angularTitle = QString("Angular Blue Title");
m_radialTitle = QString("Radial Blue Title");
break;
default:
break;
}
m_radialAxis->setTitleBrush(*m_titleBrush);
m_radialAxis->setTitlePen(*m_titlePen);
m_radialAxis->setTitleVisible(m_titleVisible);
m_radialAxis->setTitleText(m_radialTitle);
m_angularAxis->setTitleBrush(*m_titleBrush);
m_angularAxis->setTitlePen(*m_titlePen);
m_angularAxis->setTitleVisible(m_titleVisible);
m_angularAxis->setTitleText(m_angularTitle);
}
void MainWindow::titleFontChanged(const QFont &font)
{
m_currentTitleFont = font;
m_currentTitleFont.setPixelSize(ui->titleFontSizeSpin->value());
m_angularAxis->setTitleFont(m_currentTitleFont);
m_radialAxis->setTitleFont(m_currentTitleFont);
}
void MainWindow::titleFontSizeChanged(int value)
{
m_currentTitleFont = ui->titleFontComboBox->currentFont();
m_currentTitleFont.setPixelSize(value);
m_angularAxis->setTitleFont(m_currentTitleFont);
m_radialAxis->setTitleFont(m_currentTitleFont);
}
void MainWindow::gridIndexChanged(int index)
{
delete m_gridPen;
switch (index) {
case 0:
m_gridPen = new QPen(Qt::NoPen);
m_gridVisible = false;
break;
case 1:
m_gridPen = new QPen(Qt::black);
m_gridVisible = true;
break;
case 2:
m_gridPen = new QPen(Qt::red);
m_gridPen->setStyle(Qt::DashDotLine);
m_gridPen->setWidth(3);
m_gridVisible = true;
break;
default:
break;
}
m_angularAxis->setGridLinePen(*m_gridPen);
m_angularAxis->setGridLineVisible(m_gridVisible);
m_radialAxis->setGridLinePen(*m_gridPen);
m_radialAxis->setGridLineVisible(m_gridVisible);
}
void MainWindow::arrowIndexChanged(int index)
{
delete m_arrowPen;
switch (index) {
case 0:
m_arrowPen = new QPen(Qt::NoPen);
m_arrowVisible = false;
break;
case 1:
m_arrowPen = new QPen(Qt::black);
m_arrowVisible = true;
break;
case 2:
m_arrowPen = new QPen(Qt::red);
m_arrowPen->setStyle(Qt::DashDotLine);
m_arrowPen->setWidth(3);
m_arrowVisible = true;
break;
default:
break;
}
m_angularAxis->setLinePen(*m_arrowPen);
m_angularAxis->setLineVisible(m_arrowVisible);
m_radialAxis->setLinePen(*m_arrowPen);
m_radialAxis->setLineVisible(m_arrowVisible);
}
void MainWindow::angularRangeChanged(qreal min, qreal max)
{
if (!qFuzzyCompare(qreal(ui->angularMinSpin->value()), min))
ui->angularMinSpin->setValue(min);
if (!qFuzzyCompare(qreal(ui->angularMaxSpin->value()), max))
ui->angularMaxSpin->setValue(max);
}
void MainWindow::radialRangeChanged(qreal min, qreal max)
{
if (!qFuzzyCompare(qreal(ui->radialMinSpin->value()), min))
ui->radialMinSpin->setValue(min);
if (!qFuzzyCompare(qreal(ui->radialMaxSpin->value()), max))
ui->radialMaxSpin->setValue(max);
}
void MainWindow::angularAxisIndexChanged(int index)
{
switch (index) {
case 0:
setAngularAxis(AxisModeNone);
break;
case 1:
setAngularAxis(AxisModeValue);
break;
case 2:
setAngularAxis(AxisModeLogValue);
break;
case 3:
setAngularAxis(AxisModeDateTime);
break;
case 4:
setAngularAxis(AxisModeCategory);
break;
default:
qWarning("Invalid Index!");
}
}
void MainWindow::radialAxisIndexChanged(int index)
{
switch (index) {
case 0:
setRadialAxis(AxisModeNone);
break;
case 1:
setRadialAxis(AxisModeValue);
break;
case 2:
setRadialAxis(AxisModeLogValue);
break;
case 3:
setRadialAxis(AxisModeDateTime);
break;
case 4:
setRadialAxis(AxisModeCategory);
break;
default:
qWarning("Invalid Index!");
}
}
void MainWindow::logBaseChanged(double value)
{
m_base = value;
if (m_angularAxisMode == AxisModeLogValue)
static_cast<QLogValueAxis *>(m_angularAxis)->setBase(m_base);
if (m_radialAxisMode == AxisModeLogValue)
static_cast<QLogValueAxis *>(m_radialAxis)->setBase(m_base);
}
void MainWindow::niceNumbersChecked()
{
if (ui->niceNumbersCheckBox->isChecked())
applyRanges();
}
void MainWindow::dateFormatEdited(const QString &text)
{
m_dateFormat = text;
if (m_angularAxisMode == AxisModeDateTime)
static_cast<QDateTimeAxis *>(m_angularAxis)->setFormat(m_dateFormat);
if (m_radialAxisMode == AxisModeDateTime)
static_cast<QDateTimeAxis *>(m_radialAxis)->setFormat(m_dateFormat);
}
void MainWindow::moreCategoriesChecked()
{
applyCategories();
m_moreCategories = ui->moreCategoriesCheckBox->isChecked();
}
void MainWindow::series1CheckBoxChecked()
{
if (ui->series1checkBox->isChecked())
m_series1->setVisible(true);
else
m_series1->setVisible(false);
}
void MainWindow::series2CheckBoxChecked()
{
if (ui->series2checkBox->isChecked())
m_series2->setVisible(true);
else
m_series2->setVisible(false);
}
void MainWindow::series3CheckBoxChecked()
{
if (ui->series3checkBox->isChecked())
m_series3->setVisible(true);
else
m_series3->setVisible(false);
}
void MainWindow::series4CheckBoxChecked()
{
if (ui->series4checkBox->isChecked())
m_series4->setVisible(true);
else
m_series4->setVisible(false);
}
void MainWindow::series5CheckBoxChecked()
{
if (ui->series5checkBox->isChecked())
m_series5->setVisible(true);
else
m_series5->setVisible(false);
}
void MainWindow::series6CheckBoxChecked()
{
if (ui->series6checkBox->isChecked())
m_series6->setVisible(true);
else
m_series6->setVisible(false);
}
void MainWindow::series7CheckBoxChecked()
{
if (ui->series7checkBox->isChecked())
m_series7->setVisible(true);
else
m_series7->setVisible(false);
}
void MainWindow::themeIndexChanged(int index)
{
m_chart->setTheme(QChart::ChartTheme(index));
}
void MainWindow::seriesHovered(QPointF point, bool state)
{
QAbstractSeries *series = qobject_cast<QAbstractSeries *>(sender());
if (series) {
if (state) {
QString str("'%3' - %1 x %2");
ui->hoverLabel->setText(str.arg(point.x()).arg(point.y()).arg(series->name()));
} else {
ui->hoverLabel->setText("No hover");
}
} else {
qDebug() << "seriesHovered - invalid sender!";
}
}
void MainWindow::seriesClicked(const QPointF &point)
{
QAbstractSeries *series = qobject_cast<QAbstractSeries *>(sender());
if (series) {
QString str("'%3' clicked at: %1 x %2");
m_angularTitle = str.arg(point.x()).arg(point.y()).arg(series->name());
m_angularAxis->setTitleText(m_angularTitle);
} else {
qDebug() << "seriesClicked - invalid sender!";
}
}
void MainWindow::backgroundIndexChanged(int index)
{
delete m_backgroundBrush;
delete m_backgroundPen;
switch (index) {
case 0:
m_backgroundBrush = new QBrush(Qt::white);
m_backgroundPen = new QPen(Qt::NoPen);
break;
case 1:
m_backgroundBrush = new QBrush(Qt::blue);
m_backgroundPen = new QPen(Qt::NoPen);
break;
case 2:
m_backgroundBrush = new QBrush(Qt::yellow);
m_backgroundPen = new QPen(Qt::black, 2);
break;
default:
break;
}
m_chart->setBackgroundBrush(*m_backgroundBrush);
m_chart->setBackgroundPen(*m_backgroundPen);
}
void MainWindow::plotAreaIndexChanged(int index)
{
delete m_plotAreaBackgroundBrush;
delete m_plotAreaBackgroundPen;
switch (index) {
case 0:
m_plotAreaBackgroundBrush = new QBrush(Qt::green);
m_plotAreaBackgroundPen = new QPen(Qt::green);
m_chart->setPlotAreaBackgroundVisible(false);
break;
case 1:
m_plotAreaBackgroundBrush = new QBrush(Qt::magenta);
m_plotAreaBackgroundPen = new QPen(Qt::NoPen);
m_chart->setPlotAreaBackgroundVisible(true);
break;
case 2:
m_plotAreaBackgroundBrush = new QBrush(Qt::lightGray);
m_plotAreaBackgroundPen = new QPen(Qt::red, 6);
m_chart->setPlotAreaBackgroundVisible(true);
break;
default:
break;
}
m_chart->setPlotAreaBackgroundBrush(*m_plotAreaBackgroundBrush);
m_chart->setPlotAreaBackgroundPen(*m_plotAreaBackgroundPen);
}
void MainWindow::applyCategories()
{
// Basic layout is three categories, extended has five
if (m_angularAxisMode == AxisModeCategory) {
QCategoryAxis *angCatAxis = static_cast<QCategoryAxis *>(m_angularAxis);
if (angCatAxis->count() == 0) {
angCatAxis->setStartValue(4000);
angCatAxis->append("Category A", 7000);
angCatAxis->append("Category B", 12000);
angCatAxis->append("Category C", 17000);
}
if (angCatAxis->count() == 3 && ui->moreCategoriesCheckBox->isChecked()) {
angCatAxis->setStartValue(1000);
angCatAxis->replaceLabel("Category A", "Cat A");
angCatAxis->replaceLabel("Category B", "Cat B");
angCatAxis->replaceLabel("Category C", "Cat C");
angCatAxis->append("Cat D", 22000);
angCatAxis->append("Cat E", 28000);
} else if (angCatAxis->count() == 5 && !ui->moreCategoriesCheckBox->isChecked()) {
angCatAxis->setStartValue(4000);
angCatAxis->replaceLabel("Cat A", "Category A");
angCatAxis->replaceLabel("Cat B", "Category B");
angCatAxis->replaceLabel("Cat C", "Category C");
angCatAxis->remove("Cat D");
angCatAxis->remove("Cat E");
}
}
if (m_radialAxisMode == AxisModeCategory) {
QCategoryAxis *radCatAxis = static_cast<QCategoryAxis *>(m_radialAxis);
if (radCatAxis->count() == 0) {
radCatAxis->setStartValue(2000);
radCatAxis->append("Category 1", 4000);
radCatAxis->append("Category 2", 9000);
radCatAxis->append("Category 3", 14000);
}
if (radCatAxis->count() == 3 && ui->moreCategoriesCheckBox->isChecked()) {
radCatAxis->setStartValue(1000);
radCatAxis->replaceLabel("Category 1", "Cat 1");
radCatAxis->replaceLabel("Category 2", "Cat 2");
radCatAxis->replaceLabel("Category 3", "Cat 3");
radCatAxis->append("Cat 4", 16500);
radCatAxis->append("Cat 5", 19000);
} else if (radCatAxis->count() == 5 && !ui->moreCategoriesCheckBox->isChecked()) {
radCatAxis->setStartValue(2000);
radCatAxis->replaceLabel("Cat 1", "Category 1");
radCatAxis->replaceLabel("Cat 2", "Category 2");
radCatAxis->replaceLabel("Cat 3", "Category 3");
radCatAxis->remove("Cat 4");
radCatAxis->remove("Cat 5");
}
}
}