widget.cpp
230 lines
| 8.2 KiB
| text/x-c
|
CppLexer
Marek Rosa
|
r219 | /*! | ||
\class Widget | ||||
\brief Ui for the application. | ||||
Tero Ahola
|
r264 | \internal | ||
Marek Rosa
|
r219 | */ | ||
Marek Rosa
|
r205 | #include "widget.h" | ||
#include <QGridLayout> | ||||
#include <QPushButton> | ||||
#include <QLabel> | ||||
#include <QSqlQuery> | ||||
#include <qscatterseries.h> | ||||
#include <qchartview.h> | ||||
#include <qchartaxis.h> | ||||
#include <qbarset.h> | ||||
#include <QListWidget> | ||||
Marek Rosa
|
r244 | #include <QPrinter> | ||
#include <QPrintDialog> | ||||
Marek Rosa
|
r268 | #include <QRadioButton> | ||
sauimone
|
r377 | #include <QStringList> | ||
Marek Rosa
|
r385 | #include <qbarseries.h> | ||
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
|
r244 | QPushButton* printButton = new QPushButton(tr("Print chart")); | ||
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); | ||||
// main layout | ||||
chartArea = new QChartView(this); | ||||
chartArea->setChartTitle("GDP by country"); | ||||
QGridLayout* mainLayout = new QGridLayout; | ||||
mainLayout->addWidget(chartArea, 0, 0); | ||||
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()); | ||||
} | ||||
// hide axis X labels | ||||
Michal Klocek
|
r232 | QChartAxis* axis = chartArea->axisX(); | ||
Marek Rosa
|
r434 | // axis-> | ||
Marek Rosa
|
r383 | // axis->setLabelsVisible(false); | ||
Marek Rosa
|
r244 | // newAxis.setLabelsOrientation(QChartAxis::LabelsOrientationSlide); | ||
Michal Klocek
|
r232 | |||
Marek Rosa
|
r205 | } | ||
Widget::~Widget() | ||||
{ | ||||
// | ||||
db.close(); | ||||
} | ||||
Marek Rosa
|
r219 | /*! | ||
refreshes the chart | ||||
*/ | ||||
Marek Rosa
|
r205 | void Widget::refreshChart() | ||
{ | ||||
Marek Rosa
|
r285 | chartArea->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
|
r268 | qSort(selectedYearsInts.begin(), selectedYearsInts.end(), qGreater<int>()); | ||
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); | ||||
Tero Ahola
|
r284 | QBarSet* barSet = new QBarSet("Barset" + QString::number(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 | } | ||
Marek Rosa
|
r268 | series0->addBarSet(barSet); | ||
} | ||||
// add the serie to the chart | ||||
chartArea->addSeries(series0); | ||||
} | ||||
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; | ||||
// 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); | ||
Marek Rosa
|
r268 | chartArea->addSeries(series); | ||
Marek Rosa
|
r205 | } | ||
Marek Rosa
|
r434 | chartArea->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); | ||||
chartArea->render(&painter); | ||||
} | ||||