#include "filmsByCategory.h" FilmsByCategory::FilmsByCategory(QObject *parent) : QObject{parent} { } bool FilmsByCategory::openDatabase() { QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setDatabaseName("sakila"); db.setHostName("localhost"); db.setUserName("root"); db.setPassword("12345"); if(!db.open()){ qDebug() << "connection failed."; return false; } return true; } void FilmsByCategory::getBarSetData() { QSqlQuery query("SELECT cat.name, count(*) as film_count \ FROM film_category fc \ INNER JOIN category cat USING(category_id) \ GROUP BY fc.category_id"); if(!query.exec()){ qDebug() << query.lastError(); return; } while(query.next()){ QString catName = query.value(0).toString(); int filmCount = query.value(1).toInt(); QBarSet* bar = new QBarSet(catName); bar->append(filmCount); m_maxCount = qMax(m_maxCount, filmCount); emit changed(bar); } emit maxCountChanged(); } QPieSeries* FilmsByCategory::getPieSliceData() { QPieSeries* pieSlices = new QPieSeries(); QSqlQuery query("SELECT cat.name, count(*) as film_count \ FROM film_category fc \ INNER JOIN category cat USING(category_id) \ GROUP BY fc.category_id"); if (!query.exec()) { qWarning() << "Query failed:" << query.lastError(); } double total = 0; int maxValue{0}; int minValue{std::numeric_limits::max()}; while (query.next()) { QString catName = query.value(0).toString(); int countValue = query.value(1).toInt(); total += countValue; maxValue = qMax(maxValue, countValue); minValue = qMin(minValue, countValue); QPieSlice* pieSlice = new QPieSlice(catName, countValue); pieSlices->append(pieSlice); } QList colors = contrastColors(pieSlices->count()); int index{0}; int maxValueIndex{0}; int minValueIndex{0}; for(QPieSlice* slice : pieSlices->slices()) { slice->setLabel(QString("%1 (%2%)") .arg(slice->label(), QString::number(slice->value()/total*100.0, 'f', 1))); slice->setLabelVisible(true); slice->setColor(colors[index]); slice->setBorderColor(colors[index]); if(slice->value()>= maxValue) maxValueIndex = index; if(slice->value()<= minValue) minValueIndex = index; index++; } pieSlices -> slices().at(maxValueIndex) -> setExploded(true); pieSlices -> slices().at(maxValueIndex) -> setExplodeDistanceFactor(0.1); pieSlices -> slices().at(minValueIndex) -> setExploded(true); pieSlices -> slices().at(minValueIndex) -> setExplodeDistanceFactor(0.05); pieSlices -> setHoleSize(0.5); // pieSlices -> setStartAngle(45); // pieSlices -> setEndAngle(45+360); /* click signal is not available this time */ // connect(pieSlices, &QPieSeries::clicked, pieSlices , [](QPieSlice* slice){ // slice -> setExploded(true); // slice -> setExplodeDistanceFactor(0.15); // }); return pieSlices; } int FilmsByCategory::maxCount() const { return m_maxCount; } QList FilmsByCategory::rainbowColors(int n) { QList colors; for(int i=0; i FilmsByCategory::contrastColors(int n) { QList colors; for (int i = 0; i < n; ++i) { int hue = (i * 350 / n) % 360; colors.append(QColor::fromHsl(hue, 255, 127, 220)); } return colors; }