@@ -0,0 +1,57 | |||||
|
1 | /**************************************************************************** | |||
|
2 | ** | |||
|
3 | ** Copyright (C) 2012 Digia Plc | |||
|
4 | ** All rights reserved. | |||
|
5 | ** For any questions to Digia, please use contact form at http://qt.digia.com | |||
|
6 | ** | |||
|
7 | ** This file is part of the Qt Commercial Charts Add-on. | |||
|
8 | ** | |||
|
9 | ** $QT_BEGIN_LICENSE$ | |||
|
10 | ** Licensees holding valid Qt Commercial licenses may use this file in | |||
|
11 | ** accordance with the Qt Commercial License Agreement provided with the | |||
|
12 | ** Software or, alternatively, in accordance with the terms contained in | |||
|
13 | ** a written agreement between you and Digia. | |||
|
14 | ** | |||
|
15 | ** If you have questions regarding the use of this file, please use | |||
|
16 | ** contact form at http://qt.digia.com | |||
|
17 | ** $QT_END_LICENSE$ | |||
|
18 | ** | |||
|
19 | ****************************************************************************/ | |||
|
20 | ||||
|
21 | #include "mainslice.h" | |||
|
22 | ||||
|
23 | QTCOMMERCIALCHART_USE_NAMESPACE | |||
|
24 | ||||
|
25 | //![1] | |||
|
26 | MainSlice::MainSlice(QPieSeries *breakdownSeries, QObject *parent) | |||
|
27 | : QPieSlice(parent), | |||
|
28 | m_breakdownSeries(breakdownSeries) | |||
|
29 | { | |||
|
30 | connect(this, SIGNAL(percentageChanged()), this, SLOT(updateLabel())); | |||
|
31 | } | |||
|
32 | //![1] | |||
|
33 | ||||
|
34 | QPieSeries *MainSlice::breakdownSeries() const | |||
|
35 | { | |||
|
36 | return m_breakdownSeries; | |||
|
37 | } | |||
|
38 | ||||
|
39 | void MainSlice::setName(QString name) | |||
|
40 | { | |||
|
41 | m_name = name; | |||
|
42 | } | |||
|
43 | ||||
|
44 | QString MainSlice::name() const | |||
|
45 | { | |||
|
46 | return m_name; | |||
|
47 | } | |||
|
48 | ||||
|
49 | //![2] | |||
|
50 | void MainSlice::updateLabel() | |||
|
51 | { | |||
|
52 | this->setLabel(QString("%1 %2%").arg(m_name).arg(percentage() * 100, 0, 'f', 2)); | |||
|
53 | } | |||
|
54 | //![2] | |||
|
55 | ||||
|
56 | #include "moc_mainslice.cpp" | |||
|
57 |
@@ -0,0 +1,48 | |||||
|
1 | /**************************************************************************** | |||
|
2 | ** | |||
|
3 | ** Copyright (C) 2012 Digia Plc | |||
|
4 | ** All rights reserved. | |||
|
5 | ** For any questions to Digia, please use contact form at http://qt.digia.com | |||
|
6 | ** | |||
|
7 | ** This file is part of the Qt Commercial Charts Add-on. | |||
|
8 | ** | |||
|
9 | ** $QT_BEGIN_LICENSE$ | |||
|
10 | ** Licensees holding valid Qt Commercial licenses may use this file in | |||
|
11 | ** accordance with the Qt Commercial License Agreement provided with the | |||
|
12 | ** Software or, alternatively, in accordance with the terms contained in | |||
|
13 | ** a written agreement between you and Digia. | |||
|
14 | ** | |||
|
15 | ** If you have questions regarding the use of this file, please use | |||
|
16 | ** contact form at http://qt.digia.com | |||
|
17 | ** $QT_END_LICENSE$ | |||
|
18 | ** | |||
|
19 | ****************************************************************************/ | |||
|
20 | ||||
|
21 | #ifndef MAINSLICE_H | |||
|
22 | #define MAINSLICE_H | |||
|
23 | ||||
|
24 | #include <QPieSlice> | |||
|
25 | #include <QPieSeries> | |||
|
26 | ||||
|
27 | QTCOMMERCIALCHART_USE_NAMESPACE | |||
|
28 | ||||
|
29 | class MainSlice : public QPieSlice | |||
|
30 | { | |||
|
31 | Q_OBJECT | |||
|
32 | public: | |||
|
33 | MainSlice(QPieSeries *breakdownSeries, QObject *parent = 0); | |||
|
34 | ||||
|
35 | QPieSeries *breakdownSeries() const; | |||
|
36 | ||||
|
37 | void setName(QString name); | |||
|
38 | QString name() const; | |||
|
39 | ||||
|
40 | public Q_SLOTS: | |||
|
41 | void updateLabel(); | |||
|
42 | ||||
|
43 | private: | |||
|
44 | QPieSeries *m_breakdownSeries; | |||
|
45 | QString m_name; | |||
|
46 | }; | |||
|
47 | ||||
|
48 | #endif // MAINSLICE_H |
@@ -29,6 +29,15 | |||||
29 |
|
29 | |||
30 | \snippet ../examples/donutbreakdown/donutbreakdownchart.cpp 3 |
|
30 | \snippet ../examples/donutbreakdown/donutbreakdownchart.cpp 3 | |
31 |
|
31 | |||
|
32 | Legend markers are customized to show the breakdown percentage and markers for the main level slices are hidden. | |||
|
33 | ||||
|
34 | \snippet ../examples/donutbreakdown/donutbreakdownchart.cpp 4 | |||
|
35 | ||||
|
36 | Instead the main level slices show the percentage on the label. | |||
|
37 | ||||
|
38 | \snippet ../examples/donutbreakdown/mainslice.cpp 1 | |||
|
39 | \snippet ../examples/donutbreakdown/mainslice.cpp 2 | |||
|
40 | ||||
32 | And now that we have our chart defined we can finally create a QChartView and show the chart. |
|
41 | And now that we have our chart defined we can finally create a QChartView and show the chart. | |
33 |
|
42 | |||
34 | \snippet ../examples/donutbreakdown/main.cpp 3 |
|
43 | \snippet ../examples/donutbreakdown/main.cpp 3 |
@@ -4,7 +4,9 | |||||
4 |
|
4 | |||
5 | TARGET = donutbreakdown |
|
5 | TARGET = donutbreakdown | |
6 | SOURCES += main.cpp\ |
|
6 | SOURCES += main.cpp\ | |
7 | donutbreakdownchart.cpp |
|
7 | donutbreakdownchart.cpp \ | |
|
8 | mainslice.cpp | |||
8 |
|
9 | |||
9 | HEADERS += \ |
|
10 | HEADERS += \ | |
10 | donutbreakdownchart.h |
|
11 | donutbreakdownchart.h \ | |
|
12 | mainslice.h |
@@ -18,7 +18,9 | |||||
18 | ** |
|
18 | ** | |
19 | ****************************************************************************/ |
|
19 | ****************************************************************************/ | |
20 | #include "donutbreakdownchart.h" |
|
20 | #include "donutbreakdownchart.h" | |
|
21 | #include "mainslice.h" | |||
21 | #include <QPieSlice> |
|
22 | #include <QPieSlice> | |
|
23 | #include <QPieLegendMarker> | |||
22 |
|
24 | |||
23 | QTCOMMERCIALCHART_USE_NAMESPACE |
|
25 | QTCOMMERCIALCHART_USE_NAMESPACE | |
24 |
|
26 | |||
@@ -27,23 +29,29 DonutBreakdownChart::DonutBreakdownChart(QGraphicsItem *parent, Qt::WindowFlags | |||||
27 | : QChart(parent, wFlags) |
|
29 | : QChart(parent, wFlags) | |
28 | { |
|
30 | { | |
29 | // create the series for main center pie |
|
31 | // create the series for main center pie | |
30 | mainSeries = new QPieSeries(); |
|
32 | m_mainSeries = new QPieSeries(); | |
31 | mainSeries->setPieSize(0.7); |
|
33 | m_mainSeries->setPieSize(0.7); | |
32 | QChart::addSeries(mainSeries); |
|
34 | QChart::addSeries(m_mainSeries); | |
33 | } |
|
35 | } | |
34 | //![1] |
|
36 | //![1] | |
35 |
|
37 | |||
36 | //![2] |
|
38 | //![2] | |
37 | void DonutBreakdownChart::addBreakdownSeries(QPieSeries *breakdownSeries, QColor color) |
|
39 | void DonutBreakdownChart::addBreakdownSeries(QPieSeries *breakdownSeries, QColor color) | |
38 | { |
|
40 | { | |
|
41 | QFont font("Arial", 8); | |||
|
42 | ||||
39 | // add breakdown series as a slice to center pie |
|
43 | // add breakdown series as a slice to center pie | |
40 | QPieSlice *slice = mainSeries->append(breakdownSeries->name(), breakdownSeries->sum()); |
|
44 | MainSlice *mainSlice = new MainSlice(breakdownSeries); | |
|
45 | mainSlice->setName(breakdownSeries->name()); | |||
|
46 | mainSlice->setValue(breakdownSeries->sum()); | |||
|
47 | m_mainSeries->append(mainSlice); | |||
41 |
|
48 | |||
42 | // customize the slice |
|
49 | // customize the slice | |
43 |
|
|
50 | mainSlice->setBrush(color); | |
44 |
|
|
51 | mainSlice->setLabelVisible(); | |
45 |
|
|
52 | mainSlice->setLabelColor(Qt::white); | |
46 |
|
|
53 | mainSlice->setLabelPosition(QPieSlice::LabelInsideHorizontal); | |
|
54 | mainSlice->setLabelFont(font); | |||
47 |
|
55 | |||
48 | // position and customize the breakdown series |
|
56 | // position and customize the breakdown series | |
49 | breakdownSeries->setPieSize(0.8); |
|
57 | breakdownSeries->setPieSize(0.8); | |
@@ -52,7 +60,7 void DonutBreakdownChart::addBreakdownSeries(QPieSeries *breakdownSeries, QColor | |||||
52 | foreach (QPieSlice *slice, breakdownSeries->slices()) { |
|
60 | foreach (QPieSlice *slice, breakdownSeries->slices()) { | |
53 | color = color.lighter(115); |
|
61 | color = color.lighter(115); | |
54 | slice->setBrush(color); |
|
62 | slice->setBrush(color); | |
55 |
slice->setLabelFont( |
|
63 | slice->setLabelFont(font); | |
56 | } |
|
64 | } | |
57 |
|
65 | |||
58 | // add the series to the chart |
|
66 | // add the series to the chart | |
@@ -60,6 +68,9 void DonutBreakdownChart::addBreakdownSeries(QPieSeries *breakdownSeries, QColor | |||||
60 |
|
68 | |||
61 | // recalculate breakdown donut segments |
|
69 | // recalculate breakdown donut segments | |
62 | recalculateAngles(); |
|
70 | recalculateAngles(); | |
|
71 | ||||
|
72 | // update customize legend markers | |||
|
73 | updateLegendMarkers(); | |||
63 | } |
|
74 | } | |
64 | //![2] |
|
75 | //![2] | |
65 |
|
76 | |||
@@ -67,28 +78,33 void DonutBreakdownChart::addBreakdownSeries(QPieSeries *breakdownSeries, QColor | |||||
67 | void DonutBreakdownChart::recalculateAngles() |
|
78 | void DonutBreakdownChart::recalculateAngles() | |
68 | { |
|
79 | { | |
69 | qreal angle = 0; |
|
80 | qreal angle = 0; | |
70 | foreach (QPieSlice *slice, mainSeries->slices()) { |
|
81 | foreach (QPieSlice *slice, m_mainSeries->slices()) { | |
71 | QPieSeries *s = find(slice->label()); |
|
82 | QPieSeries *breakdownSeries = qobject_cast<MainSlice *>(slice)->breakdownSeries(); | |
72 | if (s) { |
|
83 | breakdownSeries->setPieStartAngle(angle); | |
73 | s->setPieStartAngle(angle); |
|
|||
74 |
|
|
84 | angle += slice->percentage() * 360.0; // full pie is 360.0 | |
75 |
|
|
85 | breakdownSeries->setPieEndAngle(angle); | |
76 | } |
|
|||
77 | } |
|
86 | } | |
78 | } |
|
87 | } | |
79 | //![3] |
|
88 | //![3] | |
80 |
|
89 | |||
81 | //![4] |
|
90 | //![4] | |
82 | QPieSeries *DonutBreakdownChart::find(QString seriesName) const |
|
91 | void DonutBreakdownChart::updateLegendMarkers() | |
83 | { |
|
92 | { | |
84 | // find pieseries by name |
|
93 | // go through all markers | |
85 | foreach (QAbstractSeries *series, QChart::series()) { |
|
94 | foreach (QAbstractSeries *series, QChart::series()) { | |
86 | QPieSeries *s = qobject_cast<QPieSeries*>(series); |
|
95 | foreach (QLegendMarker *marker, legend()->markers(series)) { | |
87 | if (!s) |
|
96 | QPieLegendMarker *pieMarker = qobject_cast<QPieLegendMarker *>(marker); | |
88 | continue; |
|
97 | if (series == m_mainSeries) { | |
89 | if (s->name() == seriesName) |
|
98 | // hide markers from main series | |
90 | return s; |
|
99 | pieMarker->setVisible(false); | |
|
100 | } else { | |||
|
101 | // modify markers from breakdown series | |||
|
102 | pieMarker->setLabel(QString("%1 %2%") | |||
|
103 | .arg(pieMarker->slice()->label()) | |||
|
104 | .arg(pieMarker->slice()->percentage() * 100, 0, 'f', 2)); | |||
|
105 | pieMarker->setFont(QFont("Arial", 8)); | |||
|
106 | } | |||
|
107 | } | |||
91 | } |
|
108 | } | |
92 | return 0; |
|
|||
93 | } |
|
109 | } | |
94 | //![4] |
|
110 | //![4] |
@@ -33,10 +33,10 public: | |||||
33 |
|
33 | |||
34 | private: |
|
34 | private: | |
35 | void recalculateAngles(); |
|
35 | void recalculateAngles(); | |
36 | QPieSeries *find(QString seriesName) const; |
|
36 | void updateLegendMarkers(); | |
37 |
|
37 | |||
38 | private: |
|
38 | private: | |
39 | QPieSeries *mainSeries; |
|
39 | QPieSeries *m_mainSeries; | |
40 | }; |
|
40 | }; | |
41 |
|
41 | |||
42 | #endif // DONUTBREAKDOWNCHART_H |
|
42 | #endif // DONUTBREAKDOWNCHART_H |
@@ -58,7 +58,7 int main(int argc, char *argv[]) | |||||
58 | DonutBreakdownChart *donutBreakdown = new DonutBreakdownChart(); |
|
58 | DonutBreakdownChart *donutBreakdown = new DonutBreakdownChart(); | |
59 | donutBreakdown->setAnimationOptions(QChart::AllAnimations); |
|
59 | donutBreakdown->setAnimationOptions(QChart::AllAnimations); | |
60 | donutBreakdown->setTitle("Total consumption of energy in Finland 2010"); |
|
60 | donutBreakdown->setTitle("Total consumption of energy in Finland 2010"); | |
61 |
donutBreakdown->legend()->set |
|
61 | donutBreakdown->legend()->setAlignment(Qt::AlignRight); | |
62 | donutBreakdown->addBreakdownSeries(series1, Qt::red); |
|
62 | donutBreakdown->addBreakdownSeries(series1, Qt::red); | |
63 | donutBreakdown->addBreakdownSeries(series2, Qt::darkGreen); |
|
63 | donutBreakdown->addBreakdownSeries(series2, Qt::darkGreen); | |
64 | donutBreakdown->addBreakdownSeries(series3, Qt::darkBlue); |
|
64 | donutBreakdown->addBreakdownSeries(series3, Qt::darkBlue); | |
@@ -69,7 +69,7 int main(int argc, char *argv[]) | |||||
69 | QChartView *chartView = new QChartView(donutBreakdown); |
|
69 | QChartView *chartView = new QChartView(donutBreakdown); | |
70 | chartView->setRenderHint(QPainter::Antialiasing); |
|
70 | chartView->setRenderHint(QPainter::Antialiasing); | |
71 | window.setCentralWidget(chartView); |
|
71 | window.setCentralWidget(chartView); | |
72 |
window.resize(800, |
|
72 | window.resize(800, 500); | |
73 | window.show(); |
|
73 | window.show(); | |
74 | //![3] |
|
74 | //![3] | |
75 |
|
75 |
General Comments 0
You need to be logged in to leave comments.
Login now