@@ -0,0 +1,16 | |||
|
1 | INCLUDEPATH += $$PWD | |
|
2 | DEPENDPATH += $$PWD | |
|
3 | ||
|
4 | SOURCES += \ | |
|
5 | $$PWD/boxplotchartitem.cpp \ | |
|
6 | $$PWD/qboxplotseries.cpp \ | |
|
7 | $$PWD/boxwhiskers.cpp | |
|
8 | ||
|
9 | PRIVATE_HEADERS += \ | |
|
10 | $$PWD/boxplotchartitem_p.h \ | |
|
11 | $$PWD/qboxplotseries_p.h \ | |
|
12 | $$PWD/boxwhiskers_p.h \ | |
|
13 | $$PWD/boxwhiskersdata_p.h | |
|
14 | ||
|
15 | PUBLIC_HEADERS += \ | |
|
16 | $$PWD/qboxplotseries.h |
@@ -0,0 +1,196 | |||
|
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 "boxplotchartitem_p.h" | |
|
22 | #include "qboxplotseries_p.h" | |
|
23 | #include "bar_p.h" | |
|
24 | #include "qbarset_p.h" | |
|
25 | #include "qabstractbarseries_p.h" | |
|
26 | #include "qbarset.h" | |
|
27 | #include "boxwhiskers_p.h" | |
|
28 | #include <QPainter> | |
|
29 | ||
|
30 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | |
|
31 | ||
|
32 | BoxPlotChartItem::BoxPlotChartItem(QBoxPlotSeries *series, QGraphicsItem* item) : | |
|
33 | ChartItem(series->d_func(), item), | |
|
34 | m_series(series), | |
|
35 | m_animation(0), | |
|
36 | m_animate(0) | |
|
37 | { | |
|
38 | connect(series->d_func(), SIGNAL(restructuredBars()), this, SLOT(handleDataStructureChanged())); | |
|
39 | connect(series->d_func(), SIGNAL(updatedLayout()), this, SLOT(handleLayoutChanged())); | |
|
40 | connect(series->d_func(), SIGNAL(updatedBars()), this, SLOT(handleUpdatedBars())); | |
|
41 | connect(series->d_func(), SIGNAL(updated()), this, SLOT(handleUpdatedBars())); | |
|
42 | // QBoxPlotSeriesPrivate calls handleDataStructureChanged(), don't do it here | |
|
43 | setZValue(ChartPresenter::BoxPlotSeriesZValue); | |
|
44 | ||
|
45 | m_barSets = m_series->barSets(); | |
|
46 | } | |
|
47 | ||
|
48 | BoxPlotChartItem::~BoxPlotChartItem() | |
|
49 | { | |
|
50 | qDebug() << "BoxPlotChartItem::~BoxPlotChartItem() " << m_seriesIndex; | |
|
51 | } | |
|
52 | ||
|
53 | void BoxPlotChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) | |
|
54 | { | |
|
55 | Q_UNUSED(painter); | |
|
56 | Q_UNUSED(option); | |
|
57 | Q_UNUSED(widget); | |
|
58 | ||
|
59 | //painter->setClipRect(QRectF(QPointF(0,0),domain()->size())); | |
|
60 | ||
|
61 | //qDebug() << "ALERT EMPTY: BoxPlotChartItem::paint"; | |
|
62 | } | |
|
63 | ||
|
64 | void BoxPlotChartItem::setAnimation(BoxPlotAnimation *animation) | |
|
65 | { | |
|
66 | //qDebug() << "BoxPlotChartItem::setAnimation :" << animation; | |
|
67 | ||
|
68 | m_animation = animation; | |
|
69 | if (m_animation) { | |
|
70 | foreach (BoxWhiskers *item, m_boxTable.values()) { | |
|
71 | m_animation->addBox(item); | |
|
72 | } | |
|
73 | handleDomainUpdated(); | |
|
74 | } | |
|
75 | } | |
|
76 | ||
|
77 | void BoxPlotChartItem::handleDataStructureChanged() | |
|
78 | { | |
|
79 | //qDebug() << "BoxPlotChartItem::handleDataStructureChanged()"; | |
|
80 | int setCount = m_series->count(); | |
|
81 | ||
|
82 | for (int s = 0; s < setCount; s++) { | |
|
83 | QBarSet *set = m_series->d_func()->barsetAt(s); | |
|
84 | ||
|
85 | BoxWhiskers *boxWhiskersItem = m_boxTable.value(set); | |
|
86 | if (boxWhiskersItem == 0) { | |
|
87 | // Item is not yet created, make a box and add it to hash table | |
|
88 | boxWhiskersItem = new BoxWhiskers(domain(), this); | |
|
89 | m_boxTable.insert(set, boxWhiskersItem); | |
|
90 | ||
|
91 | boxWhiskersItem->setBrush(m_series->brush()); | |
|
92 | boxWhiskersItem->setPen(m_series->pen()); | |
|
93 | } | |
|
94 | updateBoxGeometry(boxWhiskersItem, s); | |
|
95 | ||
|
96 | boxWhiskersItem->updateGeometry(); | |
|
97 | ||
|
98 | if (m_animation) | |
|
99 | m_animation->addBox(boxWhiskersItem); | |
|
100 | } | |
|
101 | ||
|
102 | // | |
|
103 | handleDomainUpdated(); | |
|
104 | } | |
|
105 | ||
|
106 | void BoxPlotChartItem::handleUpdatedBars() | |
|
107 | { | |
|
108 | //qDebug() << "BoxPlotChartItem::handleUpdatedBars()"; | |
|
109 | ||
|
110 | foreach (BoxWhiskers *item, m_boxTable.values()) { | |
|
111 | item->setBrush(m_series->brush()); | |
|
112 | item->setPen(m_series->pen()); | |
|
113 | } | |
|
114 | } | |
|
115 | ||
|
116 | void BoxPlotChartItem::handleDomainUpdated() | |
|
117 | { | |
|
118 | //qDebug() << "BoxPlotChartItem::handleDomainUpdated() domain()->size() = " << domain()->size(); | |
|
119 | ||
|
120 | if ((domain()->size().width() <= 0) || (domain()->size().height() <= 0)) | |
|
121 | return; | |
|
122 | ||
|
123 | // Set my bounding rect to same as domain size | |
|
124 | m_boundingRect.setRect(0.0, 0.0, domain()->size().width(), domain()->size().height()); | |
|
125 | ||
|
126 | foreach (BoxWhiskers *item, m_boxTable.values()) { | |
|
127 | // Update the domain size for each BoxWhisker item | |
|
128 | item->setDomainSize(domain()->size()); | |
|
129 | ||
|
130 | // If the animation is set, start the animation for each BoxWhisker item | |
|
131 | if (m_animation) { | |
|
132 | presenter()->startAnimation(m_animation->boxAnimation(item)); | |
|
133 | } | |
|
134 | } | |
|
135 | } | |
|
136 | ||
|
137 | void BoxPlotChartItem::handleLayoutChanged() | |
|
138 | { | |
|
139 | //qDebug() << "BoxPlotChartItem::handleLayoutChanged() domain()->size() = " << domain()->size(); | |
|
140 | //foreach (BoxWhiskers *boxWhiskersItem, m_boxes) | |
|
141 | // boxWhiskersItem->updateGeometry(); | |
|
142 | } | |
|
143 | ||
|
144 | void BoxPlotChartItem::handleSeriesRemove(QAbstractSeries *series) | |
|
145 | { | |
|
146 | qDebug() << "BoxPlotChartItem::handleSeriesRemove " << m_seriesIndex; | |
|
147 | QBoxPlotSeries *removedSeries = static_cast<QBoxPlotSeries *>(series); | |
|
148 | if (m_series == removedSeries) { | |
|
149 | return; | |
|
150 | } | |
|
151 | ||
|
152 | m_seriesCount = m_seriesCount - 1; | |
|
153 | ||
|
154 | handleDataStructureChanged(); | |
|
155 | } | |
|
156 | ||
|
157 | QRectF BoxPlotChartItem::boundingRect() const | |
|
158 | { | |
|
159 | return m_boundingRect; | |
|
160 | } | |
|
161 | ||
|
162 | void BoxPlotChartItem::initializeLayout() | |
|
163 | { | |
|
164 | qDebug() << "ALERT EMPTY: BoxPlotChartItem::initializeLayout"; | |
|
165 | } | |
|
166 | ||
|
167 | QVector<QRectF> BoxPlotChartItem::calculateLayout() | |
|
168 | { | |
|
169 | return QVector<QRectF>(); | |
|
170 | } | |
|
171 | ||
|
172 | void BoxPlotChartItem::updateBoxGeometry(BoxWhiskers *box, int index) | |
|
173 | { | |
|
174 | QBarSet *set = m_series->d_func()->barsetAt(index); | |
|
175 | //QBarSet *set = m_barSets.at(index); | |
|
176 | BoxWhiskersData &data = box->m_data; | |
|
177 | data.m_lowerExtreme = set->at(0); | |
|
178 | data.m_lowerQuartile = set->at(1); | |
|
179 | data.m_median = set->at(2); | |
|
180 | data.m_upperQuartile = set->at(3); | |
|
181 | data.m_upperExtreme = set->at(4); | |
|
182 | data.m_index = index; | |
|
183 | data.m_boxItems = m_series->count(); | |
|
184 | ||
|
185 | data.m_maxX = domain()->maxX(); | |
|
186 | data.m_minX = domain()->minX(); | |
|
187 | data.m_maxY = domain()->maxY(); | |
|
188 | data.m_minY = domain()->minY(); | |
|
189 | ||
|
190 | data.m_seriesIndex = m_seriesIndex; | |
|
191 | data.m_seriesCount = m_seriesCount; | |
|
192 | } | |
|
193 | ||
|
194 | #include "moc_boxplotchartitem_p.cpp" | |
|
195 | ||
|
196 | QTCOMMERCIALCHART_END_NAMESPACE |
@@ -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 | // 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 | ||
|
31 | #ifndef BOXPLOTCHARTITEM_H | |
|
32 | #define BOXPLOTCHARTITEM_H | |
|
33 | ||
|
34 | #include "boxwhiskers_p.h" | |
|
35 | #include "qboxplotseries.h" | |
|
36 | #include "chartitem_p.h" | |
|
37 | #include "boxplotanimation_p.h" | |
|
38 | #include <QGraphicsItem> | |
|
39 | ||
|
40 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | |
|
41 | ||
|
42 | class BoxPlotSeriesPrivate; | |
|
43 | ||
|
44 | class BoxPlotChartItem : public ChartItem | |
|
45 | { | |
|
46 | Q_OBJECT | |
|
47 | public: | |
|
48 | BoxPlotChartItem(QBoxPlotSeries *series, QGraphicsItem* item =0); | |
|
49 | ~BoxPlotChartItem(); | |
|
50 | ||
|
51 | void setAnimation(BoxPlotAnimation *animation); | |
|
52 | ||
|
53 | void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); | |
|
54 | QRectF boundingRect() const; | |
|
55 | ||
|
56 | public Q_SLOTS: | |
|
57 | void handleDataStructureChanged(); | |
|
58 | void handleDomainUpdated(); | |
|
59 | void handleLayoutChanged(); | |
|
60 | void handleUpdatedBars(); | |
|
61 | void handleSeriesRemove(QAbstractSeries *series); | |
|
62 | ||
|
63 | private: | |
|
64 | virtual QVector<QRectF> calculateLayout(); | |
|
65 | void initializeLayout(); | |
|
66 | void updateBoxGeometry(BoxWhiskers *box, int index); | |
|
67 | ||
|
68 | protected: | |
|
69 | friend class QBoxPlotSeriesPrivate; | |
|
70 | QBoxPlotSeries *m_series; // Not owned. | |
|
71 | QList<BoxWhiskers *> m_boxes; | |
|
72 | QHash<QBarSet *, BoxWhiskers *> m_boxTable; | |
|
73 | QList<QBarSet *> m_barSets; | |
|
74 | int m_seriesIndex; | |
|
75 | int m_seriesCount; | |
|
76 | ||
|
77 | BoxPlotAnimation *m_animation; | |
|
78 | bool m_animate; | |
|
79 | ||
|
80 | QRectF m_boundingRect; | |
|
81 | ||
|
82 | //QList<BoxPlotAnimation *> m_animations; | |
|
83 | }; | |
|
84 | ||
|
85 | QTCOMMERCIALCHART_END_NAMESPACE | |
|
86 | ||
|
87 | #endif // BOXPLOTCHARTITEM_H |
@@ -0,0 +1,193 | |||
|
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 "boxwhiskers_p.h" | |
|
22 | #include <QPainter> | |
|
23 | #include <QDebug> | |
|
24 | #include <QWidget> | |
|
25 | ||
|
26 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | |
|
27 | ||
|
28 | BoxWhiskers::BoxWhiskers(AbstractDomain *domain, QGraphicsObject *parent) : | |
|
29 | QGraphicsObject(parent), | |
|
30 | m_domain(domain) | |
|
31 | { | |
|
32 | } | |
|
33 | ||
|
34 | BoxWhiskers::~BoxWhiskers() | |
|
35 | { | |
|
36 | //qDebug() << "BoxWhiskers::~BoxWhiskers()"; | |
|
37 | } | |
|
38 | ||
|
39 | void BoxWhiskers::mousePressEvent(QGraphicsSceneMouseEvent *event) | |
|
40 | { | |
|
41 | Q_UNUSED(event) | |
|
42 | ||
|
43 | qDebug() << "BoxWhiskers::mousePressEvent"; | |
|
44 | } | |
|
45 | ||
|
46 | void BoxWhiskers::hoverEnterEvent(QGraphicsSceneHoverEvent *event) | |
|
47 | { | |
|
48 | Q_UNUSED(event) | |
|
49 | ||
|
50 | qDebug() << "BoxWhiskers::hoverEnterEvent"; | |
|
51 | } | |
|
52 | ||
|
53 | void BoxWhiskers::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) | |
|
54 | { | |
|
55 | Q_UNUSED(event) | |
|
56 | ||
|
57 | qDebug() << "BoxWhiskers::hoverLeaveEvent"; | |
|
58 | } | |
|
59 | ||
|
60 | void BoxWhiskers::setBrush(const QBrush &brush) | |
|
61 | { | |
|
62 | m_brush = brush; | |
|
63 | } | |
|
64 | ||
|
65 | void BoxWhiskers::setPen(const QPen &pen) | |
|
66 | { | |
|
67 | m_pen = pen; | |
|
68 | } | |
|
69 | ||
|
70 | void BoxWhiskers::setLayout(const BoxWhiskersData &data) | |
|
71 | { | |
|
72 | m_data = data; | |
|
73 | // if (m_data.m_index == 1) | |
|
74 | // qDebug() << "BoxWhiskers::setLayout"; | |
|
75 | updateGeometry(); | |
|
76 | //update(0.0, 0.0, m_data.m_domainSize.width(), m_data.m_domainSize.height()); | |
|
77 | update(); | |
|
78 | } | |
|
79 | ||
|
80 | ||
|
81 | QSizeF BoxWhiskers::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const | |
|
82 | { | |
|
83 | //Q_UNUSED(which) | |
|
84 | Q_UNUSED(constraint) | |
|
85 | ||
|
86 | qDebug() << "BoxWhiskers::sizeHint, which = " << which; | |
|
87 | ||
|
88 | return QSizeF(); | |
|
89 | } | |
|
90 | ||
|
91 | void BoxWhiskers::setGeometry(const QRectF &rect) // TODO: Unused? | |
|
92 | { | |
|
93 | Q_UNUSED(rect) | |
|
94 | ||
|
95 | qDebug() << "BoxWhiskers::setGeometry"; | |
|
96 | } | |
|
97 | ||
|
98 | void BoxWhiskers::setDomainSize(const QSizeF &size) | |
|
99 | { | |
|
100 | m_domainSize = size; | |
|
101 | ||
|
102 | updateBoundingRect(); | |
|
103 | } | |
|
104 | ||
|
105 | QRectF BoxWhiskers::boundingRect() const | |
|
106 | { | |
|
107 | return m_boundingRect; | |
|
108 | } | |
|
109 | ||
|
110 | void BoxWhiskers::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) | |
|
111 | { | |
|
112 | Q_UNUSED(option) | |
|
113 | Q_UNUSED(widget) | |
|
114 | //Q_UNUSED(painter) | |
|
115 | ||
|
116 | //painter->save(); | |
|
117 | //painter->setClipRect(parentItem()->boundingRect()); | |
|
118 | painter->setPen(m_pen); | |
|
119 | painter->setBrush(m_brush); | |
|
120 | qreal spanY = m_data.m_maxY - m_data.m_minY; | |
|
121 | //painter->setClipRect(parentItem()->boundingRect()); | |
|
122 | painter->scale(m_domainSize.width() / m_data.m_boxItems, m_domainSize.height() / spanY); | |
|
123 | painter->drawPath(m_boxPath); | |
|
124 | //painter->restore(); | |
|
125 | } | |
|
126 | ||
|
127 | void BoxWhiskers::updateGeometry() | |
|
128 | { | |
|
129 | prepareGeometryChange(); | |
|
130 | ||
|
131 | QPainterPath path; | |
|
132 | ||
|
133 | // TODO: Dirty hack | |
|
134 | if (m_data.m_seriesCount == 0) m_data.m_seriesCount = 1; | |
|
135 | ||
|
136 | qreal columnWidth = 1.0 / m_data.m_seriesCount; | |
|
137 | qreal left = 0.25 * columnWidth + columnWidth * m_data.m_seriesIndex; | |
|
138 | qreal right = 0.75 * columnWidth + columnWidth * m_data.m_seriesIndex; | |
|
139 | qreal middle = 0.5 * columnWidth + columnWidth * m_data.m_seriesIndex; | |
|
140 | ||
|
141 | //whisker = 0.35 0.75 | |
|
142 | ||
|
143 | // Upper whisker | |
|
144 | path.moveTo(left + m_data.m_index, m_data.m_maxY - m_data.m_upperExtreme); | |
|
145 | path.lineTo(right + m_data.m_index, m_data.m_maxY - m_data.m_upperExtreme); | |
|
146 | path.moveTo(middle + m_data.m_index, m_data.m_maxY - m_data.m_upperExtreme); | |
|
147 | path.lineTo(middle + m_data.m_index, m_data.m_maxY - m_data.m_upperQuartile); | |
|
148 | path.closeSubpath(); | |
|
149 | ||
|
150 | // Middle Box | |
|
151 | path.addRect(left + m_data.m_index, m_data.m_maxY - m_data.m_upperQuartile, | |
|
152 | 0.5 * columnWidth, m_data.m_upperQuartile - m_data.m_lowerQuartile); | |
|
153 | ||
|
154 | // Median/mean line | |
|
155 | path.moveTo(left + m_data.m_index, m_data.m_maxY - m_data.m_median); | |
|
156 | path.lineTo(right + m_data.m_index, m_data.m_maxY - m_data.m_median); | |
|
157 | ||
|
158 | // Lower whisker | |
|
159 | path.moveTo(left + m_data.m_index, m_data.m_maxY - m_data.m_lowerExtreme); | |
|
160 | path.lineTo(right + m_data.m_index, m_data.m_maxY - m_data.m_lowerExtreme); | |
|
161 | path.moveTo(middle + m_data.m_index, m_data.m_maxY - m_data.m_lowerExtreme); | |
|
162 | path.lineTo(middle + m_data.m_index, m_data.m_maxY - m_data.m_lowerQuartile); | |
|
163 | path.closeSubpath(); | |
|
164 | ||
|
165 | m_boxPath = path; | |
|
166 | ||
|
167 | updateBoundingRect(); | |
|
168 | ||
|
169 | // qreal scaleY = m_domainSize.height() / (m_data.m_maxY - m_data.m_minY); | |
|
170 | // qreal scaleX = m_domainSize.width() / m_data.m_boxItems; | |
|
171 | // QRectF br = path.boundingRect(); | |
|
172 | // m_boundingRect = QRectF( br.x() * scaleX, br.y() * scaleY, br.width() * scaleX, br.height() * scaleY); | |
|
173 | ||
|
174 | if (m_data.m_index == 5) { | |
|
175 | //qDebug() << "myValue = " << myValue; | |
|
176 | //qDebug() << "m_data.m_upperExtreme" << m_data.m_upperExtreme; | |
|
177 | //qDebug() << "m_boundingRect = " << m_boundingRect; | |
|
178 | // qDebug() << "x = " << m_boundingRect.x() << ", y = " << m_boundingRect.y() << ", width = " | |
|
179 | // << m_boundingRect.width() << ", height = " << m_boundingRect.height(); | |
|
180 | } | |
|
181 | } | |
|
182 | ||
|
183 | void BoxWhiskers::updateBoundingRect() | |
|
184 | { | |
|
185 | qreal scaleY = m_domainSize.height() / (m_data.m_maxY - m_data.m_minY); | |
|
186 | qreal scaleX = m_domainSize.width() / m_data.m_boxItems; | |
|
187 | QRectF br = m_boxPath.boundingRect(); | |
|
188 | m_boundingRect = QRectF( br.x() * scaleX, br.y() * scaleY, br.width() * scaleX, br.height() * scaleY); | |
|
189 | } | |
|
190 | ||
|
191 | #include "moc_boxwhiskers_p.cpp" | |
|
192 | ||
|
193 | QTCOMMERCIALCHART_END_NAMESPACE |
@@ -0,0 +1,96 | |||
|
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 BOXWHISKERS_H | |
|
31 | #define BOXWHISKERS_H | |
|
32 | ||
|
33 | #include "boxwhiskersdata_p.h" | |
|
34 | #include "qchartglobal.h" | |
|
35 | #include "qbarset.h" | |
|
36 | #include "abstractdomain_p.h" | |
|
37 | #include <QGraphicsRectItem> | |
|
38 | #include <QGraphicsLineItem> | |
|
39 | #include <QGraphicsLayoutItem> | |
|
40 | #include <QPainterPath> | |
|
41 | ||
|
42 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | |
|
43 | ||
|
44 | class QBarSet; | |
|
45 | ||
|
46 | class BoxWhiskers : public QGraphicsObject/*, public QGraphicsLayoutItem*/ | |
|
47 | { | |
|
48 | Q_OBJECT | |
|
49 | //Q_INTERFACES(QGraphicsLayoutItem) | |
|
50 | public: | |
|
51 | BoxWhiskers(AbstractDomain *domain, QGraphicsObject *parent); | |
|
52 | ~BoxWhiskers(); | |
|
53 | ||
|
54 | void setBrush(const QBrush &brush); | |
|
55 | void setPen(const QPen &pen); | |
|
56 | void setLayout(const BoxWhiskersData &data); | |
|
57 | void setDomainSize(const QSizeF &size); | |
|
58 | ||
|
59 | void mousePressEvent(QGraphicsSceneMouseEvent *event); | |
|
60 | void hoverEnterEvent(QGraphicsSceneHoverEvent *event); | |
|
61 | void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); | |
|
62 | ||
|
63 | QRectF boundingRect() const; | |
|
64 | void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); | |
|
65 | ||
|
66 | // From QGraphicsLayoutItem // TODO tarkista n�m� jollei ole QGraphicsLayoutItem | |
|
67 | void updateGeometry(); | |
|
68 | protected: | |
|
69 | QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint) const; | |
|
70 | void setGeometry(const QRectF &rect); | |
|
71 | ||
|
72 | private: | |
|
73 | void updateBoundingRect(); | |
|
74 | ||
|
75 | Q_SIGNALS: | |
|
76 | void clicked(int index, QBarSet *barset); | |
|
77 | void hovered(bool status, QBarSet *barset); | |
|
78 | ||
|
79 | private: | |
|
80 | friend class BoxPlotChartItem; | |
|
81 | friend class BoxPlotAnimation; | |
|
82 | ||
|
83 | AbstractDomain *m_domain; | |
|
84 | QPainterPath m_boxPath; | |
|
85 | QRectF m_boundingRect; | |
|
86 | bool m_hovering; | |
|
87 | bool m_validData; | |
|
88 | QBrush m_brush; | |
|
89 | QPen m_pen; | |
|
90 | BoxWhiskersData m_data; | |
|
91 | QSizeF m_domainSize; | |
|
92 | }; | |
|
93 | ||
|
94 | QTCOMMERCIALCHART_END_NAMESPACE | |
|
95 | ||
|
96 | #endif // BOXWHISKERS_H |
@@ -0,0 +1,80 | |||
|
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 BOXWHISKERSDATA_P_H | |
|
31 | #define BOXWHISKERSDATA_P_H | |
|
32 | ||
|
33 | #include "qchartglobal.h" | |
|
34 | #include <QSizeF> | |
|
35 | ||
|
36 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | |
|
37 | ||
|
38 | class BoxWhiskersData | |
|
39 | { | |
|
40 | public: | |
|
41 | BoxWhiskersData() : | |
|
42 | m_lowerExtreme(0.0), | |
|
43 | m_lowerQuartile(0.0), | |
|
44 | m_median(0.0), | |
|
45 | m_upperQuartile(0.0), | |
|
46 | m_upperExtreme(0.0), | |
|
47 | m_index(0), | |
|
48 | m_boxItems(0), | |
|
49 | m_maxX(0.0), | |
|
50 | m_minX(0.0), | |
|
51 | m_maxY(0.0), | |
|
52 | m_minY(0.0), | |
|
53 | m_seriesIndex(0), | |
|
54 | m_seriesCount(0) | |
|
55 | { | |
|
56 | } | |
|
57 | ||
|
58 | // Box related statistics | |
|
59 | qreal m_lowerExtreme; | |
|
60 | qreal m_lowerQuartile; | |
|
61 | qreal m_median; | |
|
62 | qreal m_upperQuartile; | |
|
63 | qreal m_upperExtreme; | |
|
64 | int m_index; | |
|
65 | int m_boxItems; | |
|
66 | ||
|
67 | // Domain boundaries, axis | |
|
68 | qreal m_maxX; | |
|
69 | qreal m_minX; | |
|
70 | qreal m_maxY; | |
|
71 | qreal m_minY; | |
|
72 | ||
|
73 | // Serieses related data | |
|
74 | int m_seriesIndex; | |
|
75 | int m_seriesCount; | |
|
76 | }; | |
|
77 | ||
|
78 | QTCOMMERCIALCHART_END_NAMESPACE | |
|
79 | ||
|
80 | #endif // BOXWHISKERSDATA_P_H |
@@ -0,0 +1,280 | |||
|
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 "qboxplotseries.h" | |
|
22 | #include "qboxplotseries_p.h" | |
|
23 | #include "qboxplotlegendmarker.h" | |
|
24 | #include "boxplotchartitem_p.h" | |
|
25 | #include "chartdataset_p.h" | |
|
26 | #include "charttheme_p.h" | |
|
27 | #include "qvalueaxis.h" | |
|
28 | #include "charttheme_p.h" | |
|
29 | #include "boxplotanimation_p.h" | |
|
30 | #include "qchart_p.h" | |
|
31 | ||
|
32 | #include <QDebug> | |
|
33 | ||
|
34 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | |
|
35 | ||
|
36 | /*! | |
|
37 | \class QBoxPlotSeries | |
|
38 | \brief Series for creating stacked bar chart | |
|
39 | \mainclass | |
|
40 | ||
|
41 | QBoxPlotSeries represents a series of data shown as bars. The purpose of this class is to draw bars | |
|
42 | as stacks, where bars in same category are stacked on top of each other. | |
|
43 | QBoxPlotSeries groups the data from sets to categories, which are defined by QStringList. | |
|
44 | ||
|
45 | See the \l {BoxPlotChart Example} {stacked bar chart example} to learn how to create a stacked bar chart. | |
|
46 | \image examples_boxplotchart.png | |
|
47 | ||
|
48 | \sa QBarSet, QPercentBarSeries, QAbstractBarSeries | |
|
49 | */ | |
|
50 | ||
|
51 | /*! | |
|
52 | \qmlclass BoxPlotSeries QBoxPlotSeries | |
|
53 | \inherits AbstractBarSeries | |
|
54 | ||
|
55 | The following QML shows how to create a simple stacked bar chart: | |
|
56 | \snippet ../demos/qmlchart/qml/qmlchart/View7.qml 1 | |
|
57 | \beginfloatleft | |
|
58 | \image demos_qmlchart7.png | |
|
59 | \endfloat | |
|
60 | \clearfloat | |
|
61 | */ | |
|
62 | ||
|
63 | /*! | |
|
64 | Constructs empty QBoxPlotSeries. | |
|
65 | QBoxPlotSeries is QObject which is a child of a \a parent. | |
|
66 | */ | |
|
67 | QBoxPlotSeries::QBoxPlotSeries(QObject *parent) | |
|
68 | : QAbstractBarSeries(*new QBoxPlotSeriesPrivate(this), parent) | |
|
69 | { | |
|
70 | } | |
|
71 | ||
|
72 | /*! | |
|
73 | Destructor. Removes series from chart. | |
|
74 | */ | |
|
75 | QBoxPlotSeries::~QBoxPlotSeries() | |
|
76 | { | |
|
77 | qDebug() << "QBoxPlotSeries::~QBoxPlotSeries"; | |
|
78 | ||
|
79 | Q_D(QBoxPlotSeries); | |
|
80 | if (d->m_chart) | |
|
81 | d->m_chart->removeSeries(this); | |
|
82 | } | |
|
83 | ||
|
84 | /*! | |
|
85 | Returns QChartSeries::SeriesTypeBoxPlot. | |
|
86 | */ | |
|
87 | QAbstractSeries::SeriesType QBoxPlotSeries::type() const | |
|
88 | { | |
|
89 | return QAbstractSeries::SeriesTypeBoxPlot; | |
|
90 | } | |
|
91 | ||
|
92 | void QBoxPlotSeries::setBrush(const QBrush &brush) | |
|
93 | { | |
|
94 | Q_D(QBoxPlotSeries); | |
|
95 | ||
|
96 | if (d->m_brush != brush) { | |
|
97 | d->m_brush = brush; | |
|
98 | emit d->updated(); | |
|
99 | } | |
|
100 | } | |
|
101 | ||
|
102 | QBrush QBoxPlotSeries::brush() const | |
|
103 | { | |
|
104 | Q_D(const QBoxPlotSeries); | |
|
105 | ||
|
106 | return d->m_brush; | |
|
107 | } | |
|
108 | ||
|
109 | void QBoxPlotSeries::setPen(const QPen &pen) | |
|
110 | { | |
|
111 | Q_D(QBoxPlotSeries); | |
|
112 | ||
|
113 | if (d->m_pen != pen) { | |
|
114 | d->m_pen = pen; | |
|
115 | emit d->updated(); | |
|
116 | } | |
|
117 | } | |
|
118 | ||
|
119 | QPen QBoxPlotSeries::pen() const | |
|
120 | { | |
|
121 | Q_D(const QBoxPlotSeries); | |
|
122 | ||
|
123 | return d->m_pen; | |
|
124 | } | |
|
125 | ||
|
126 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
|
127 | ||
|
128 | QBoxPlotSeriesPrivate::QBoxPlotSeriesPrivate(QBoxPlotSeries *q) | |
|
129 | : QAbstractBarSeriesPrivate(q), | |
|
130 | m_pen(QPen(Qt::NoPen)), | |
|
131 | m_brush(QBrush(Qt::NoBrush)) | |
|
132 | { | |
|
133 | } | |
|
134 | ||
|
135 | QBoxPlotSeriesPrivate::~QBoxPlotSeriesPrivate() | |
|
136 | { | |
|
137 | qDebug() << "QBoxPlotSeriesPrivate::~QBoxPlotSeriesPrivate()"; | |
|
138 | disconnect(this, 0, 0, 0); | |
|
139 | } | |
|
140 | ||
|
141 | void QBoxPlotSeriesPrivate::initializeDomain() | |
|
142 | { | |
|
143 | qreal minX(domain()->minX()); | |
|
144 | qreal minY(domain()->minY()); | |
|
145 | qreal maxX(domain()->maxX()); | |
|
146 | qreal maxY(domain()->maxY()); | |
|
147 | ||
|
148 | qreal x = categoryCount(); | |
|
149 | minX = qMin(minX, - (qreal)0.5); | |
|
150 | minY = qMin(minY, bottom()); | |
|
151 | maxX = qMax(maxX, x - (qreal)0.5); | |
|
152 | //maxY = qMax(maxY, top()); | |
|
153 | maxY = qMax(maxY, max()); | |
|
154 | ||
|
155 | domain()->setRange(minX, maxX, minY, maxY); | |
|
156 | } | |
|
157 | ||
|
158 | void QBoxPlotSeriesPrivate::initializeGraphics(QGraphicsItem* parent) | |
|
159 | { | |
|
160 | Q_Q(QBoxPlotSeries); | |
|
161 | ||
|
162 | BoxPlotChartItem *boxPlot = new BoxPlotChartItem(q,parent); | |
|
163 | m_item.reset(boxPlot); | |
|
164 | QAbstractSeriesPrivate::initializeGraphics(parent); | |
|
165 | ||
|
166 | if (m_chart) { | |
|
167 | connect(m_chart->d_ptr->m_dataset, SIGNAL(seriesAdded(QAbstractSeries*)), this, SLOT(handleSeriesChange(QAbstractSeries*)) ); | |
|
168 | connect(m_chart->d_ptr->m_dataset, SIGNAL(seriesRemoved(QAbstractSeries*)), this, SLOT(handleSeriesRemove(QAbstractSeries*)) ); | |
|
169 | ||
|
170 | QList<QAbstractSeries *> serieses = m_chart->series(); | |
|
171 | boxPlot->m_seriesCount = serieses.count(); | |
|
172 | ||
|
173 | // Tries to find this series from the Chart's list of serieses and deduce the index | |
|
174 | int index = 0; | |
|
175 | foreach (QAbstractSeries *s, serieses) { | |
|
176 | if (q == static_cast<QBoxPlotSeries *>(s)) { | |
|
177 | boxPlot->m_seriesIndex = index; | |
|
178 | m_index = index; | |
|
179 | } | |
|
180 | index++; | |
|
181 | } | |
|
182 | } | |
|
183 | ||
|
184 | // Make BoxPlotChartItem to instantiate box & whisker items | |
|
185 | boxPlot->handleDataStructureChanged(); | |
|
186 | } | |
|
187 | ||
|
188 | void QBoxPlotSeriesPrivate::initializeTheme(int index, ChartTheme* theme, bool forced) | |
|
189 | { | |
|
190 | Q_Q(QBoxPlotSeries); | |
|
191 | ||
|
192 | const QList<QGradient> gradients = theme->seriesGradients(); | |
|
193 | ||
|
194 | if (forced || m_brush == QBrush(Qt::NoBrush)) { | |
|
195 | QColor brushColor = ChartThemeManager::colorAt(gradients.at(index % gradients.size()), 0.1); | |
|
196 | q->setBrush(brushColor); | |
|
197 | } | |
|
198 | ||
|
199 | if (forced || m_pen == QPen(Qt::NoPen)) { | |
|
200 | QPen pen; | |
|
201 | pen.setColor(ChartThemeManager::colorAt(gradients.at(index % gradients.size()), 1.0)); | |
|
202 | pen.setWidthF(1.0); | |
|
203 | pen.setCosmetic(true); | |
|
204 | q->setPen(pen); | |
|
205 | } | |
|
206 | } | |
|
207 | ||
|
208 | void QBoxPlotSeriesPrivate::initializeAnimations(QtCommercialChart::QChart::AnimationOptions options) | |
|
209 | { | |
|
210 | BoxPlotChartItem *item = static_cast<BoxPlotChartItem *>(m_item.data()); | |
|
211 | Q_ASSERT(item); | |
|
212 | if (options.testFlag(QChart::SeriesAnimations)) { | |
|
213 | item->setAnimation(new BoxPlotAnimation(item)); | |
|
214 | }else{ | |
|
215 | item->setAnimation((BoxPlotAnimation *)0); | |
|
216 | } | |
|
217 | QAbstractSeriesPrivate::initializeAnimations(options); | |
|
218 | } | |
|
219 | ||
|
220 | QList<QLegendMarker*> QBoxPlotSeriesPrivate::createLegendMarkers(QLegend *legend) | |
|
221 | { | |
|
222 | Q_Q(QBoxPlotSeries); | |
|
223 | QList<QLegendMarker*> list; | |
|
224 | return list << new QBoxPlotLegendMarker(q, legend); | |
|
225 | } | |
|
226 | ||
|
227 | void QBoxPlotSeriesPrivate::handleSeriesRemove(QAbstractSeries *series) | |
|
228 | { | |
|
229 | qDebug() << "QBoxPlotSeriesPrivate::handleSeriesRemove"; | |
|
230 | Q_Q(QBoxPlotSeries); | |
|
231 | ||
|
232 | QBoxPlotSeries *removedSeries = static_cast<QBoxPlotSeries *>(series); | |
|
233 | QObject::disconnect(m_chart->d_ptr->m_dataset, 0, removedSeries->d_func(), 0); | |
|
234 | ||
|
235 | // Test if series removed is me, then don't do anything | |
|
236 | if (q != removedSeries) { | |
|
237 | BoxPlotChartItem *item = static_cast<BoxPlotChartItem *>(m_item.data()); | |
|
238 | if (item) { | |
|
239 | item->m_seriesCount = item->m_seriesCount - 1; | |
|
240 | if (removedSeries->d_func()->m_index < m_index) { | |
|
241 | m_index--; | |
|
242 | item->m_seriesIndex = m_index; | |
|
243 | } | |
|
244 | ||
|
245 | item->handleDataStructureChanged(); | |
|
246 | } | |
|
247 | } | |
|
248 | } | |
|
249 | ||
|
250 | void QBoxPlotSeriesPrivate::handleSeriesChange(QAbstractSeries *series) | |
|
251 | { | |
|
252 | Q_UNUSED(series); | |
|
253 | ||
|
254 | Q_Q(QBoxPlotSeries); | |
|
255 | ||
|
256 | BoxPlotChartItem *boxPlot = static_cast<BoxPlotChartItem *>(m_item.data()); | |
|
257 | ||
|
258 | if (m_chart) { | |
|
259 | QList<QAbstractSeries *> serieses = m_chart->series(); | |
|
260 | boxPlot->m_seriesCount = serieses.count(); | |
|
261 | ||
|
262 | // Tries to find this series from the Chart's list of serieses and deduce the index | |
|
263 | int index = 0; | |
|
264 | foreach (QAbstractSeries *s, serieses) { | |
|
265 | if (q == static_cast<QBoxPlotSeries *>(s)) { | |
|
266 | boxPlot->m_seriesIndex = index; | |
|
267 | m_index = index; | |
|
268 | } | |
|
269 | index++; | |
|
270 | } | |
|
271 | } | |
|
272 | ||
|
273 | boxPlot->handleDataStructureChanged(); | |
|
274 | } | |
|
275 | ||
|
276 | #include "moc_qboxplotseries.cpp" | |
|
277 | #include "moc_qboxplotseries_p.cpp" | |
|
278 | ||
|
279 | QTCOMMERCIALCHART_END_NAMESPACE | |
|
280 |
@@ -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 | #ifndef QBOXPLOTSERIES_H | |
|
22 | #define QBOXPLOTSERIES_H | |
|
23 | ||
|
24 | #include <qchartglobal.h> | |
|
25 | #include <qabstractbarseries.h> | |
|
26 | ||
|
27 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | |
|
28 | ||
|
29 | class QBoxPlotSeriesPrivate; | |
|
30 | //class QBarSet; | |
|
31 | ||
|
32 | class QTCOMMERCIALCHART_EXPORT QBoxPlotSeries : public QAbstractBarSeries | |
|
33 | { | |
|
34 | Q_OBJECT | |
|
35 | public: | |
|
36 | explicit QBoxPlotSeries(QObject *parent = 0); | |
|
37 | ~QBoxPlotSeries(); | |
|
38 | ||
|
39 | QAbstractSeries::SeriesType type() const; | |
|
40 | ||
|
41 | void mika(); | |
|
42 | ||
|
43 | void setBrush(const QBrush &brush); | |
|
44 | QBrush brush() const; | |
|
45 | void setPen(const QPen &pen); | |
|
46 | QPen pen() const; | |
|
47 | ||
|
48 | private: | |
|
49 | Q_DECLARE_PRIVATE(QBoxPlotSeries) | |
|
50 | Q_DISABLE_COPY(QBoxPlotSeries) | |
|
51 | friend class BoxPlotChartItem; | |
|
52 | friend class QBoxPlotLegendMarkerPrivate; | |
|
53 | }; | |
|
54 | ||
|
55 | QTCOMMERCIALCHART_END_NAMESPACE | |
|
56 | ||
|
57 | #endif // QBOXPLOTSERIES_H |
@@ -0,0 +1,73 | |||
|
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 QBOXPLOTSERIES_P_H | |
|
31 | #define QBOXPLOTSERIES_P_H | |
|
32 | ||
|
33 | #include "qboxplotseries.h" | |
|
34 | #include "qabstractbarseries_p.h" | |
|
35 | #include "abstractdomain_p.h" | |
|
36 | #include "qbarset.h" | |
|
37 | ||
|
38 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | |
|
39 | ||
|
40 | class QBoxPlotSeriesPrivate : public QAbstractBarSeriesPrivate | |
|
41 | { | |
|
42 | Q_OBJECT | |
|
43 | ||
|
44 | public: | |
|
45 | QBoxPlotSeriesPrivate(QBoxPlotSeries *q); | |
|
46 | ~QBoxPlotSeriesPrivate(); | |
|
47 | ||
|
48 | void initializeGraphics(QGraphicsItem* parent); | |
|
49 | void initializeDomain(); | |
|
50 | void initializeAnimations(QChart::AnimationOptions options); | |
|
51 | void initializeTheme(int index, ChartTheme* theme, bool forced = false); | |
|
52 | ||
|
53 | QList<QLegendMarker*> createLegendMarkers(QLegend *legend); | |
|
54 | ||
|
55 | Q_SIGNALS: | |
|
56 | void updated(); | |
|
57 | ||
|
58 | private slots: | |
|
59 | void handleSeriesChange(QAbstractSeries *series); | |
|
60 | void handleSeriesRemove(QAbstractSeries *series); | |
|
61 | ||
|
62 | protected: | |
|
63 | QPen m_pen; | |
|
64 | QBrush m_brush; | |
|
65 | int m_index; | |
|
66 | ||
|
67 | private: | |
|
68 | Q_DECLARE_PUBLIC(QBoxPlotSeries) | |
|
69 | }; | |
|
70 | ||
|
71 | QTCOMMERCIALCHART_END_NAMESPACE | |
|
72 | ||
|
73 | #endif |
General Comments 0
You need to be logged in to leave comments.
Login now