#include #include #include #include #include #include #include QTCOMMERCIALCHART_USE_NAMESPACE class DrilldownSlice : public QPieSlice { Q_OBJECT public: DrilldownSlice(qreal value, QString prefix, QSeries* drilldownSeries) :m_drilldownSeries(drilldownSeries), m_prefix(prefix) { setValue(value); setLabelVisible(true); updateLabel(); connect(this, SIGNAL(changed()), this, SLOT(updateLabel())); } QSeries* drilldownSeries() const { return m_drilldownSeries; } public Q_SLOTS: void updateLabel() { QString label = m_prefix; label += " - " + QString::number(this->value())+ "e ("; label += QString::number(this->percentage()*100, 'f', 1) + "%)"; setLabel(label); } private: QSeries* m_drilldownSeries; QString m_prefix; }; class DrilldownChart : public QChartView { Q_OBJECT public: explicit DrilldownChart(QWidget *parent = 0):QChartView(parent), m_currentSeries(0) {} void changeSeries(QSeries* series) { if (m_currentSeries) removeSeries(m_currentSeries); m_currentSeries = series; addSeries(series); setChartTitle(series->title()); } public Q_SLOTS: void handleSliceClicked(QPieSlice* slice) { DrilldownSlice* drilldownSlice = static_cast(slice); changeSeries(drilldownSlice->drilldownSeries()); } private: QSeries* m_currentSeries; }; int main(int argc, char *argv[]) { QApplication a(argc, argv); qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); QMainWindow window; DrilldownChart* drilldownChart = new DrilldownChart(&window); drilldownChart->setRenderHint(QPainter::Antialiasing); drilldownChart->setChartTheme(QChart::ChartThemeVanilla); QPieSeries* yearSeries = new QPieSeries(drilldownChart); yearSeries->setTitle("Sales by year - All"); yearSeries->setHoverHighlighting(); QList months; months << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun" << "Jul" << "Aug" << "Sep" << "Oct" << "Nov" << "Dec"; int max = 1000; QPieSeries* monthSeriesJane = new QPieSeries(drilldownChart); monthSeriesJane->setTitle("Sales by month - Jane"); monthSeriesJane->setHoverHighlighting(); foreach (QString month, months) *monthSeriesJane << new DrilldownSlice(qrand() % max, month, yearSeries); QPieSeries* monthSeriesJohn = new QPieSeries(drilldownChart); monthSeriesJohn->setTitle("Sales by month - John"); monthSeriesJohn->setHoverHighlighting(); foreach (QString month, months) *monthSeriesJohn << new DrilldownSlice(qrand() % max, month, yearSeries); QPieSeries* monthSeriesAxel = new QPieSeries(drilldownChart); monthSeriesAxel->setTitle("Sales by month - Axel"); monthSeriesAxel->setHoverHighlighting(); foreach (QString month, months) *monthSeriesAxel << new DrilldownSlice(qrand() % max, month, yearSeries); *yearSeries << new DrilldownSlice(monthSeriesJane->total(), "Jane", monthSeriesJane); *yearSeries << new DrilldownSlice(monthSeriesJohn->total(), "John", monthSeriesJohn); *yearSeries << new DrilldownSlice(monthSeriesAxel->total(), "Axel", monthSeriesAxel); QObject::connect(monthSeriesJane, SIGNAL(clicked(QPieSlice*)), drilldownChart, SLOT(handleSliceClicked(QPieSlice*))); QObject::connect(monthSeriesJohn, SIGNAL(clicked(QPieSlice*)), drilldownChart, SLOT(handleSliceClicked(QPieSlice*))); QObject::connect(monthSeriesAxel, SIGNAL(clicked(QPieSlice*)), drilldownChart, SLOT(handleSliceClicked(QPieSlice*))); QObject::connect(yearSeries, SIGNAL(clicked(QPieSlice*)), drilldownChart, SLOT(handleSliceClicked(QPieSlice*))); drilldownChart->changeSeries(yearSeries); window.setCentralWidget(drilldownChart); window.resize(600, 600); window.show(); return a.exec(); } #include "main.moc"