@@ -0,0 +1,8 | |||||
|
1 | !include( ../examples.pri ) { | |||
|
2 | error( "Couldn't find the examples.pri file!" ) | |||
|
3 | } | |||
|
4 | ||||
|
5 | TARGET = groupedbarchart | |||
|
6 | SOURCES += main.cpp | |||
|
7 | ||||
|
8 | !system_build:mac: QMAKE_POST_LINK += "$$MAC_POST_LINK_PREFIX $$MAC_EXAMPLES_BIN_DIR" |
@@ -0,0 +1,89 | |||||
|
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 <QGroupedBarSeries> | |||
|
25 | #include <QBarSet> | |||
|
26 | #include <QLegend> | |||
|
27 | ||||
|
28 | QTCOMMERCIALCHART_USE_NAMESPACE | |||
|
29 | ||||
|
30 | int main(int argc, char *argv[]) | |||
|
31 | { | |||
|
32 | QApplication a(argc, argv); | |||
|
33 | ||||
|
34 | //![1] | |||
|
35 | QBarCategories categories; | |||
|
36 | categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun"; | |||
|
37 | //![1] | |||
|
38 | ||||
|
39 | //![2] | |||
|
40 | QBarSet *set0 = new QBarSet("Jane"); | |||
|
41 | QBarSet *set1 = new QBarSet("John"); | |||
|
42 | QBarSet *set2 = new QBarSet("Axel"); | |||
|
43 | QBarSet *set3 = new QBarSet("Mary"); | |||
|
44 | QBarSet *set4 = new QBarSet("Samantha"); | |||
|
45 | ||||
|
46 | *set0 << 1 << 2 << 3 << 4 << 5 << 6; | |||
|
47 | *set1 << 5 << 0 << 0 << 4 << 0 << 7; | |||
|
48 | *set2 << 3 << 5 << 8 << 13 << 8 << 5; | |||
|
49 | *set3 << 5 << 6 << 7 << 3 << 4 << 5; | |||
|
50 | *set4 << 9 << 7 << 5 << 3 << 1 << 2; | |||
|
51 | //![2] | |||
|
52 | ||||
|
53 | //![3] | |||
|
54 | QGroupedBarSeries* series = new QGroupedBarSeries(); | |||
|
55 | series->setCategories(categories); | |||
|
56 | series->appendBarSet(set0); | |||
|
57 | series->appendBarSet(set1); | |||
|
58 | series->appendBarSet(set2); | |||
|
59 | series->appendBarSet(set3); | |||
|
60 | series->appendBarSet(set4); | |||
|
61 | ||||
|
62 | //![3] | |||
|
63 | ||||
|
64 | //![4] | |||
|
65 | QChart* chart = new QChart(); | |||
|
66 | chart->addSeries(series); | |||
|
67 | chart->setTitle("Simple grouped barchart example"); | |||
|
68 | //![4] | |||
|
69 | ||||
|
70 | //![5] | |||
|
71 | chart->legend()->setVisible(true); | |||
|
72 | chart->legend()->setAlignment(QLegend::AlignmentBottom); | |||
|
73 | chart->axisY()->setNiceNumbersEnabled(true); | |||
|
74 | //![5] | |||
|
75 | ||||
|
76 | //![6] | |||
|
77 | QChartView* chartView = new QChartView(chart); | |||
|
78 | chartView->setRenderHint(QPainter::Antialiasing); | |||
|
79 | //![6] | |||
|
80 | ||||
|
81 | //![7] | |||
|
82 | QMainWindow window; | |||
|
83 | window.setCentralWidget(chartView); | |||
|
84 | window.resize(400, 300); | |||
|
85 | window.show(); | |||
|
86 | //![7] | |||
|
87 | ||||
|
88 | return a.exec(); | |||
|
89 | } |
@@ -0,0 +1,87 | |||||
|
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 "groupedbarchartitem_p.h" | |||
|
22 | #include "bar_p.h" | |||
|
23 | #include "barlabel_p.h" | |||
|
24 | #include "qbarset_p.h" | |||
|
25 | #include "qbarseries_p.h" | |||
|
26 | #include "qbarset.h" | |||
|
27 | ||||
|
28 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | |||
|
29 | ||||
|
30 | GroupedBarChartItem::GroupedBarChartItem(QBarSeries *series, ChartPresenter *presenter) : | |||
|
31 | BarChartItem(series, presenter) | |||
|
32 | { | |||
|
33 | } | |||
|
34 | ||||
|
35 | QVector<QRectF> GroupedBarChartItem::calculateLayout() | |||
|
36 | { | |||
|
37 | QVector<QRectF> layout; | |||
|
38 | ||||
|
39 | // Use temporary qreals for accurancy | |||
|
40 | qreal categoryCount = m_series->categoryCount(); | |||
|
41 | qreal setCount = m_series->barsetCount(); | |||
|
42 | ||||
|
43 | // Domain: | |||
|
44 | qreal width = geometry().width(); | |||
|
45 | qreal height = geometry().height(); | |||
|
46 | qreal range = m_domainMaxY - m_domainMinY; | |||
|
47 | qreal scale = (height / range); | |||
|
48 | qreal categoryWidth = width / categoryCount; | |||
|
49 | qreal barWidth = categoryWidth / (setCount+1); | |||
|
50 | ||||
|
51 | int itemIndex(0); | |||
|
52 | for (int category = 0; category < categoryCount; category++) { | |||
|
53 | qreal xPos = categoryWidth * category + barWidth / 2 + geometry().topLeft().x(); | |||
|
54 | qreal yPos = height + scale * m_domainMinY + geometry().topLeft().y(); | |||
|
55 | for (int set = 0; set < setCount; set++) { | |||
|
56 | QBarSet* barSet = m_series->d_func()->barsetAt(set); | |||
|
57 | ||||
|
58 | qreal barHeight = barSet->at(category).y() * scale; | |||
|
59 | Bar* bar = m_bars.at(itemIndex); | |||
|
60 | ||||
|
61 | QRectF rect(xPos, yPos - barHeight, barWidth, barHeight); | |||
|
62 | layout.append(rect); | |||
|
63 | bar->setPen(barSet->pen()); | |||
|
64 | bar->setBrush(barSet->brush()); | |||
|
65 | ||||
|
66 | BarLabel* label = m_labels.at(itemIndex); | |||
|
67 | ||||
|
68 | if (!qFuzzyIsNull(barSet->at(category).y())) { | |||
|
69 | label->setText(QString::number(barSet->at(category).y())); | |||
|
70 | } else { | |||
|
71 | label->setText(QString("")); | |||
|
72 | } | |||
|
73 | ||||
|
74 | label->setPos(xPos + (rect.width()/2 - label->boundingRect().width()/2) | |||
|
75 | ,yPos - barHeight/2 - label->boundingRect().height()/2); | |||
|
76 | label->setFont(barSet->labelFont()); | |||
|
77 | ||||
|
78 | itemIndex++; | |||
|
79 | xPos += barWidth; | |||
|
80 | } | |||
|
81 | } | |||
|
82 | return layout; | |||
|
83 | } | |||
|
84 | ||||
|
85 | #include "moc_groupedbarchartitem_p.cpp" | |||
|
86 | ||||
|
87 | QTCOMMERCIALCHART_END_NAMESPACE |
@@ -0,0 +1,47 | |||||
|
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 GROUPEDBARCHARTITEM_H | |||
|
22 | #define GROUPEDBARCHARTITEM_H | |||
|
23 | ||||
|
24 | #include "barchartitem_p.h" | |||
|
25 | #include "qstackedbarseries.h" | |||
|
26 | #include <QGraphicsItem> | |||
|
27 | ||||
|
28 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | |||
|
29 | ||||
|
30 | class GroupedBarChartItem : public BarChartItem | |||
|
31 | { | |||
|
32 | Q_OBJECT | |||
|
33 | public: | |||
|
34 | GroupedBarChartItem(QBarSeries *series, ChartPresenter *presenter); | |||
|
35 | ||||
|
36 | private: | |||
|
37 | // From BarChartItem | |||
|
38 | virtual QVector<QRectF> calculateLayout(); | |||
|
39 | ||||
|
40 | private: | |||
|
41 | ||||
|
42 | // Data | |||
|
43 | }; | |||
|
44 | ||||
|
45 | QTCOMMERCIALCHART_END_NAMESPACE | |||
|
46 | ||||
|
47 | #endif // GROUPEDBARCHARTITEM_H |
@@ -0,0 +1,108 | |||||
|
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 "qgroupedbarseries.h" | |||
|
22 | #include "qgroupedbarseries_p.h" | |||
|
23 | #include "groupedbarchartitem_p.h" | |||
|
24 | #include "chartdataset_p.h" | |||
|
25 | #include "charttheme_p.h" | |||
|
26 | #include "chartanimator_p.h" | |||
|
27 | ||||
|
28 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | |||
|
29 | ||||
|
30 | /*! | |||
|
31 | \class QGroupedBarSeries | |||
|
32 | \brief part of QtCommercial chart API. | |||
|
33 | \mainclass | |||
|
34 | ||||
|
35 | QGroupedBarSeries represents a series of data shown as bars. All bars in same category are | |||
|
36 | grouped next to each other. One QGroupedBarSeries can contain multiple QBarSet data sets. | |||
|
37 | QGroupedBarSeries groups the data from sets to categories, which are defined by QStringList. | |||
|
38 | ||||
|
39 | See the \l {GroupedbarChart Example} {grouped bar chart example} to learn how to create a grouped bar chart. | |||
|
40 | \image examples_groupedbarchart.png | |||
|
41 | ||||
|
42 | \sa QBarSet, QPercentBarSeries, QBarSeries, QStackedBarSeries | |||
|
43 | */ | |||
|
44 | ||||
|
45 | /*! | |||
|
46 | \fn virtual QSeriesType QGroupedBarSeries::type() const | |||
|
47 | \brief Returns type of series. | |||
|
48 | \sa QSeriesType | |||
|
49 | */ | |||
|
50 | ||||
|
51 | /*! | |||
|
52 | Constructs empty QGroupedBarSeries. Parameter \a categories defines the categories for chart. | |||
|
53 | QGroupedBarSeries is QObject which is a child of a \a parent. | |||
|
54 | */ | |||
|
55 | QGroupedBarSeries::QGroupedBarSeries(QObject *parent) | |||
|
56 | : QBarSeries(*new QGroupedBarSeriesPrivate(this), parent) | |||
|
57 | { | |||
|
58 | } | |||
|
59 | ||||
|
60 | QAbstractSeries::SeriesType QGroupedBarSeries::type() const | |||
|
61 | { | |||
|
62 | return QAbstractSeries::SeriesTypeGroupedBar; | |||
|
63 | } | |||
|
64 | ||||
|
65 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
|
66 | ||||
|
67 | QGroupedBarSeriesPrivate::QGroupedBarSeriesPrivate(/*QBarCategories categories,*/ QGroupedBarSeries *q) : QBarSeriesPrivate(/*categories,*/q) | |||
|
68 | { | |||
|
69 | ||||
|
70 | } | |||
|
71 | ||||
|
72 | void QGroupedBarSeriesPrivate::scaleDomain(Domain& domain) | |||
|
73 | { | |||
|
74 | qreal minX(domain.minX()); | |||
|
75 | qreal minY(domain.minY()); | |||
|
76 | qreal maxX(domain.maxX()); | |||
|
77 | qreal maxY(domain.maxY()); | |||
|
78 | int tickXCount(domain.tickXCount()); | |||
|
79 | int tickYCount(domain.tickYCount()); | |||
|
80 | ||||
|
81 | qreal x = m_categories.count(); | |||
|
82 | qreal y = maxCategorySum(); | |||
|
83 | minX = qMin(minX, x); | |||
|
84 | minY = qMin(minY, y); | |||
|
85 | maxX = qMax(maxX, x); | |||
|
86 | maxY = qMax(maxY, y); | |||
|
87 | tickXCount = x+1; | |||
|
88 | ||||
|
89 | domain.setRange(minX,maxX,minY,maxY,tickXCount,tickYCount); | |||
|
90 | } | |||
|
91 | ||||
|
92 | ||||
|
93 | Chart* QGroupedBarSeriesPrivate::createGraphics(ChartPresenter* presenter) | |||
|
94 | { | |||
|
95 | Q_Q(QGroupedBarSeries); | |||
|
96 | ||||
|
97 | GroupedBarChartItem* bar = new GroupedBarChartItem(q,presenter); | |||
|
98 | if(presenter->animationOptions().testFlag(QChart::SeriesAnimations)) { | |||
|
99 | presenter->animator()->addAnimation(bar); | |||
|
100 | } | |||
|
101 | presenter->chartTheme()->decorate(q, presenter->dataSet()->seriesIndex(q)); | |||
|
102 | return bar; | |||
|
103 | } | |||
|
104 | ||||
|
105 | #include "moc_qgroupedbarseries.cpp" | |||
|
106 | ||||
|
107 | QTCOMMERCIALCHART_END_NAMESPACE | |||
|
108 |
@@ -0,0 +1,45 | |||||
|
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 GROUPEDBARSERIES_H | |||
|
22 | #define GROUPEDBARSERIES_H | |||
|
23 | ||||
|
24 | #include <QStringList> | |||
|
25 | #include <qbarseries.h> | |||
|
26 | ||||
|
27 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | |||
|
28 | ||||
|
29 | class QGroupedBarSeriesPrivate; | |||
|
30 | ||||
|
31 | class QTCOMMERCIALCHART_EXPORT QGroupedBarSeries : public QBarSeries | |||
|
32 | { | |||
|
33 | Q_OBJECT | |||
|
34 | public: | |||
|
35 | explicit QGroupedBarSeries(QObject *parent = 0); | |||
|
36 | QAbstractSeries::SeriesType type() const; | |||
|
37 | ||||
|
38 | private: | |||
|
39 | Q_DECLARE_PRIVATE(QGroupedBarSeries) | |||
|
40 | Q_DISABLE_COPY(QGroupedBarSeries) | |||
|
41 | }; | |||
|
42 | ||||
|
43 | QTCOMMERCIALCHART_END_NAMESPACE | |||
|
44 | ||||
|
45 | #endif // GROUPEDBARSERIES_H |
@@ -0,0 +1,52 | |||||
|
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 | // W A R N I N G | |||
|
22 | // ------------- | |||
|
23 | // | |||
|
24 | // This file is not part of the QtCommercial Chart API. It exists purely as an | |||
|
25 | // implementation detail. This header file may change from version to | |||
|
26 | // version without notice, or even be removed. | |||
|
27 | // | |||
|
28 | // We mean it. | |||
|
29 | ||||
|
30 | #ifndef QGROUPEDBARSERIES_P_H | |||
|
31 | #define QGROUPEDBARSERIES_P_H | |||
|
32 | ||||
|
33 | #include "qbarseries_p.h" | |||
|
34 | #include "domain_p.h" | |||
|
35 | ||||
|
36 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | |||
|
37 | ||||
|
38 | ||||
|
39 | class QGroupedBarSeriesPrivate: public QBarSeriesPrivate | |||
|
40 | { | |||
|
41 | public: | |||
|
42 | QGroupedBarSeriesPrivate(QGroupedBarSeries* q); | |||
|
43 | Chart* createGraphics(ChartPresenter* presenter); | |||
|
44 | void scaleDomain(Domain& domain); | |||
|
45 | ||||
|
46 | private: | |||
|
47 | Q_DECLARE_PUBLIC(QGroupedBarSeries) | |||
|
48 | }; | |||
|
49 | ||||
|
50 | QTCOMMERCIALCHART_END_NAMESPACE | |||
|
51 | ||||
|
52 | #endif // QGROUPEDBARSERIES_P_H |
@@ -43,11 +43,11 int main(int argc, char *argv[]) | |||||
43 | QBarSet *set3 = new QBarSet("Mary"); |
|
43 | QBarSet *set3 = new QBarSet("Mary"); | |
44 | QBarSet *set4 = new QBarSet("Samantha"); |
|
44 | QBarSet *set4 = new QBarSet("Samantha"); | |
45 |
|
45 | |||
46 | *set0 << 1 << 2 << 3 << 4 << 5 << 6; |
|
46 | *set0 << QPointF(0.0, 1) << QPointF(1.0, 2) << QPointF(2.0, 3) << QPointF(3.0, 4) << QPointF(4.0, 5) << QPointF(5.0, 6); | |
47 | *set1 << 5 << 0 << 0 << 4 << 0 << 7; |
|
47 | *set1 << QPointF(0.2, 2) << QPointF(1.2, 3) << QPointF(2.2, 4) << QPointF(3.2, 5) << QPointF(4.2, 6) << QPointF(5.2, 7); | |
48 | *set2 << 3 << 5 << 8 << 13 << 8 << 5; |
|
48 | *set2 << QPointF(0.4, 3) << QPointF(1.4, 4) << QPointF(2.4, 5) << QPointF(3.4, 6) << QPointF(4.4, 7) << QPointF(5.4, 8); | |
49 | *set3 << 5 << 6 << 7 << 3 << 4 << 5; |
|
49 | *set3 << QPointF(0.6, 4) << QPointF(1.6, 5) << QPointF(2.6, 6) << QPointF(3.6, 7) << QPointF(4.6, 8) << QPointF(5.6, 9); | |
50 | *set4 << 9 << 7 << 5 << 3 << 1 << 2; |
|
50 | *set4 << QPointF(0.8, 5) << QPointF(1.8, 6) << QPointF(2.8, 7) << QPointF(3.8, 8) << QPointF(4.8, 9) << QPointF(5.8, 10); | |
51 | //![2] |
|
51 | //![2] | |
52 |
|
52 | |||
53 | //![3] |
|
53 | //![3] | |
@@ -58,6 +58,7 int main(int argc, char *argv[]) | |||||
58 | series->appendBarSet(set2); |
|
58 | series->appendBarSet(set2); | |
59 | series->appendBarSet(set3); |
|
59 | series->appendBarSet(set3); | |
60 | series->appendBarSet(set4); |
|
60 | series->appendBarSet(set4); | |
|
61 | ||||
61 | //![3] |
|
62 | //![3] | |
62 |
|
63 | |||
63 | //![4] |
|
64 | //![4] |
@@ -19,4 +19,5 SUBDIRS += \ | |||||
19 | stackedbarchart \ |
|
19 | stackedbarchart \ | |
20 | stackedbarchartdrilldown \ |
|
20 | stackedbarchartdrilldown \ | |
21 | zoomlinechart \ |
|
21 | zoomlinechart \ | |
22 |
modeldata |
|
22 | modeldata \ | |
|
23 | groupedbarchart |
@@ -5,27 +5,32 SOURCES += \ | |||||
5 | $$PWD/bar.cpp \ |
|
5 | $$PWD/bar.cpp \ | |
6 | $$PWD/barchartitem.cpp \ |
|
6 | $$PWD/barchartitem.cpp \ | |
7 | $$PWD/percentbarchartitem.cpp \ |
|
7 | $$PWD/percentbarchartitem.cpp \ | |
|
8 | $$PWD/groupedbarchartitem.cpp \ | |||
8 | $$PWD/qbarseries.cpp \ |
|
9 | $$PWD/qbarseries.cpp \ | |
9 | $$PWD/qbarset.cpp \ |
|
10 | $$PWD/qbarset.cpp \ | |
10 | $$PWD/qpercentbarseries.cpp \ |
|
11 | $$PWD/qpercentbarseries.cpp \ | |
11 | $$PWD/qstackedbarseries.cpp \ |
|
12 | $$PWD/qstackedbarseries.cpp \ | |
|
13 | $$PWD/qgroupedbarseries.cpp \ | |||
12 | $$PWD/stackedbarchartitem.cpp \ |
|
14 | $$PWD/stackedbarchartitem.cpp \ | |
13 | $$PWD/barlabel.cpp |
|
15 | $$PWD/barlabel.cpp \ | |
14 |
|
16 | |||
15 | PRIVATE_HEADERS += \ |
|
17 | PRIVATE_HEADERS += \ | |
16 | $$PWD/bar_p.h \ |
|
18 | $$PWD/bar_p.h \ | |
17 | $$PWD/barchartitem_p.h \ |
|
19 | $$PWD/barchartitem_p.h \ | |
18 | $$PWD/percentbarchartitem_p.h \ |
|
20 | $$PWD/percentbarchartitem_p.h \ | |
19 | $$PWD/stackedbarchartitem_p.h \ |
|
21 | $$PWD/stackedbarchartitem_p.h \ | |
|
22 | $$PWD/groupedbarchartitem_p.h \ | |||
20 | $$PWD/barlabel_p.h \ |
|
23 | $$PWD/barlabel_p.h \ | |
21 | $$PWD/qbarset_p.h \ |
|
24 | $$PWD/qbarset_p.h \ | |
22 | $$PWD/qbarseries_p.h \ |
|
25 | $$PWD/qbarseries_p.h \ | |
23 | $$PWD/qstackedbarseries_p.h\ |
|
26 | $$PWD/qstackedbarseries_p.h\ | |
24 | $$PWD/qpercentbarseries_p.h |
|
27 | $$PWD/qpercentbarseries_p.h \ | |
|
28 | $$PWD/qgroupedbarseries_p.h \ | |||
25 |
|
29 | |||
26 | PUBLIC_HEADERS += \ |
|
30 | PUBLIC_HEADERS += \ | |
27 | $$PWD/qbarseries.h \ |
|
31 | $$PWD/qbarseries.h \ | |
28 | $$PWD/qbarset.h \ |
|
32 | $$PWD/qbarset.h \ | |
29 | $$PWD/qpercentbarseries.h \ |
|
33 | $$PWD/qpercentbarseries.h \ | |
30 | $$PWD/qstackedbarseries.h |
|
34 | $$PWD/qstackedbarseries.h \ | |
|
35 | $$PWD/qgroupedbarseries.h | |||
31 |
|
36 |
@@ -111,30 +111,32 QVector<QRectF> BarChartItem::calculateLayout() | |||||
111 | // Domain: |
|
111 | // Domain: | |
112 | qreal width = geometry().width(); |
|
112 | qreal width = geometry().width(); | |
113 | qreal height = geometry().height(); |
|
113 | qreal height = geometry().height(); | |
114 | qreal range = m_domainMaxY - m_domainMinY; |
|
114 | qreal rangeY = m_domainMaxY - m_domainMinY; | |
115 | qreal scale = (height / range); |
|
115 | qreal rangeX = m_domainMaxX - m_domainMinX; | |
|
116 | qreal scaleY = (height / rangeY); | |||
|
117 | qreal scaleX = (width / rangeX); | |||
116 | qreal categoryWidth = width / categoryCount; |
|
118 | qreal categoryWidth = width / categoryCount; | |
117 |
qreal barWidth = categoryWidth |
|
119 | qreal barWidth = categoryWidth - categoryWidth * m_series->d_func()->barMargin(); | |
118 |
|
120 | |||
119 | int itemIndex(0); |
|
121 | int itemIndex(0); | |
120 | for (int category = 0; category < categoryCount; category++) { |
|
122 | for (int category = 0; category < categoryCount; category++) { | |
121 |
qreal |
|
123 | qreal yPos = height + scaleY * m_domainMinY + geometry().topLeft().y(); | |
122 | qreal yPos = height + scale * m_domainMinY + geometry().topLeft().y(); |
|
|||
123 | for (int set = 0; set < setCount; set++) { |
|
124 | for (int set = 0; set < setCount; set++) { | |
124 | QBarSet* barSet = m_series->d_func()->barsetAt(set); |
|
125 | QBarSet* barSet = m_series->d_func()->barsetAt(set); | |
|
126 | qreal xPos = (barSet->at(category).x() - m_domainMinX) * scaleX + m_rect.left() - barWidth/2; | |||
|
127 | qreal barHeight = barSet->at(category).y() * scaleY; | |||
125 |
|
128 | |||
126 | qreal barHeight = barSet->at(category) * scale; |
|
|||
127 | Bar* bar = m_bars.at(itemIndex); |
|
129 | Bar* bar = m_bars.at(itemIndex); | |
128 |
|
||||
129 | QRectF rect(xPos, yPos - barHeight, barWidth, barHeight); |
|
130 | QRectF rect(xPos, yPos - barHeight, barWidth, barHeight); | |
|
131 | ||||
130 | layout.append(rect); |
|
132 | layout.append(rect); | |
131 | bar->setPen(barSet->pen()); |
|
133 | bar->setPen(barSet->pen()); | |
132 | bar->setBrush(barSet->brush()); |
|
134 | bar->setBrush(barSet->brush()); | |
133 |
|
135 | |||
134 | BarLabel* label = m_labels.at(itemIndex); |
|
136 | BarLabel* label = m_labels.at(itemIndex); | |
135 |
|
137 | |||
136 | if (!qFuzzyIsNull(barSet->at(category))) { |
|
138 | if (!qFuzzyIsNull(barSet->at(category).y())) { | |
137 | label->setText(QString::number(barSet->at(category))); |
|
139 | label->setText(QString::number(barSet->at(category).y())); | |
138 | } else { |
|
140 | } else { | |
139 | label->setText(QString("")); |
|
141 | label->setText(QString("")); | |
140 | } |
|
142 | } | |
@@ -144,9 +146,9 QVector<QRectF> BarChartItem::calculateLayout() | |||||
144 | label->setFont(barSet->labelFont()); |
|
146 | label->setFont(barSet->labelFont()); | |
145 |
|
147 | |||
146 | itemIndex++; |
|
148 | itemIndex++; | |
147 | xPos += barWidth; |
|
|||
148 | } |
|
149 | } | |
149 | } |
|
150 | } | |
|
151 | ||||
150 | return layout; |
|
152 | return layout; | |
151 | } |
|
153 | } | |
152 |
|
154 |
@@ -55,7 +55,7 QVector<QRectF> PercentBarChartItem::calculateLayout() | |||||
55 | qreal yPos = height + domainScale * m_domainMinY + geometry().topLeft().y(); |
|
55 | qreal yPos = height + domainScale * m_domainMinY + geometry().topLeft().y(); | |
56 | for (int set=0; set < m_series->barsetCount(); set++) { |
|
56 | for (int set=0; set < m_series->barsetCount(); set++) { | |
57 | QBarSet* barSet = m_series->d_func()->barsetAt(set); |
|
57 | QBarSet* barSet = m_series->d_func()->barsetAt(set); | |
58 | qreal barHeight = barSet->at(category) * percentage * domainScale; |
|
58 | qreal barHeight = barSet->at(category).y() * percentage * domainScale; | |
59 | Bar* bar = m_bars.at(itemIndex); |
|
59 | Bar* bar = m_bars.at(itemIndex); | |
60 | bar->setPen(barSet->pen()); |
|
60 | bar->setPen(barSet->pen()); | |
61 | bar->setBrush(barSet->brush()); |
|
61 | bar->setBrush(barSet->brush()); |
@@ -260,9 +260,9 void QBarSeries::setLabelsVisible(bool visible) | |||||
260 |
|
260 | |||
261 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
261 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
262 |
|
262 | |||
263 |
QBarSeriesPrivate::QBarSeriesPrivate( |
|
263 | QBarSeriesPrivate::QBarSeriesPrivate(QBarSeries *q) : | |
264 | QAbstractSeriesPrivate(q), |
|
264 | QAbstractSeriesPrivate(q), | |
265 | // m_categories(categories), |
|
265 | m_barMargin(0.05), // Default value is 5% of category width | |
266 | m_mapCategories(-1), |
|
266 | m_mapCategories(-1), | |
267 | m_mapBarBottom(-1), |
|
267 | m_mapBarBottom(-1), | |
268 | m_mapBarTop(-1) |
|
268 | m_mapBarTop(-1) | |
@@ -274,6 +274,22 void QBarSeriesPrivate::setCategories(QBarCategories categories) | |||||
274 | m_categories = categories; |
|
274 | m_categories = categories; | |
275 | } |
|
275 | } | |
276 |
|
276 | |||
|
277 | void QBarSeriesPrivate::setBarMargin(qreal margin) | |||
|
278 | { | |||
|
279 | if (margin > 1.0) { | |||
|
280 | margin = 1.0; | |||
|
281 | } else if (margin < 0.0) { | |||
|
282 | margin = 0.0; | |||
|
283 | } | |||
|
284 | ||||
|
285 | m_barMargin = margin; | |||
|
286 | emit updatedBars(); | |||
|
287 | } | |||
|
288 | ||||
|
289 | qreal QBarSeriesPrivate::barMargin() | |||
|
290 | { | |||
|
291 | return m_barMargin; | |||
|
292 | } | |||
277 |
|
293 | |||
278 | QBarSet* QBarSeriesPrivate::barsetAt(int index) |
|
294 | QBarSet* QBarSeriesPrivate::barsetAt(int index) | |
279 | { |
|
295 | { | |
@@ -295,7 +311,7 qreal QBarSeriesPrivate::min() | |||||
295 | for (int i = 0; i < m_barSets.count(); i++) { |
|
311 | for (int i = 0; i < m_barSets.count(); i++) { | |
296 | int categoryCount = m_barSets.at(i)->count(); |
|
312 | int categoryCount = m_barSets.at(i)->count(); | |
297 | for (int j = 0; j < categoryCount; j++) { |
|
313 | for (int j = 0; j < categoryCount; j++) { | |
298 | qreal temp = m_barSets.at(i)->at(j); |
|
314 | qreal temp = m_barSets.at(i)->at(j).y(); | |
299 | if (temp < min) |
|
315 | if (temp < min) | |
300 | min = temp; |
|
316 | min = temp; | |
301 | } |
|
317 | } | |
@@ -313,7 +329,7 qreal QBarSeriesPrivate::max() | |||||
313 | for (int i = 0; i < m_barSets.count(); i++) { |
|
329 | for (int i = 0; i < m_barSets.count(); i++) { | |
314 | int categoryCount = m_barSets.at(i)->count(); |
|
330 | int categoryCount = m_barSets.at(i)->count(); | |
315 | for (int j = 0; j < categoryCount; j++) { |
|
331 | for (int j = 0; j < categoryCount; j++) { | |
316 | qreal temp = m_barSets.at(i)->at(j); |
|
332 | qreal temp = m_barSets.at(i)->at(j).y(); | |
317 | if (temp > max) |
|
333 | if (temp > max) | |
318 | max = temp; |
|
334 | max = temp; | |
319 | } |
|
335 | } | |
@@ -332,7 +348,7 qreal QBarSeriesPrivate::valueAt(int set, int category) | |||||
332 | return 0; |
|
348 | return 0; | |
333 | } |
|
349 | } | |
334 |
|
350 | |||
335 | return m_barSets.at(set)->at(category); |
|
351 | return m_barSets.at(set)->at(category).y(); | |
336 | } |
|
352 | } | |
337 |
|
353 | |||
338 | qreal QBarSeriesPrivate::percentageAt(int set, int category) |
|
354 | qreal QBarSeriesPrivate::percentageAt(int set, int category) | |
@@ -345,7 +361,7 qreal QBarSeriesPrivate::percentageAt(int set, int category) | |||||
345 | return 0; |
|
361 | return 0; | |
346 | } |
|
362 | } | |
347 |
|
363 | |||
348 | qreal value = m_barSets.at(set)->at(category); |
|
364 | qreal value = m_barSets.at(set)->at(category).y(); | |
349 | qreal sum = categorySum(category); |
|
365 | qreal sum = categorySum(category); | |
350 | if ( qFuzzyIsNull(sum) ) { |
|
366 | if ( qFuzzyIsNull(sum) ) { | |
351 | return 0; |
|
367 | return 0; | |
@@ -360,7 +376,7 qreal QBarSeriesPrivate::categorySum(int category) | |||||
360 | int count = m_barSets.count(); // Count sets |
|
376 | int count = m_barSets.count(); // Count sets | |
361 | for (int set = 0; set < count; set++) { |
|
377 | for (int set = 0; set < count; set++) { | |
362 | if (category < m_barSets.at(set)->count()) |
|
378 | if (category < m_barSets.at(set)->count()) | |
363 | sum += m_barSets.at(set)->at(category); |
|
379 | sum += m_barSets.at(set)->at(category).y(); | |
364 | } |
|
380 | } | |
365 | return sum; |
|
381 | return sum; | |
366 | } |
|
382 | } | |
@@ -371,7 +387,7 qreal QBarSeriesPrivate::absoluteCategorySum(int category) | |||||
371 | int count = m_barSets.count(); // Count sets |
|
387 | int count = m_barSets.count(); // Count sets | |
372 | for (int set = 0; set < count; set++) { |
|
388 | for (int set = 0; set < count; set++) { | |
373 | if (category < m_barSets.at(set)->count()) |
|
389 | if (category < m_barSets.at(set)->count()) | |
374 | sum += qAbs(m_barSets.at(set)->at(category)); |
|
390 | sum += qAbs(m_barSets.at(set)->at(category).y()); | |
375 | } |
|
391 | } | |
376 | return sum; |
|
392 | return sum; | |
377 | } |
|
393 | } |
@@ -39,7 +39,7 class QTCOMMERCIALCHART_EXPORT QBarSeries : public QAbstractSeries | |||||
39 | { |
|
39 | { | |
40 | Q_OBJECT |
|
40 | Q_OBJECT | |
41 | public: |
|
41 | public: | |
42 |
explicit QBarSeries( |
|
42 | explicit QBarSeries(QObject *parent = 0); | |
43 | virtual ~QBarSeries(); |
|
43 | virtual ~QBarSeries(); | |
44 |
|
44 | |||
45 | QAbstractSeries::SeriesType type() const; |
|
45 | QAbstractSeries::SeriesType type() const; | |
@@ -55,9 +55,6 public: | |||||
55 | QBarCategories categories() const; |
|
55 | QBarCategories categories() const; | |
56 |
|
56 | |||
57 | void setLabelsVisible(bool visible = true); |
|
57 | void setLabelsVisible(bool visible = true); | |
58 | // TODO: |
|
|||
59 | // void setGroupedDrawing(bool on = true); // By default this is on. Bars are grouped next to each other. If off, bars are drawn at their x-position (propably on top of each other) |
|
|||
60 | // void setBarMargin(int margin); // Margin that is left between bars (if drawn as grouped bars) |
|
|||
61 |
|
58 | |||
62 | void setModel(QAbstractItemModel *model); |
|
59 | void setModel(QAbstractItemModel *model); | |
63 | // void setModelMapping(int categories, int bottomBoundary, int topBoundary, Qt::Orientation orientation = Qt::Vertical); |
|
60 | // void setModelMapping(int categories, int bottomBoundary, int topBoundary, Qt::Orientation orientation = Qt::Vertical); | |
@@ -75,6 +72,7 protected: | |||||
75 | friend class BarChartItem; |
|
72 | friend class BarChartItem; | |
76 | friend class PercentBarChartItem; |
|
73 | friend class PercentBarChartItem; | |
77 | friend class StackedBarChartItem; |
|
74 | friend class StackedBarChartItem; | |
|
75 | friend class GroupedBarChartItem; | |||
78 | }; |
|
76 | }; | |
79 |
|
77 | |||
80 | QTCOMMERCIALCHART_END_NAMESPACE |
|
78 | QTCOMMERCIALCHART_END_NAMESPACE |
@@ -15,8 +15,10 class QBarSeriesPrivate : public QAbstractSeriesPrivate | |||||
15 | { |
|
15 | { | |
16 | Q_OBJECT |
|
16 | Q_OBJECT | |
17 | public: |
|
17 | public: | |
18 |
QBarSeriesPrivate( |
|
18 | QBarSeriesPrivate(QBarSeries *parent); | |
19 | void setCategories(QBarCategories categories); |
|
19 | void setCategories(QBarCategories categories); | |
|
20 | void setBarMargin(qreal margin); | |||
|
21 | qreal barMargin(); | |||
20 |
|
22 | |||
21 | void scaleDomain(Domain& domain); |
|
23 | void scaleDomain(Domain& domain); | |
22 | Chart* createGraphics(ChartPresenter* presenter); |
|
24 | Chart* createGraphics(ChartPresenter* presenter); | |
@@ -57,6 +59,7 protected: | |||||
57 | QList<QBarSet *> m_barSets; |
|
59 | QList<QBarSet *> m_barSets; | |
58 | QBarCategories m_categories; |
|
60 | QBarCategories m_categories; | |
59 |
|
61 | |||
|
62 | qreal m_barMargin; | |||
60 | int m_mapCategories; |
|
63 | int m_mapCategories; | |
61 | int m_mapBarBottom; |
|
64 | int m_mapBarBottom; | |
62 | int m_mapBarTop; |
|
65 | int m_mapBarTop; |
@@ -84,12 +84,38 QString QBarSet::name() const | |||||
84 | return d_ptr->m_name; |
|
84 | return d_ptr->m_name; | |
85 | } |
|
85 | } | |
86 |
|
86 | |||
|
87 | void QBarSet::append(const QPointF value) | |||
|
88 | { | |||
|
89 | d_ptr->m_values.append(value); | |||
|
90 | emit d_ptr->restructuredBars(); | |||
|
91 | } | |||
|
92 | ||||
|
93 | ||||
|
94 | void QBarSet::append(const QList<QPointF> values) | |||
|
95 | { | |||
|
96 | for (int i=0; i<values.count(); i++) { | |||
|
97 | d_ptr->m_values.append(values.at(i)); | |||
|
98 | } | |||
|
99 | emit d_ptr->restructuredBars(); | |||
|
100 | } | |||
|
101 | ||||
87 | /*! |
|
102 | /*! | |
88 | Appends new value \a value to the end of set. |
|
103 | Appends new value \a value to the end of set. | |
89 | */ |
|
104 | */ | |
90 | void QBarSet::append(const qreal value) |
|
105 | void QBarSet::append(const qreal value) | |
91 | { |
|
106 | { | |
92 |
d_ptr->m_values. |
|
107 | append(QPointF(d_ptr->m_values.count(), value)); | |
|
108 | // d_ptr->m_values.append(value); | |||
|
109 | } | |||
|
110 | ||||
|
111 | ||||
|
112 | void QBarSet::append(const QList<qreal> values) | |||
|
113 | { | |||
|
114 | int index = d_ptr->m_values.count(); | |||
|
115 | for (int i=0; i<values.count(); i++) { | |||
|
116 | d_ptr->m_values.append(QPointF(index,values.at(i))); | |||
|
117 | index++; | |||
|
118 | } | |||
93 | emit d_ptr->restructuredBars(); |
|
119 | emit d_ptr->restructuredBars(); | |
94 | } |
|
120 | } | |
95 |
|
121 | |||
@@ -102,6 +128,12 QBarSet& QBarSet::operator << (const qreal &value) | |||||
102 | return *this; |
|
128 | return *this; | |
103 | } |
|
129 | } | |
104 |
|
130 | |||
|
131 | QBarSet& QBarSet::operator << (const QPointF &value) | |||
|
132 | { | |||
|
133 | append(value); | |||
|
134 | return *this; | |||
|
135 | } | |||
|
136 | ||||
105 | /*! |
|
137 | /*! | |
106 | Inserts new \a value on the \a index position. |
|
138 | Inserts new \a value on the \a index position. | |
107 | The value that is currently at this postion is moved to postion index + 1 |
|
139 | The value that is currently at this postion is moved to postion index + 1 | |
@@ -109,7 +141,7 QBarSet& QBarSet::operator << (const qreal &value) | |||||
109 | */ |
|
141 | */ | |
110 | void QBarSet::insert(const int index, const qreal value) |
|
142 | void QBarSet::insert(const int index, const qreal value) | |
111 | { |
|
143 | { | |
112 | d_ptr->m_values.insert(index, value); |
|
144 | d_ptr->m_values.insert(index, QPointF(index, value)); | |
113 | // emit d_ptr->updatedBars(); |
|
145 | // emit d_ptr->updatedBars(); | |
114 | } |
|
146 | } | |
115 |
|
147 | |||
@@ -128,14 +160,14 void QBarSet::remove(const int index) | |||||
128 | */ |
|
160 | */ | |
129 | void QBarSet::replace(const int index, const qreal value) |
|
161 | void QBarSet::replace(const int index, const qreal value) | |
130 | { |
|
162 | { | |
131 | d_ptr->m_values.replace(index,value); |
|
163 | d_ptr->m_values.replace(index,QPointF(index,value)); | |
132 | emit d_ptr->updatedBars(); |
|
164 | emit d_ptr->updatedBars(); | |
133 | } |
|
165 | } | |
134 |
|
166 | |||
135 | /*! |
|
167 | /*! | |
136 | Returns value of set indexed by \a index |
|
168 | Returns value of set indexed by \a index. Note that all appended values are stored internally as QPointF | |
137 | */ |
|
169 | */ | |
138 |
|
|
170 | QPointF QBarSet::at(const int index) const | |
139 | { |
|
171 | { | |
140 | if (index < 0 || index >= d_ptr->m_values.count()) |
|
172 | if (index < 0 || index >= d_ptr->m_values.count()) | |
141 | return 0.0; |
|
173 | return 0.0; | |
@@ -146,7 +178,7 qreal QBarSet::at(const int index) const | |||||
146 | /*! |
|
178 | /*! | |
147 | Returns value of set indexed by \a index |
|
179 | Returns value of set indexed by \a index | |
148 | */ |
|
180 | */ | |
149 |
|
|
181 | QPointF QBarSet::operator [](const int index) const | |
150 | { |
|
182 | { | |
151 | return d_ptr->m_values.at(index); |
|
183 | return d_ptr->m_values.at(index); | |
152 | } |
|
184 | } | |
@@ -166,7 +198,8 qreal QBarSet::sum() const | |||||
166 | { |
|
198 | { | |
167 | qreal total(0); |
|
199 | qreal total(0); | |
168 | for (int i=0; i < d_ptr->m_values.count(); i++) { |
|
200 | for (int i=0; i < d_ptr->m_values.count(); i++) { | |
169 | total += d_ptr->m_values.at(i); |
|
201 | //total += d_ptr->m_values.at(i); | |
|
202 | total += d_ptr->m_values.at(i).y(); | |||
170 | } |
|
203 | } | |
171 | return total; |
|
204 | return total; | |
172 | } |
|
205 | } |
@@ -41,23 +41,19 public: | |||||
41 | void setName(const QString name); |
|
41 | void setName(const QString name); | |
42 | QString name() const; |
|
42 | QString name() const; | |
43 |
|
43 | |||
44 | // TODO: |
|
44 | void append(const QPointF value); // Appends bar with x-value | |
45 |
|
|
45 | void append(const QList<QPointF> values); // Same with list | |
46 | // void append(const QList<QPointF> value); // Same with list |
|
|||
47 | void append(const qreal value); // TODO: change so, that count becomes x-value |
|
46 | void append(const qreal value); // TODO: change so, that count becomes x-value | |
|
47 | void append(const QList<qreal> values); // Append list of values. Using index as x-value | |||
48 |
|
48 | |||
49 | // TODO: |
|
49 | QBarSet& operator << (const qreal &value); // TODO: change implementations so, that count becomes x-value | |
50 | // void append(const QList<qreal> values); // Append list of values. Using index as x-value |
|
50 | QBarSet& operator << (const QPointF &value); // Appends bar with x-value | |
51 |
|
||||
52 | QBarSet& operator << (const qreal &value); // TODO: change implementations so, that count becomes x-value |
|
|||
53 | // TODO: |
|
|||
54 | // QBarSet& operator << (const QPointF &value); // Appends bar with x-value |
|
|||
55 |
|
51 | |||
56 | void insert(const int index, const qreal value); // TODO: internal reindexing (what happens, if there are points with real x values?) |
|
52 | void insert(const int index, const qreal value); // TODO: internal reindexing (what happens, if there are points with real x values?) | |
57 | void remove(const int index); // TODO: internal reindexing (what happens, if there are points with real x values?) |
|
53 | void remove(const int index); // TODO: internal reindexing (what happens, if there are points with real x values?) | |
58 | void replace(const int index, const qreal value); |
|
54 | void replace(const int index, const qreal value); | |
59 |
|
|
55 | QPointF at(const int index) const; | |
60 |
|
|
56 | QPointF operator [] (const int index) const; | |
61 | int count() const; |
|
57 | int count() const; | |
62 | qreal sum() const; |
|
58 | qreal sum() const; | |
63 |
|
59 |
@@ -23,8 +23,7 Q_SIGNALS: | |||||
23 | public: |
|
23 | public: | |
24 | QBarSet * const q_ptr; |
|
24 | QBarSet * const q_ptr; | |
25 | QString m_name; |
|
25 | QString m_name; | |
26 | QList<qreal> m_values; // TODO: replace with map (category, value) |
|
26 | QList<QPointF> m_values; | |
27 | QMap<QString, qreal> m_mappedValues; |
|
|||
28 | QPen m_pen; |
|
27 | QPen m_pen; | |
29 | QBrush m_brush; |
|
28 | QBrush m_brush; | |
30 | QPen m_labelPen; |
|
29 | QPen m_labelPen; |
@@ -53,7 +53,7 QVector<QRectF> StackedBarChartItem::calculateLayout() | |||||
53 | for (int set=0; set < m_series->barsetCount(); set++) { |
|
53 | for (int set=0; set < m_series->barsetCount(); set++) { | |
54 | QBarSet* barSet = m_series->d_func()->barsetAt(set); |
|
54 | QBarSet* barSet = m_series->d_func()->barsetAt(set); | |
55 |
|
55 | |||
56 | qreal barHeight = barSet->at(category) * scale; |
|
56 | qreal barHeight = barSet->at(category).y() * scale; | |
57 | Bar* bar = m_bars.at(itemIndex); |
|
57 | Bar* bar = m_bars.at(itemIndex); | |
58 | bar->setPen(barSet->pen()); |
|
58 | bar->setPen(barSet->pen()); | |
59 | bar->setBrush(barSet->brush()); |
|
59 | bar->setBrush(barSet->brush()); | |
@@ -62,8 +62,8 QVector<QRectF> StackedBarChartItem::calculateLayout() | |||||
62 |
|
62 | |||
63 | BarLabel* label = m_labels.at(itemIndex); |
|
63 | BarLabel* label = m_labels.at(itemIndex); | |
64 |
|
64 | |||
65 | if (!qFuzzyIsNull(barSet->at(category))) { |
|
65 | if (!qFuzzyIsNull(barSet->at(category).y())) { | |
66 | label->setText(QString::number(barSet->at(category))); |
|
66 | label->setText(QString::number(barSet->at(category).y())); | |
67 | } else { |
|
67 | } else { | |
68 | label->setText(QString("")); |
|
68 | label->setText(QString("")); | |
69 | } |
|
69 | } |
@@ -88,7 +88,7 void ChartDataSet::addSeries(QAbstractSeries* series, QAxis *axisY) | |||||
88 |
|
88 | |||
89 | series->d_ptr->scaleDomain(*domain); |
|
89 | series->d_ptr->scaleDomain(*domain); | |
90 |
|
90 | |||
91 | if(series->type() == QAbstractSeries::SeriesTypeBar |
|
91 | if(series->type() == QAbstractSeries::SeriesTypeGroupedBar | |
92 | || series->type() == QAbstractSeries::SeriesTypeStackedBar |
|
92 | || series->type() == QAbstractSeries::SeriesTypeStackedBar | |
93 | || series->type() == QAbstractSeries::SeriesTypePercentBar) { |
|
93 | || series->type() == QAbstractSeries::SeriesTypePercentBar) { | |
94 | QBarSeries* barSeries = static_cast<QBarSeries*>(series); |
|
94 | QBarSeries* barSeries = static_cast<QBarSeries*>(series); |
@@ -46,6 +46,7 public: | |||||
46 | SeriesTypeBar, |
|
46 | SeriesTypeBar, | |
47 | SeriesTypeStackedBar, |
|
47 | SeriesTypeStackedBar, | |
48 | SeriesTypePercentBar, |
|
48 | SeriesTypePercentBar, | |
|
49 | SeriesTypeGroupedBar, | |||
49 | SeriesTypePie, |
|
50 | SeriesTypePie, | |
50 | SeriesTypeScatter, |
|
51 | SeriesTypeScatter, | |
51 | SeriesTypeSpline |
|
52 | SeriesTypeSpline |
@@ -140,7 +140,7 void tst_QBarSet::append() | |||||
140 |
|
140 | |||
141 | for (int i=0; i<count; i++) { |
|
141 | for (int i=0; i<count; i++) { | |
142 | m_barset->append(value); |
|
142 | m_barset->append(value); | |
143 | QCOMPARE(m_barset->at(i), value); |
|
143 | QCOMPARE(m_barset->at(i).y(), value); | |
144 | sum += value; |
|
144 | sum += value; | |
145 | value += 1.0; |
|
145 | value += 1.0; | |
146 | } |
|
146 | } | |
@@ -166,7 +166,7 void tst_QBarSet::appendOperator() | |||||
166 |
|
166 | |||
167 | for (int i=0; i<count; i++) { |
|
167 | for (int i=0; i<count; i++) { | |
168 | *m_barset << value; |
|
168 | *m_barset << value; | |
169 | QCOMPARE(m_barset->at(i), value); |
|
169 | QCOMPARE(m_barset->at(i).y(), value); | |
170 | sum += value; |
|
170 | sum += value; | |
171 | value += 1.0; |
|
171 | value += 1.0; | |
172 | } |
|
172 | } | |
@@ -185,20 +185,20 void tst_QBarSet::insert() | |||||
185 | QVERIFY(qFuzzyIsNull(m_barset->sum())); |
|
185 | QVERIFY(qFuzzyIsNull(m_barset->sum())); | |
186 |
|
186 | |||
187 | m_barset->insert(0, 1.0); // 1.0 |
|
187 | m_barset->insert(0, 1.0); // 1.0 | |
188 | QCOMPARE(m_barset->at(0), 1.0); |
|
188 | QCOMPARE(m_barset->at(0).y(), 1.0); | |
189 | QCOMPARE(m_barset->count(), 1); |
|
189 | QCOMPARE(m_barset->count(), 1); | |
190 | QVERIFY(qFuzzyCompare(m_barset->sum(), 1.0)); |
|
190 | QVERIFY(qFuzzyCompare(m_barset->sum(), 1.0)); | |
191 |
|
191 | |||
192 | m_barset->insert(0, 2.0); // 2.0 1.0 |
|
192 | m_barset->insert(0, 2.0); // 2.0 1.0 | |
193 | QCOMPARE(m_barset->at(0), 2.0); |
|
193 | QCOMPARE(m_barset->at(0).y(), 2.0); | |
194 | QCOMPARE(m_barset->at(1), 1.0); |
|
194 | QCOMPARE(m_barset->at(1).y(), 1.0); | |
195 | QCOMPARE(m_barset->count(), 2); |
|
195 | QCOMPARE(m_barset->count(), 2); | |
196 | QVERIFY(qFuzzyCompare(m_barset->sum(), 3.0)); |
|
196 | QVERIFY(qFuzzyCompare(m_barset->sum(), 3.0)); | |
197 |
|
197 | |||
198 | m_barset->insert(1, 3.0); // 2.0 3.0 1.0 |
|
198 | m_barset->insert(1, 3.0); // 2.0 3.0 1.0 | |
199 | QCOMPARE(m_barset->at(1), 3.0); |
|
199 | QCOMPARE(m_barset->at(1).y(), 3.0); | |
200 | QCOMPARE(m_barset->at(0), 2.0); |
|
200 | QCOMPARE(m_barset->at(0).y(), 2.0); | |
201 | QCOMPARE(m_barset->at(2), 1.0); |
|
201 | QCOMPARE(m_barset->at(2).y(), 1.0); | |
202 | QCOMPARE(m_barset->count(), 3); |
|
202 | QCOMPARE(m_barset->count(), 3); | |
203 | QVERIFY(qFuzzyCompare(m_barset->sum(), 6.0)); |
|
203 | QVERIFY(qFuzzyCompare(m_barset->sum(), 6.0)); | |
204 | } |
|
204 | } | |
@@ -221,15 +221,15 void tst_QBarSet::remove() | |||||
221 | QCOMPARE(m_barset->sum(), 10.0); |
|
221 | QCOMPARE(m_barset->sum(), 10.0); | |
222 |
|
222 | |||
223 | m_barset->remove(2); // 1.0 2.0 4.0 |
|
223 | m_barset->remove(2); // 1.0 2.0 4.0 | |
224 | QCOMPARE(m_barset->at(0), 1.0); |
|
224 | QCOMPARE(m_barset->at(0).y(), 1.0); | |
225 | QCOMPARE(m_barset->at(1), 2.0); |
|
225 | QCOMPARE(m_barset->at(1).y(), 2.0); | |
226 | QCOMPARE(m_barset->at(2), 4.0); |
|
226 | QCOMPARE(m_barset->at(2).y(), 4.0); | |
227 | QCOMPARE(m_barset->count(), 3); |
|
227 | QCOMPARE(m_barset->count(), 3); | |
228 | QCOMPARE(m_barset->sum(), 7.0); |
|
228 | QCOMPARE(m_barset->sum(), 7.0); | |
229 |
|
229 | |||
230 | m_barset->remove(0); // 2.0 4.0 |
|
230 | m_barset->remove(0); // 2.0 4.0 | |
231 | QCOMPARE(m_barset->at(0), 2.0); |
|
231 | QCOMPARE(m_barset->at(0).y(), 2.0); | |
232 | QCOMPARE(m_barset->at(1), 4.0); |
|
232 | QCOMPARE(m_barset->at(1).y(), 4.0); | |
233 | QCOMPARE(m_barset->count(), 2); |
|
233 | QCOMPARE(m_barset->count(), 2); | |
234 | QCOMPARE(m_barset->sum(), 6.0); |
|
234 | QCOMPARE(m_barset->sum(), 6.0); | |
235 | } |
|
235 | } | |
@@ -255,15 +255,15 void tst_QBarSet::replace() | |||||
255 | m_barset->replace(0, 5.0); // 5.0 2.0 3.0 4.0 |
|
255 | m_barset->replace(0, 5.0); // 5.0 2.0 3.0 4.0 | |
256 | QCOMPARE(m_barset->count(), 4); |
|
256 | QCOMPARE(m_barset->count(), 4); | |
257 | QCOMPARE(m_barset->sum(), 14.0); |
|
257 | QCOMPARE(m_barset->sum(), 14.0); | |
258 | QCOMPARE(m_barset->at(0), 5.0); |
|
258 | QCOMPARE(m_barset->at(0).y(), 5.0); | |
259 |
|
259 | |||
260 | m_barset->replace(3, 6.0); |
|
260 | m_barset->replace(3, 6.0); | |
261 | QCOMPARE(m_barset->count(), 4); // 5.0 2.0 3.0 6.0 |
|
261 | QCOMPARE(m_barset->count(), 4); // 5.0 2.0 3.0 6.0 | |
262 | QCOMPARE(m_barset->sum(), 16.0); |
|
262 | QCOMPARE(m_barset->sum(), 16.0); | |
263 | QCOMPARE(m_barset->at(0), 5.0); |
|
263 | QCOMPARE(m_barset->at(0).y(), 5.0); | |
264 | QCOMPARE(m_barset->at(1), 2.0); |
|
264 | QCOMPARE(m_barset->at(1).y(), 2.0); | |
265 | QCOMPARE(m_barset->at(2), 3.0); |
|
265 | QCOMPARE(m_barset->at(2).y(), 3.0); | |
266 | QCOMPARE(m_barset->at(3), 6.0); |
|
266 | QCOMPARE(m_barset->at(3).y(), 6.0); | |
267 | } |
|
267 | } | |
268 |
|
268 | |||
269 | void tst_QBarSet::at_data() |
|
269 | void tst_QBarSet::at_data() | |
@@ -281,10 +281,10 void tst_QBarSet::at() | |||||
281 | m_barset->append(3.0); |
|
281 | m_barset->append(3.0); | |
282 | m_barset->append(4.0); |
|
282 | m_barset->append(4.0); | |
283 |
|
283 | |||
284 | QCOMPARE(m_barset->at(0), 1.0); |
|
284 | QCOMPARE(m_barset->at(0).y(), 1.0); | |
285 | QCOMPARE(m_barset->at(1), 2.0); |
|
285 | QCOMPARE(m_barset->at(1).y(), 2.0); | |
286 | QCOMPARE(m_barset->at(2), 3.0); |
|
286 | QCOMPARE(m_barset->at(2).y(), 3.0); | |
287 | QCOMPARE(m_barset->at(3), 4.0); |
|
287 | QCOMPARE(m_barset->at(3).y(), 4.0); | |
288 | } |
|
288 | } | |
289 |
|
289 | |||
290 | void tst_QBarSet::atOperator_data() |
|
290 | void tst_QBarSet::atOperator_data() | |
@@ -302,10 +302,10 void tst_QBarSet::atOperator() | |||||
302 | m_barset->append(3.0); |
|
302 | m_barset->append(3.0); | |
303 | m_barset->append(4.0); |
|
303 | m_barset->append(4.0); | |
304 |
|
304 | |||
305 | QCOMPARE(m_barset->operator [](0), 1.0); |
|
305 | QCOMPARE(m_barset->operator [](0).y(), 1.0); | |
306 | QCOMPARE(m_barset->operator [](1), 2.0); |
|
306 | QCOMPARE(m_barset->operator [](1).y(), 2.0); | |
307 | QCOMPARE(m_barset->operator [](2), 3.0); |
|
307 | QCOMPARE(m_barset->operator [](2).y(), 3.0); | |
308 | QCOMPARE(m_barset->operator [](3), 4.0); |
|
308 | QCOMPARE(m_barset->operator [](3).y(), 4.0); | |
309 | } |
|
309 | } | |
310 |
|
310 | |||
311 | void tst_QBarSet::count_data() |
|
311 | void tst_QBarSet::count_data() |
General Comments 0
You need to be logged in to leave comments.
Login now