widget.cpp
244 lines
| 8.9 KiB
| text/x-c
|
CppLexer
Jani Honkonen
|
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$ | ||||
** | ||||
****************************************************************************/ | ||||
Marek Rosa
|
r219 | |||
Marek Rosa
|
r205 | #include "widget.h" | ||
Jani Honkonen
|
r826 | |||
#include <QChart> | ||||
#include <QScatterSeries> | ||||
#include <QChartAxis> | ||||
Marek Rosa
|
r835 | #include <QBarSet> | ||
Jani Honkonen
|
r826 | #include <QBarSeries> | ||
Marek Rosa
|
r935 | #include <QLegend> | ||
Jani Honkonen
|
r826 | |||
Marek Rosa
|
r205 | #include <QGridLayout> | ||
#include <QPushButton> | ||||
#include <QLabel> | ||||
#include <QListWidget> | ||||
Marek Rosa
|
r244 | #include <QPrinter> | ||
#include <QPrintDialog> | ||||
Marek Rosa
|
r268 | #include <QRadioButton> | ||
sauimone
|
r377 | #include <QStringList> | ||
Jani Honkonen
|
r826 | #include <QSqlQuery> | ||
Michal Klocek
|
r996 | #include <QDebug> | ||
Marek Rosa
|
r205 | |||
QTCOMMERCIALCHART_USE_NAMESPACE | ||||
Widget::Widget(QWidget *parent) | ||||
: QWidget(parent) | ||||
Michal Klocek
|
r232 | { | ||
Marek Rosa
|
r242 | setGeometry(100, 100, 1000, 600); | ||
Marek Rosa
|
r205 | |||
// right panel layout | ||||
Marek Rosa
|
r268 | barChartRadioButton = new QRadioButton(tr("Bar chart")); | ||
barChartRadioButton->setChecked(true); | ||||
scatterChartRadioButton = new QRadioButton(tr("Scatter chart")); | ||||
scatterChartRadioButton->setChecked(false); | ||||
Marek Rosa
|
r205 | countrieslist = new QListWidget; | ||
countrieslist->setSelectionMode(QAbstractItemView::MultiSelection); | ||||
Marek Rosa
|
r382 | //list of years widget | ||
Marek Rosa
|
r205 | yearslist = new QListWidget; | ||
yearslist->setSelectionMode(QAbstractItemView::ExtendedSelection); | ||||
for (int i = 1990; i < 2011; i++) | ||||
yearslist->addItem(QString("%1").arg(i)); | ||||
QPushButton* refreshButton = new QPushButton(tr("Refresh")); | ||||
connect(refreshButton, SIGNAL(clicked()), this, SLOT(refreshChart())); | ||||
Marek Rosa
|
r935 | QPushButton* printButton = new QPushButton(tr("Print to pdf")); | ||
Marek Rosa
|
r244 | connect(printButton, SIGNAL(clicked()), this, SLOT(printChart())); | ||
Marek Rosa
|
r205 | QVBoxLayout* rightPanelLayout = new QVBoxLayout; | ||
Marek Rosa
|
r268 | rightPanelLayout->addWidget(barChartRadioButton); | ||
rightPanelLayout->addWidget(scatterChartRadioButton); | ||||
Marek Rosa
|
r205 | rightPanelLayout->addWidget(countrieslist); | ||
rightPanelLayout->addWidget(yearslist); | ||||
rightPanelLayout->addWidget(refreshButton); | ||||
Marek Rosa
|
r244 | rightPanelLayout->addWidget(printButton); | ||
Marek Rosa
|
r205 | rightPanelLayout->setStretch(0, 1); | ||
rightPanelLayout->setStretch(1, 0); | ||||
Jani Honkonen
|
r826 | QChart *chart = new QChart(); | ||
chart->setTitle("GDP by country"); | ||||
Marek Rosa
|
r935 | chart->legend()->setVisible(true); | ||
Jani Honkonen
|
r826 | |||
Marek Rosa
|
r205 | // main layout | ||
Jani Honkonen
|
r826 | chartView = new QChartView(chart); | ||
Marek Rosa
|
r205 | QGridLayout* mainLayout = new QGridLayout; | ||
Jani Honkonen
|
r826 | mainLayout->addWidget(chartView, 0, 0); | ||
Marek Rosa
|
r205 | mainLayout->addLayout(rightPanelLayout, 0, 1); | ||
mainLayout->setColumnStretch(0,1); | ||||
setLayout(mainLayout); | ||||
// connect to the database | ||||
db = QSqlDatabase::addDatabase("QSQLITE"); | ||||
Marek Rosa
|
r242 | db.setDatabaseName("gdpData"); | ||
Marek Rosa
|
r205 | if(!db.open()) | ||
{ | ||||
qDebug() << "could not open database. SQLite db file missing (?)"; | ||||
return; | ||||
} | ||||
// get the list of all countires and regions. | ||||
QSqlQuery query; | ||||
query.exec("SELECT DISTINCT country FROM gdp2"); | ||||
// add the countries to the country filter | ||||
while (query.next()) { | ||||
countrieslist->addItem(query.value(0).toString()); | ||||
} | ||||
} | ||||
Widget::~Widget() | ||||
{ | ||||
// | ||||
db.close(); | ||||
} | ||||
Marek Rosa
|
r219 | /*! | ||
refreshes the chart | ||||
*/ | ||||
Marek Rosa
|
r205 | void Widget::refreshChart() | ||
{ | ||||
Jani Honkonen
|
r826 | chartView->chart()->removeAllSeries(); | ||
Marek Rosa
|
r268 | |||
Marek Rosa
|
r205 | // selected countries items list is not sorted. copy the values to QStringlist and sort them. | ||
QStringList selectedCountriesStrings; | ||||
QList<QListWidgetItem*> selectedCountriesItems = countrieslist->selectedItems(); | ||||
for (int i = 0; i < selectedCountriesItems.size(); i++) | ||||
selectedCountriesStrings.append(selectedCountriesItems[i]->text()); | ||||
selectedCountriesStrings.sort(); | ||||
QSqlQuery query; | ||||
Marek Rosa
|
r382 | // selected years items list is not sorted. copy the values to QList<int> and sort them. | ||
Marek Rosa
|
r205 | QList<int> selectedYearsInts; | ||
QList<QListWidgetItem*> selectedYearsItems = yearslist->selectedItems(); | ||||
for (int i = 0; i < selectedYearsItems.size(); i++) | ||||
selectedYearsInts.append(selectedYearsItems[i]->text().toInt()); | ||||
Marek Rosa
|
r935 | qSort(selectedYearsInts.begin(), selectedYearsInts.end()); | ||
Marek Rosa
|
r205 | |||
Marek Rosa
|
r268 | if (barChartRadioButton->isChecked()) | ||
Marek Rosa
|
r205 | { | ||
Marek Rosa
|
r268 | // use the sorted selected coutries list to initialize BarCategory | ||
sauimone
|
r377 | QStringList category; | ||
Marek Rosa
|
r268 | for (int i = 0; i < selectedCountriesStrings.size(); i++) | ||
sauimone
|
r377 | category << selectedCountriesStrings[i]; | ||
Marek Rosa
|
r385 | QBarSeries* series0 = new QBarSeries(category); | ||
sauimone
|
r338 | series0 = new QBarSeries(category); | ||
Marek Rosa
|
r268 | |||
// prepare the selected counries SQL query | ||||
QString countriesQuery = "country IN ("; | ||||
for (int i = 0; i < selectedCountriesStrings.size(); i++) | ||||
Marek Rosa
|
r205 | { | ||
Marek Rosa
|
r268 | countriesQuery.append("'" + selectedCountriesStrings[i] + "'"); | ||
if ( i < selectedCountriesStrings.size() - 1) | ||||
countriesQuery.append(","); | ||||
else | ||||
countriesQuery.append(")"); | ||||
} | ||||
// perform a query for each selected year | ||||
for (int i = 0; i < selectedYearsInts.size(); i++) | ||||
{ | ||||
query.exec("SELECT country,gdpvalue FROM gdp2 where year=" + QString("%1").arg(selectedYearsInts[i]) + " AND " + countriesQuery); | ||||
Marek Rosa
|
r935 | QBarSet* barSet = new QBarSet(QString::number(selectedYearsInts[i])); | ||
Marek Rosa
|
r286 | |||
Marek Rosa
|
r268 | // while (query.next()) { | ||
// qDebug() << query.value(0).toString() << " : " << query.value(1).toString(); | ||||
// } | ||||
query.first(); | ||||
// the data for some of the coutries for some years might be missing. | ||||
// QBarChart needs bars to have same size | ||||
for (int k = 0; k < selectedCountriesStrings.size(); k++) | ||||
Marek Rosa
|
r205 | { | ||
Marek Rosa
|
r268 | if (selectedCountriesStrings[k] == query.value(0).toString()) | ||
{ | ||||
*barSet << query.value(1).toReal(); | ||||
qDebug() << query.value(0).toString() << query.value(1).toReal() << " : " << QString("%1").arg(selectedYearsInts[i]); | ||||
query.next(); | ||||
} | ||||
else | ||||
{ | ||||
// data missing, put 0 | ||||
*barSet << 0.0f; | ||||
Marek Rosa
|
r382 | qDebug() << "Putting 0 for the missing data" << " : " << QString("%1").arg(selectedYearsInts[i]); | ||
Marek Rosa
|
r268 | } | ||
Marek Rosa
|
r205 | } | ||
Jani Honkonen
|
r826 | series0->appendBarSet(barSet); | ||
Marek Rosa
|
r268 | } | ||
// add the serie to the chart | ||||
Jani Honkonen
|
r826 | chartView->chart()->addSeries(series0); | ||
Marek Rosa
|
r268 | } | ||
else if (scatterChartRadioButton->isChecked()) | ||||
{ | ||||
QString yearsQuery = "year IN ("; | ||||
for (int i = 0; i < selectedYearsInts.size(); i++) | ||||
{ | ||||
yearsQuery.append("'" + QString("%1").arg(selectedYearsInts[i]) + "'"); | ||||
if ( i < selectedYearsInts.size() - 1) | ||||
yearsQuery.append(","); | ||||
Marek Rosa
|
r205 | else | ||
Marek Rosa
|
r268 | yearsQuery.append(")"); | ||
} | ||||
Marek Rosa
|
r382 | // perform a query for each selected country | ||
Marek Rosa
|
r268 | for (int i = 0; i < selectedCountriesStrings.size(); i++) | ||
{ | ||||
query.exec("SELECT year,gdpvalue FROM gdp2 where country='" + selectedCountriesStrings[i] + "' AND " + yearsQuery); | ||||
query.first(); | ||||
QScatterSeries* series = new QScatterSeries; | ||||
Marek Rosa
|
r935 | series->setName(selectedCountriesStrings[i]); | ||
Marek Rosa
|
r268 | // the data for some of the coutries for some years might be missing. | ||
for (int k = 0; k < selectedYearsInts.size(); k++) | ||||
Marek Rosa
|
r205 | { | ||
Marek Rosa
|
r268 | if (selectedYearsInts[k] == query.value(0).toInt()) | ||
{ | ||||
*series << QPointF(query.value(0).toInt() , query.value(1).toReal()); | ||||
qDebug() << query.value(0).toString() << query.value(1).toReal() << " : " << QString("%1").arg(selectedYearsInts[k]); | ||||
query.next(); | ||||
} | ||||
else | ||||
{ | ||||
// data missing, put 0 | ||||
*series << QPointF(selectedYearsInts[k] , 0.0f); | ||||
Marek Rosa
|
r382 | qDebug() << "Putting 0 for the missing data" << " : " << QString("%1").arg(selectedYearsInts[i]) << " " << query.value(0).toInt(); | ||
Marek Rosa
|
r268 | } | ||
Marek Rosa
|
r205 | } | ||
Marek Rosa
|
r383 | // chartArea->axisX()->setRange(selectedYearsInts[selectedYearsInts.size() - 1] + 1, selectedYearsInts[0] - 1); | ||
Jani Honkonen
|
r826 | chartView->chart()->addSeries(series); | ||
Marek Rosa
|
r205 | } | ||
Jani Honkonen
|
r826 | chartView->chart()->axisX()->setRange(selectedYearsInts[selectedYearsInts.size() - 1] - 1, selectedYearsInts[0] + 1); | ||
Marek Rosa
|
r205 | } | ||
} | ||||
Marek Rosa
|
r244 | |||
void Widget::printChart() | ||||
{ | ||||
QPrinter printer; | ||||
Marek Rosa
|
r268 | // QPrinter printer(QPrinter::HighResolution); | ||
Marek Rosa
|
r244 | printer.setOutputFormat(QPrinter::PdfFormat); | ||
printer.setOrientation(QPrinter::Landscape); | ||||
printer.setOutputFileName("print.pdf"); | ||||
QPainter painter; | ||||
painter.begin(&printer); | ||||
Jani Honkonen
|
r826 | chartView->render(&painter); | ||
Marek Rosa
|
r244 | } | ||