@@ -0,0 +1,93 | |||
|
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 <QApplication> | |
|
22 | #include <QMainWindow> | |
|
23 | #include <QChartView> | |
|
24 | #include <QBarSeries> | |
|
25 | #include <QBarSet> | |
|
26 | #include <QLegend> | |
|
27 | #include <QBarCategoriesAxis> | |
|
28 | #include <QHorizontalBarSeries> | |
|
29 | ||
|
30 | QTCOMMERCIALCHART_USE_NAMESPACE | |
|
31 | ||
|
32 | int main(int argc, char *argv[]) | |
|
33 | { | |
|
34 | QApplication a(argc, argv); | |
|
35 | ||
|
36 | //![1] | |
|
37 | QBarSet *male = new QBarSet("Male"); | |
|
38 | QBarSet *female = new QBarSet("Female"); | |
|
39 | ||
|
40 | // From wikipedia | |
|
41 | *male << -145596 << -149894 << -167327 << -164118 << -170710 << -169408 << -158395 << -176975 << -191803 << -191198 << -196815 | |
|
42 | << -207826 << -145517 << -113204 << -90986 << -70909 << -40013 << -15887 << -5769; | |
|
43 | ||
|
44 | *female << 139353 << 143522 << 161212 << 156824 << 163226 << 161766 << 150595 << 170779 << 185979 << 187897 << 196158 | |
|
45 | << 209062 << 152460 << 129230 << 114778 << 109611 << 83845 << 44605 << 22328; | |
|
46 | ||
|
47 | //![1] | |
|
48 | ||
|
49 | //![2] | |
|
50 | QHorizontalBarSeries *series = new QHorizontalBarSeries(); | |
|
51 | series->append(male); | |
|
52 | series->append(female); | |
|
53 | series->setBarWidth(0.5); | |
|
54 | series->setGrouping(false); | |
|
55 | //![2] | |
|
56 | ||
|
57 | //![3] | |
|
58 | QChart* chart = new QChart(); | |
|
59 | chart->addSeries(series); | |
|
60 | chart->setTitle("Population of Finland in 2005 by age group"); | |
|
61 | chart->createDefaultAxes(); | |
|
62 | chart->setAnimationOptions(QChart::SeriesAnimations); | |
|
63 | //![3] | |
|
64 | ||
|
65 | //![4] | |
|
66 | QStringList categories; | |
|
67 | categories << "0-4" << "5-9" << "10-14" << "15-19" << "20-24" << "25-29" << "30-34" << "35-39" << "40-44" << "45-49" | |
|
68 | << "50-54" << "55-59" << "60-64" << "65-69" << "70-74" << "75-79" << "80-84" << "85-89" << "90-"; | |
|
69 | ||
|
70 | QBarCategoriesAxis* axis = new QBarCategoriesAxis(); | |
|
71 | axis->append(categories); | |
|
72 | chart->setAxisY(axis,series); | |
|
73 | //![4] | |
|
74 | ||
|
75 | //![5] | |
|
76 | chart->legend()->setVisible(true); | |
|
77 | chart->legend()->setAlignment(Qt::AlignBottom); | |
|
78 | //![5] | |
|
79 | ||
|
80 | //![6] | |
|
81 | QChartView* chartView = new QChartView(chart); | |
|
82 | chartView->setRenderHint(QPainter::Antialiasing); | |
|
83 | //![6] | |
|
84 | ||
|
85 | //![7] | |
|
86 | QMainWindow window; | |
|
87 | window.setCentralWidget(chartView); | |
|
88 | window.resize(400, 800); | |
|
89 | window.show(); | |
|
90 | //![7] | |
|
91 | ||
|
92 | return a.exec(); | |
|
93 | } |
@@ -0,0 +1,6 | |||
|
1 | !include( ../examples.pri ) { | |
|
2 | error( "Couldn't find the examples.pri file!" ) | |
|
3 | } | |
|
4 | ||
|
5 | TARGET = populationpyramid | |
|
6 | SOURCES += main.cpp |
@@ -30,4 +30,5 SUBDIRS += \ | |||
|
30 | 30 | donut \ |
|
31 | 31 | donutbreakdown \ |
|
32 | 32 | scrollchart \ |
|
33 | datetimeaxis | |
|
33 | datetimeaxis \ | |
|
34 | populationpyramid |
@@ -81,8 +81,7 protected: | |||
|
81 | 81 | |
|
82 | 82 | AbstractBarAnimation *m_animation; |
|
83 | 83 | |
|
84 | // Not owned. | |
|
85 | QAbstractBarSeries *m_series; | |
|
84 | QAbstractBarSeries *m_series; // Not owned. | |
|
86 | 85 | QList<Bar *> m_bars; |
|
87 | 86 | QList<QGraphicsSimpleTextItem *> m_labels; |
|
88 | 87 | }; |
@@ -46,7 +46,14 QVector<QRectF> HorizontalBarChartItem::calculateLayout() | |||
|
46 | 46 | qreal rangeX = m_domainMaxX - m_domainMinX; |
|
47 | 47 | qreal scaleY = (height / rangeY); |
|
48 | 48 | qreal scaleX = (width / rangeX); |
|
49 | qreal barHeight = (scaleY / setCount) * m_series->d_func()->barWidth(); // On horizontal chart barWidth of the barseries means height of the rect. | |
|
49 | qreal barHeight; | |
|
50 | ||
|
51 | // On horizontal chart barWidth of the barseries means height of the rect. | |
|
52 | if (m_series->d_func()->m_grouping) { | |
|
53 | barHeight = (scaleY / setCount) * m_series->d_func()->barWidth(); | |
|
54 | } else { | |
|
55 | barHeight = scaleY * m_series->d_func()->barWidth(); | |
|
56 | } | |
|
50 | 57 | |
|
51 | 58 | int itemIndex(0); |
|
52 | 59 | for (int category = 0; category < categoryCount; category++) { |
@@ -55,8 +62,12 QVector<QRectF> HorizontalBarChartItem::calculateLayout() | |||
|
55 | 62 | QBarSetPrivate* barSet = m_series->d_func()->barsetAt(set)->d_ptr.data(); |
|
56 | 63 | |
|
57 | 64 | qreal yPos = m_rect.bottom() + (m_domainMinY - barSet->pos(category)) * scaleY; |
|
58 | yPos += setCount*barHeight/2; | |
|
59 |
yPos |
|
|
65 | if (m_series->d_func()->m_grouping) { | |
|
66 | yPos += setCount*barHeight/2; | |
|
67 | yPos -= set*barHeight; | |
|
68 | } else { | |
|
69 | yPos += barHeight/2; | |
|
70 | } | |
|
60 | 71 | |
|
61 | 72 | qreal barWidth = barSet->value(category) * scaleX; |
|
62 | 73 | Bar* bar = m_bars.at(itemIndex); |
@@ -357,13 +357,22 bool QAbstractBarSeries::isLabelsVisible() const | |||
|
357 | 357 | return d->m_labelsVisible; |
|
358 | 358 | } |
|
359 | 359 | |
|
360 | void QAbstractBarSeries::setGrouping(bool grouping) | |
|
361 | { | |
|
362 | Q_D(QAbstractBarSeries); | |
|
363 | d->setGrouping(grouping); | |
|
364 | } | |
|
365 | ||
|
366 | ||
|
367 | ||
|
360 | 368 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
361 | 369 | |
|
362 | 370 | QAbstractBarSeriesPrivate::QAbstractBarSeriesPrivate(QAbstractBarSeries *q) : |
|
363 | 371 | QAbstractSeriesPrivate(q), |
|
364 | 372 | m_barWidth(0.5), // Default value is 50% of category width |
|
365 | 373 | m_labelsVisible(false), |
|
366 | m_visible(true) | |
|
374 | m_visible(true), | |
|
375 | m_grouping(true) | |
|
367 | 376 | { |
|
368 | 377 | } |
|
369 | 378 | |
@@ -411,6 +420,14 void QAbstractBarSeriesPrivate::setLabelsVisible(bool visible) | |||
|
411 | 420 | emit labelsVisibleChanged(visible); |
|
412 | 421 | } |
|
413 | 422 | |
|
423 | void QAbstractBarSeriesPrivate::setGrouping(bool grouping) | |
|
424 | { | |
|
425 | if (m_grouping != grouping) { | |
|
426 | m_grouping = grouping; | |
|
427 | emit updatedBars(); | |
|
428 | } | |
|
429 | } | |
|
430 | ||
|
414 | 431 | qreal QAbstractBarSeriesPrivate::min() |
|
415 | 432 | { |
|
416 | 433 | if (m_barSets.count() <= 0) { |
@@ -58,6 +58,10 public: | |||
|
58 | 58 | void setLabelsVisible(bool visible = true); |
|
59 | 59 | bool isLabelsVisible() const; |
|
60 | 60 | |
|
61 | // TODO. Good name for this. This affects how bars are laid out on chart. (for example with pyramid chart) | |
|
62 | // Also do we support same for stacked and percent bar charts or just normal bar charts? | |
|
63 | void setGrouping(bool grouping = true); | |
|
64 | ||
|
61 | 65 | protected: |
|
62 | 66 | explicit QAbstractBarSeries(QAbstractBarSeriesPrivate &d,QObject *parent = 0); |
|
63 | 67 |
@@ -52,6 +52,7 public: | |||
|
52 | 52 | |
|
53 | 53 | void setVisible(bool visible); |
|
54 | 54 | void setLabelsVisible(bool visible); |
|
55 | void setGrouping(bool grouping); | |
|
55 | 56 | |
|
56 | 57 | void scaleDomain(Domain& domain); |
|
57 | 58 | ChartElement* createGraphics(ChartPresenter* presenter); |
@@ -91,9 +92,12 protected: | |||
|
91 | 92 | qreal m_barWidth; |
|
92 | 93 | bool m_labelsVisible; |
|
93 | 94 | bool m_visible; |
|
95 | bool m_grouping; | |
|
94 | 96 | |
|
95 | 97 | private: |
|
96 | 98 | Q_DECLARE_PUBLIC(QAbstractBarSeries) |
|
99 | friend class HorizontalBarChartItem; | |
|
100 | friend class BarChartItem; | |
|
97 | 101 | }; |
|
98 | 102 | |
|
99 | 103 | QTCOMMERCIALCHART_END_NAMESPACE |
@@ -48,7 +48,13 QVector<QRectF> BarChartItem::calculateLayout() | |||
|
48 | 48 | qreal rangeX = m_domainMaxX - m_domainMinX; |
|
49 | 49 | qreal scaleY = (height / rangeY); |
|
50 | 50 | qreal scaleX = (width / rangeX); |
|
51 | qreal barWidth = (scaleX / setCount) * m_series->d_func()->barWidth(); | |
|
51 | qreal barWidth; | |
|
52 | ||
|
53 | if (m_series->d_func()->m_grouping) { | |
|
54 | barWidth = (scaleX / setCount) * m_series->d_func()->barWidth(); | |
|
55 | } else { | |
|
56 | barWidth = scaleX * m_series->d_func()->barWidth(); | |
|
57 | } | |
|
52 | 58 | |
|
53 | 59 | int itemIndex(0); |
|
54 | 60 | for (int category = 0; category < categoryCount; category++) { |
@@ -56,9 +62,16 QVector<QRectF> BarChartItem::calculateLayout() | |||
|
56 | 62 | for (int set = 0; set < setCount; set++) { |
|
57 | 63 | QBarSetPrivate* barSet = m_series->d_func()->barsetAt(set)->d_ptr.data(); |
|
58 | 64 | |
|
59 | qreal xPos = (barSet->pos(category) - m_domainMinX) * scaleX + m_rect.left(); | |
|
60 | xPos -= setCount*barWidth/2; | |
|
61 | xPos += set*barWidth; | |
|
65 | qreal xPos; | |
|
66 | ||
|
67 | if (m_series->d_func()->m_grouping) { | |
|
68 | xPos = (barSet->pos(category) - m_domainMinX) * scaleX + m_rect.left(); | |
|
69 | xPos -= setCount*barWidth/2; | |
|
70 | xPos += set*barWidth; | |
|
71 | } else { | |
|
72 | xPos = (barSet->pos(category) - m_domainMinX) * scaleX + m_rect.left() - barWidth/2; | |
|
73 | } | |
|
74 | ||
|
62 | 75 | qreal barHeight = barSet->value(category) * scaleY; |
|
63 | 76 | Bar* bar = m_bars.at(itemIndex); |
|
64 | 77 |
General Comments 0
You need to be logged in to leave comments.
Login now