##// END OF EJS Templates
enablers for tooltip and floating values, bug fixing, updated examples. tidying up the code
enablers for tooltip and floating values, bug fixing, updated examples. tidying up the code

File last commit:

r296:8254aab7233d
r296:8254aab7233d
Show More
mainwidget.cpp
372 lines | 13.2 KiB | text/x-c | CppLexer
Tero Ahola
New features like chart type to the test app
r5 #include "mainwidget.h"
Tero Ahola
Started to refactor the API to allow integrating different plot types
r19 #include "dataseriedialog.h"
Tero Ahola
Added size factor property to pie
r60 #include "qchartseries.h"
#include "qpieseries.h"
Tero Ahola
Modifying QScatterSeries API
r179 #include "qscatterseries.h"
Michal Klocek
Fix previous broken commit
r145 #include <qlinechartseries.h>
sauimone
Barset and barcategory implememtation. Updated test application
r171 #include <qbarset.h>
#include <qbarcategory.h>
sauimone
Common naming convention for barcharts
r216 #include <qbarchartseries.h>
#include <qstackedbarchartseries.h>
#include <qpercentbarchartseries.h>
Tero Ahola
New features like chart type to the test app
r5 #include <QPushButton>
#include <QComboBox>
#include <QSpinBox>
Tero Ahola
Added auto scaling option to test app
r6 #include <QCheckBox>
Tero Ahola
New features like chart type to the test app
r5 #include <QGridLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QSpacerItem>
#include <QMessageBox>
Tero Ahola
Scatter data point now shown using a picture
r13 #include <cmath>
Tero Ahola
New features like chart type to the test app
r5 #include <QDebug>
sauimone
Added bar chart example
r78 #include <QStandardItemModel>
Tero Ahola
New features like chart type to the test app
r5
Tero Ahola
Renamed to QtCommercialChart
r30 QTCOMMERCIALCHART_USE_NAMESPACE
Tero Ahola
Started to refactor the API to allow integrating different plot types
r19
Tero Ahola
New features like chart type to the test app
r5 MainWidget::MainWidget(QWidget *parent) :
QWidget(parent)
{
Michal Klocek
Removes QChartWidget...
r136 m_chartWidget = new QChartView(this);
m_chartWidget->setRubberBandPolicy(QChartView::HorizonalRubberBand);
Tero Ahola
Theme now affects background, enabled zoom by default in QChartWidget
r77
Tero Ahola
Scaling for scatter series
r111 // Grid layout for the controls for configuring the chart widget
Tero Ahola
Refactored the test app
r110 QGridLayout *grid = new QGridLayout();
Tero Ahola
Started to refactor the API to allow integrating different plot types
r19 QPushButton *addSeriesButton = new QPushButton("Add series");
connect(addSeriesButton, SIGNAL(clicked()), this, SLOT(addSeries()));
Tero Ahola
Refactored the test app
r110 grid->addWidget(addSeriesButton, 0, 1);
initBackroundCombo(grid);
initScaleControls(grid);
initThemeCombo(grid);
Tero Ahola
Scaling for scatter series
r111 QCheckBox *zoomCheckBox = new QCheckBox("Drag'n drop Zoom");
Tero Ahola
Refactored the test app
r110 connect(zoomCheckBox, SIGNAL(toggled(bool)), m_chartWidget, SLOT(setZoomEnabled(bool)));
zoomCheckBox->setChecked(true);
grid->addWidget(zoomCheckBox, grid->rowCount(), 0);
// add row with empty label to make all the other rows static
grid->addWidget(new QLabel(""), grid->rowCount(), 0);
grid->setRowStretch(grid->rowCount() - 1, 1);
Tero Ahola
Scaling for scatter series
r111
// Another grid layout as a main layout
QGridLayout *mainLayout = new QGridLayout();
Tero Ahola
Refactored the test app
r110 mainLayout->addLayout(grid, 0, 0);
// Init series type specific controls
initPieControls();
mainLayout->addLayout(m_pieLayout, 2, 0);
// Scatter series specific settings
// m_scatterLayout = new QGridLayout();
// m_scatterLayout->addWidget(new QLabel("scatter"), 0, 0);
// m_scatterLayout->setEnabled(false);
// mainLayout->addLayout(m_scatterLayout, 1, 0);
// Add layouts and the chart widget to the main layout
mainLayout->addWidget(m_chartWidget, 0, 1, 3, 1);
setLayout(mainLayout);
}
Tero Ahola
New features like chart type to the test app
r5
Tero Ahola
Refactored the test app
r110 // Combo box for selecting the chart's background
void MainWidget::initBackroundCombo(QGridLayout *grid)
{
Tero Ahola
New features like chart type to the test app
r5 QComboBox *backgroundCombo = new QComboBox(this);
Tero Ahola
Theme now affects background, enabled zoom by default in QChartWidget
r77 backgroundCombo->addItem("Color");
backgroundCombo->addItem("Gradient");
backgroundCombo->addItem("Image");
Tero Ahola
New features like chart type to the test app
r5 connect(backgroundCombo, SIGNAL(currentIndexChanged(int)),
this, SLOT(backgroundChanged(int)));
Tero Ahola
Refactored the test app
r110 grid->addWidget(new QLabel("Background:"), grid->rowCount(), 0);
grid->addWidget(backgroundCombo, grid->rowCount() - 1, 1);
}
// Scale related controls (auto-scale vs. manual min-max values)
void MainWidget::initScaleControls(QGridLayout *grid)
{
Tero Ahola
Drafting scatter type plotting...
r8 m_autoScaleCheck = new QCheckBox("Automatic scaling");
connect(m_autoScaleCheck, SIGNAL(stateChanged(int)), this, SLOT(autoScaleChanged(int)));
Tero Ahola
New features like chart type to the test app
r5 // Allow setting also non-sense values (like -2147483648 and 2147483647)
Tero Ahola
Added auto scaling option to test app
r6 m_xMinSpin = new QSpinBox();
m_xMinSpin->setMinimum(INT_MIN);
m_xMinSpin->setMaximum(INT_MAX);
m_xMinSpin->setValue(0);
connect(m_xMinSpin, SIGNAL(valueChanged(int)), this, SLOT(xMinChanged(int)));
m_xMaxSpin = new QSpinBox();
m_xMaxSpin->setMinimum(INT_MIN);
m_xMaxSpin->setMaximum(INT_MAX);
m_xMaxSpin->setValue(10);
connect(m_xMaxSpin, SIGNAL(valueChanged(int)), this, SLOT(xMaxChanged(int)));
m_yMinSpin = new QSpinBox();
m_yMinSpin->setMinimum(INT_MIN);
m_yMinSpin->setMaximum(INT_MAX);
m_yMinSpin->setValue(0);
connect(m_yMinSpin, SIGNAL(valueChanged(int)), this, SLOT(yMinChanged(int)));
m_yMaxSpin = new QSpinBox();
m_yMaxSpin->setMinimum(INT_MIN);
m_yMaxSpin->setMaximum(INT_MAX);
m_yMaxSpin->setValue(10);
connect(m_yMaxSpin, SIGNAL(valueChanged(int)), this, SLOT(yMaxChanged(int)));
Tero Ahola
New features like chart type to the test app
r5
Tero Ahola
Refactored the test app
r110 grid->addWidget(m_autoScaleCheck, grid->rowCount(), 0);
grid->addWidget(new QLabel("x min:"), grid->rowCount(), 0);
grid->addWidget(m_xMinSpin, grid->rowCount() - 1, 1);
grid->addWidget(new QLabel("x max:"), grid->rowCount(), 0);
grid->addWidget(m_xMaxSpin, grid->rowCount() - 1, 1);
grid->addWidget(new QLabel("y min:"), grid->rowCount(), 0);
grid->addWidget(m_yMinSpin, grid->rowCount() - 1, 1);
grid->addWidget(new QLabel("y max:"), grid->rowCount(), 0);
grid->addWidget(m_yMaxSpin, grid->rowCount() - 1, 1);
m_autoScaleCheck->setChecked(true);
}
// Combo box for selecting theme
void MainWidget::initThemeCombo(QGridLayout *grid)
{
Tero Ahola
Draft implementation for setting color themes for a chart
r64 QComboBox *chartTheme = new QComboBox();
Tero Ahola
Added theme named 'default'
r81 chartTheme->addItem("Default");
Tero Ahola
Draft implementation for setting color themes for a chart
r64 chartTheme->addItem("Vanilla");
chartTheme->addItem("Icy");
chartTheme->addItem("Grayscale");
Tero Ahola
tuning theme colors
r125 chartTheme->addItem("Scientific");
Tero Ahola
Theme now affects background, enabled zoom by default in QChartWidget
r77 chartTheme->addItem("Unnamed1");
Tero Ahola
Draft implementation for setting color themes for a chart
r64 connect(chartTheme, SIGNAL(currentIndexChanged(int)),
this, SLOT(changeChartTheme(int)));
grid->addWidget(new QLabel("Chart theme:"), 8, 0);
grid->addWidget(chartTheme, 8, 1);
Tero Ahola
Refactored the test app
r110 }
Tero Ahola
Added size factor property to pie
r60
Tero Ahola
Refactored the test app
r110 void MainWidget::initPieControls()
{
// Pie series specific settings
Tero Ahola
Theme now affects background, enabled zoom by default in QChartWidget
r77 // Pie size factory
Tero Ahola
Added size factor property to pie
r60 QDoubleSpinBox *pieSizeSpin = new QDoubleSpinBox();
pieSizeSpin->setMinimum(LONG_MIN);
pieSizeSpin->setMaximum(LONG_MAX);
pieSizeSpin->setValue(1.0);
pieSizeSpin->setSingleStep(0.1);
connect(pieSizeSpin, SIGNAL(valueChanged(double)), this, SLOT(setPieSizeFactor(double)));
Tero Ahola
Theme now affects background, enabled zoom by default in QChartWidget
r77 // Pie position
QComboBox *piePosCombo = new QComboBox(this);
piePosCombo->addItem("Maximized");
piePosCombo->addItem("Top left");
piePosCombo->addItem("Top right");
piePosCombo->addItem("Bottom left");
piePosCombo->addItem("Bottom right");
connect(piePosCombo, SIGNAL(currentIndexChanged(int)),
this, SLOT(setPiePosition(int)));
m_pieLayout = new QGridLayout();
Tero Ahola
Added size factor property to pie
r60 m_pieLayout->setEnabled(false);
Tero Ahola
Theme now affects background, enabled zoom by default in QChartWidget
r77 m_pieLayout->addWidget(new QLabel("Pie size factor"), 0, 0);
Tero Ahola
Added size factor property to pie
r60 m_pieLayout->addWidget(pieSizeSpin, 0, 1);
Tero Ahola
Theme now affects background, enabled zoom by default in QChartWidget
r77 m_pieLayout->addWidget(new QLabel("Pie position"), 1, 0);
m_pieLayout->addWidget(piePosCombo, 1, 1);
Tero Ahola
New features like chart type to the test app
r5 }
Tero Ahola
Started to refactor the API to allow integrating different plot types
r19 void MainWidget::addSeries()
{
Tero Ahola
Added size factor property to pie
r60 DataSerieDialog dialog(m_defaultSeriesName, this);
Tero Ahola
Refactored chartwidgettest test data impl
r278 connect(&dialog, SIGNAL(accepted(QString, int, int, QString, bool)),
this, SLOT(addSeries(QString, int, int, QString, bool)));
Tero Ahola
Started to refactor the API to allow integrating different plot types
r19 dialog.exec();
}
Tero Ahola
Refactored chartwidgettest test data impl
r278 QList<RealList> MainWidget::generateTestData(int columnCount, int rowCount, QString dataCharacteristics)
Tero Ahola
Started to refactor the API to allow integrating different plot types
r19 {
Tero Ahola
Refactored chartwidgettest test data impl
r278 // TODO: dataCharacteristics
QList<RealList> testData;
for (int j(0); j < columnCount; j++) {
QList <qreal> newColumn;
for (int i(0); i < rowCount; i++) {
if (dataCharacteristics == "Sin") {
newColumn.append(abs(sin(3.14159265358979 / 50 * i) * 100));
} else if (dataCharacteristics == "Sin + random") {
newColumn.append(abs(sin(3.14159265358979 / 50 * i) * 100) + (rand() % 5));
} else if (dataCharacteristics == "Random") {
newColumn.append(rand() % 5);
} else if (dataCharacteristics == "Linear") {
//newColumn.append(i * (j + 1.0));
// TODO: temporary hack to make pie work; prevent zero values:
newColumn.append(i * (j + 1.0) + 0.1);
} else { // "constant"
newColumn.append((j + 1.0));
}
}
testData.append(newColumn);
}
return testData;
}
Tero Ahola
Test app now adds n data series of different type
r20
Tero Ahola
Refactored chartwidgettest test data impl
r278 QStringList MainWidget::generateLabels(int count)
{
QStringList result;
for (int i(0); i < count; i++)
result.append("label" + QString::number(i));
return result;
}
sauimone
bug fix in bar charts. Crashed, if layout was set before data. Also integrated to test app.
r165
Tero Ahola
Refactored chartwidgettest test data impl
r278 void MainWidget::addSeries(QString seriesName, int columnCount, int rowCount, QString dataCharacteristics, bool labelsEnabled)
{
qDebug() << "addSeries: " << seriesName
<< " columnCount: " << columnCount
<< " rowCount: " << rowCount
<< " dataCharacteristics: " << dataCharacteristics
<< " labels enabled: " << labelsEnabled;
m_defaultSeriesName = seriesName;
QList<RealList> data = generateTestData(columnCount, rowCount, dataCharacteristics);
// Line series and scatter series use similar data
if (seriesName.contains("line", Qt::CaseInsensitive)) {
for (int j(0); j < data.count(); j ++) {
QList<qreal> column = data.at(j);
QLineChartSeries *series = new QLineChartSeries();
for (int i(0); i < column.count(); i++) {
series->add(i, column.at(i));
}
m_chartWidget->addSeries(series);
setCurrentSeries(series);
Tero Ahola
Integrated scatter type series...
r42 }
Tero Ahola
Refactored chartwidgettest test data impl
r278 } else if (seriesName.contains("scatter", Qt::CaseInsensitive)) {
for (int j(0); j < data.count(); j++) {
QList<qreal> column = data.at(j);
QScatterSeries *series = new QScatterSeries();
for (int i(0); i < column.count(); i++) {
(*series) << QPointF(i, column.at(i));
}
m_chartWidget->addSeries(series);
setCurrentSeries(series);
Tero Ahola
Integrated scatter type series...
r42 }
Tero Ahola
Refactored chartwidgettest test data impl
r278 } else if (seriesName.contains("pie", Qt::CaseInsensitive)) {
QStringList labels = generateLabels(rowCount);
for (int j(0); j < data.count(); j++) {
QPieSeries *series = new QPieSeries();
QList<qreal> column = data.at(j);
for (int i(0); i < column.count(); i++) {
series->add(column.at(i), labels.at(i));
}
m_chartWidget->addSeries(series);
setCurrentSeries(series);
Tero Ahola
Test app now adds n data series of different type
r20 }
Tero Ahola
Fixed compilation of example apps with QBarSets
r284 } else if (seriesName == "Bar"
|| seriesName == "Stacked bar"
|| seriesName == "Percent bar") {
Tero Ahola
Restored bar series in chartwidgettest
r279 // TODO: replace QBarCategory with QStringList?
QBarCategory *category = new QBarCategory;
QStringList labels = generateLabels(rowCount);
foreach(QString label, labels)
*category << label;
Tero Ahola
Fixed compilation of example apps with QBarSets
r284 QBarChartSeries* series = 0;
if (seriesName == "Bar")
series = new QBarChartSeries(category, this);
else if (seriesName == "Stacked bar")
series = new QStackedBarChartSeries(category, this);
else
series = new QPercentBarChartSeries(category, this);
Tero Ahola
Restored bar series in chartwidgettest
r279
for (int j(0); j < data.count(); j++) {
QList<qreal> column = data.at(j);
Tero Ahola
Fixed compilation of example apps with QBarSets
r284 QBarSet *set = new QBarSet("set" + QString::number(j));
Tero Ahola
Restored bar series in chartwidgettest
r279 for (int i(0); i < column.count(); i++) {
*set << column.at(i);
}
series->addBarSet(set);
}
sauimone
enablers for tooltip and floating values, bug fixing, updated examples. tidying up the code
r296 series->enableFloatingValues();
series->enableToolTip();
series->enableSeparators(false);
Tero Ahola
Restored bar series in chartwidgettest
r279 m_chartWidget->addSeries(series);
setCurrentSeries(series);
Tero Ahola
Test app now adds n data series of different type
r20 }
Tero Ahola
Restored bar series in chartwidgettest
r279 // TODO: spline and area
Tero Ahola
Started to refactor the API to allow integrating different plot types
r19 }
Tero Ahola
Added size factor property to pie
r60 void MainWidget::setCurrentSeries(QChartSeries *series)
Tero Ahola
New features like chart type to the test app
r5 {
Tero Ahola
added stream operator to scatter series
r180 if (series) {
m_currentSeries = series;
switch (m_currentSeries->type()) {
case QChartSeries::SeriesTypeLine:
break;
case QChartSeries::SeriesTypeScatter:
break;
case QChartSeries::SeriesTypePie:
break;
case QChartSeries::SeriesTypeBar:
qDebug() << "setCurrentSeries (bar)";
break;
case QChartSeries::SeriesTypeStackedBar:
qDebug() << "setCurrentSeries (Stackedbar)";
break;
case QChartSeries::SeriesTypePercentBar:
qDebug() << "setCurrentSeries (Percentbar)";
break;
default:
Q_ASSERT(false);
break;
}
Tero Ahola
Scatter data point now shown using a picture
r13 }
Tero Ahola
New features like chart type to the test app
r5 }
void MainWidget::backgroundChanged(int itemIndex)
{
qDebug() << "backgroundChanged: " << itemIndex;
}
Tero Ahola
Added auto scaling option to test app
r6 void MainWidget::autoScaleChanged(int value)
{
Tero Ahola
Drafting scatter type plotting...
r8 if (value) {
// TODO: enable auto scaling
} else {
// TODO: set scaling manually (and disable auto scaling)
Tero Ahola
Added auto scaling option to test app
r6 }
Tero Ahola
Drafting scatter type plotting...
r8 m_xMinSpin->setEnabled(!value);
m_xMaxSpin->setEnabled(!value);
m_yMinSpin->setEnabled(!value);
m_yMaxSpin->setEnabled(!value);
Tero Ahola
Added auto scaling option to test app
r6 }
Tero Ahola
New features like chart type to the test app
r5 void MainWidget::xMinChanged(int value)
{
qDebug() << "xMinChanged: " << value;
}
void MainWidget::xMaxChanged(int value)
{
qDebug() << "xMaxChanged: " << value;
}
void MainWidget::yMinChanged(int value)
{
qDebug() << "yMinChanged: " << value;
}
void MainWidget::yMaxChanged(int value)
{
qDebug() << "yMaxChanged: " << value;
}
Tero Ahola
Added size factor property to pie
r60
Tero Ahola
Draft implementation for setting color themes for a chart
r64 void MainWidget::changeChartTheme(int themeIndex)
{
qDebug() << "changeChartTheme: " << themeIndex;
Michal Klocek
minor. compilation fix for test widget
r154 m_chartWidget->setChartTheme((QChart::ChartTheme) themeIndex);
sauimone
added labels to series, intergrated with test app. minor hack to test app
r167 //TODO: remove this hack. This is just to make it so that theme change is seen immediately.
QSize s = size();
s.setWidth(s.width()+1);
resize(s);
Tero Ahola
Draft implementation for setting color themes for a chart
r64 }
Tero Ahola
Added size factor property to pie
r60 void MainWidget::setPieSizeFactor(double size)
{
QPieSeries *pie = qobject_cast<QPieSeries *>(m_currentSeries);
Tero Ahola
Color themes now enabled for scatter, pie and line series.
r75 if (pie)
pie->setSizeFactor(qreal(size));
Tero Ahola
Added size factor property to pie
r60 }
Tero Ahola
Theme now affects background, enabled zoom by default in QChartWidget
r77
void MainWidget::setPiePosition(int position)
{
QPieSeries *pie = qobject_cast<QPieSeries *>(m_currentSeries);
if (pie)
pie->setPosition((QPieSeries::PiePosition) position);
Tero Ahola
Added size factor property to pie
r60 }