##// END OF EJS Templates
Fix ownership handling: if object has a parent do not delete it
Michal Klocek -
r444:7fb10659b976
parent child
Show More
@@ -1,59 +1,59
1 1 #include "chartview.h"
2 2 #include <qlineseries.h>
3 3 #include <QTime>
4 4
5 5 ChartView::ChartView(QWidget* parent):QChartView(parent),
6 6 m_index(0)
7 7 {
8 8 QObject::connect(&m_timer,SIGNAL(timeout()),this,SLOT(handleTimeout()));
9 9 m_timer.setInterval(3000);
10 10
11 11 QTime now = QTime::currentTime();
12 12 qsrand((uint)now.msec());
13 13
14 QLineSeries* series0 = new QLineSeries();
14 QLineSeries* series0 = new QLineSeries(this);
15 15 QPen blue(Qt::blue);
16 16 blue.setWidth(3);
17 17 series0->setPen(blue);
18 QLineSeries* series1 = new QLineSeries();
18 QLineSeries* series1 = new QLineSeries(this);
19 19 QPen red(Qt::red);
20 20 red.setWidth(3);
21 21 series1->setPen(red);
22 QLineSeries* series2 = new QLineSeries();
22 QLineSeries* series2 = new QLineSeries(this);
23 23 QPen green(Qt::green);
24 24 green.setWidth(3);
25 25 series2->setPen(green);
26 26
27 27 int numPoints = 10;
28 28
29 29 for (int x = 0; x <= numPoints; ++x) {
30 30 series0->add(x, qrand() % 100);
31 31 series1->add(x, qrand() % 100);
32 32 series2->add(x, qrand() % 100);
33 33 }
34 34
35 35 addSeries(series0);
36 36
37 37 m_series<<series0;
38 38 m_series<<series1;
39 39 m_series<<series2;
40 40
41 41 m_timer.start();
42 42 }
43 43
44 44 ChartView::~ChartView()
45 45 {
46 46 if(m_series.size()==0) return;
47 47 removeSeries(m_series.at(m_index));
48 48 qDeleteAll(m_series);
49 49 }
50 50
51 51 void ChartView::handleTimeout()
52 52 {
53 53 if(m_series.size()==0) return;
54 54
55 55 removeSeries(m_series.at(m_index));
56 56 m_index++;
57 57 m_index=m_index%m_series.size();
58 58 addSeries(m_series.at(m_index));
59 59 }
@@ -1,288 +1,299
1 1 #include "chartdataset_p.h"
2 2 #include "qchartaxis.h"
3 3 //series
4 4 #include "qlineseries.h"
5 5 #include "qareaseries.h"
6 6 #include "qbarseries.h"
7 7 #include "qstackedbarseries.h"
8 8 #include "qpercentbarseries.h"
9 9 #include "qpieseries.h"
10 10 #include "qscatterseries.h"
11 11 #include "qsplineseries.h"
12 12
13 13 QTCOMMERCIALCHART_BEGIN_NAMESPACE
14 14
15 15 ChartDataSet::ChartDataSet(QObject *parent):QObject(parent),
16 16 m_axisX(new QChartAxis(this)),
17 17 m_axisY(new QChartAxis(this)),
18 18 m_domainIndex(0),
19 19 m_axisXInitialized(false)
20 20 {
21 21 }
22 22
23 23 ChartDataSet::~ChartDataSet()
24 24 {
25 25 }
26 26
27 27 void ChartDataSet::addSeries(QSeries* series, QChartAxis *axisY)
28 28 {
29 29 if(axisY==0) axisY = m_axisY;
30 30
31 31 QChartAxis* axis = m_seriesAxisMap.value(series);
32 32
33 33 if(axis) {
34 34 qWarning() << "Can not add series. Series already on the chart";
35 35 return;
36 36 }
37 37
38 38 if(!series->parent()){
39 39 series->setParent(this); // take ownership
40 40 };
41 41
42 42 if(!axisY->parent()){
43 43 axisY->setParent(this); // take ownership
44 44 }
45 45
46 46 Domain* domain = m_axisDomainMap.value(axisY);
47 47
48 48 if(!domain) {
49 49 domain = new Domain();
50 50
51 51 QObject::connect(axisY,SIGNAL(rangeChanged(qreal,qreal)),domain,SLOT(handleAxisRangeXChanged(qreal,qreal)));
52 52 QObject::connect(axisX(),SIGNAL(rangeChanged(qreal,qreal)),domain,SLOT(handleAxisRangeYChanged(qreal,qreal)));
53 53 //initialize
54 54 m_axisDomainMap.insert(axisY,domain);
55 55 emit axisAdded(axisY,domain);
56 56 }
57 57
58 58 if(!m_axisXInitialized){
59 59 emit axisAdded(axisX(),domain);
60 60 m_axisXInitialized=true;
61 61 }
62 62
63 63 calculateDomain(series,domain);
64 64
65 65 m_seriesAxisMap.insert(series,axisY);
66 66 emit seriesAdded(series,domain);
67 67
68 68 }
69 69
70 70 void ChartDataSet::removeSeries(QSeries* series)
71 71 {
72 72
73 73 QChartAxis* axis = m_seriesAxisMap.value(series);
74 74
75 75 if(!axis){
76 76 qWarning()<<"Can not remove series. Series not found on the chart.";
77 77 return;
78 78 }
79 79 emit seriesRemoved(series);
80 80 m_seriesAxisMap.remove(series);
81 81
82 82 if(series->parent()==this){
83 83 delete series;
84 84 series=0;
85 85 }
86 86
87 87 QList<QChartAxis*> axes = m_seriesAxisMap.values();
88 88
89 89 int i = axes.indexOf(axis);
90 90
91 91 if(i==-1){
92 92 Domain* domain = m_axisDomainMap.take(axis);
93 93 emit axisRemoved(axis);
94 if(axis!=axisY()){
95 if(axis->parent()==this){
96 delete axis;
97 axis=0;
98 }
99 }
94 100 delete domain;
95 101 }
96 102
97 103 if(m_seriesAxisMap.values().size()==0)
98 104 {
99 105 m_axisXInitialized=false;
100 106 emit axisRemoved(axisX());
101 107 }
102 108 }
103 109
104 110 void ChartDataSet::removeAllSeries()
105 111 {
106 112
107 113 QList<QSeries*> series = m_seriesAxisMap.keys();
108 114
109 115 foreach(QSeries* s , series) {
110 116 removeSeries(s);
111 117 }
112 118
113 119 Q_ASSERT(m_seriesAxisMap.count()==0);
114 120 Q_ASSERT(m_axisDomainMap.count()==0);
115 121
116 122 }
117 123
118 124 //to be removed with PIMPL
119 125 void ChartDataSet::calculateDomain(QSeries* series,Domain* domain) const
120 126 {
121 127 switch(series->type())
122 128 {
123 129 case QSeries::SeriesTypeLine: {
124 130
125 131 QLineSeries* lineSeries = static_cast<QLineSeries*>(series);
126 132
127 133 for (int i = 0; i < lineSeries->count(); i++)
128 134 {
129 135 qreal x = lineSeries->x(i);
130 136 qreal y = lineSeries->y(i);
131 137 domain->setMinX(qMin(domain->minX(),x));
132 138 domain->setMinY(qMin(domain->minY(),y));
133 139 domain->setMaxX(qMax(domain->maxX(),x));
134 140 domain->setMaxY(qMax(domain->maxY(),y));
135 141 }
136 142 break;
137 143 }
138 144 case QSeries::SeriesTypeArea: {
139 145
140 146 QAreaSeries* areaSeries = static_cast<QAreaSeries*>(series);
141 147
142 148 QLineSeries* upperSeries = areaSeries->upperSeries();
143 149 QLineSeries* lowerSeries = areaSeries->lowerSeries();
144 150
145 151 for (int i = 0; i < upperSeries->count(); i++)
146 152 {
147 153 qreal x = upperSeries->x(i);
148 154 qreal y = upperSeries->y(i);
149 155 domain->setMinX(qMin(domain->minX(),x));
150 156 domain->setMinY(qMin(domain->minY(),y));
151 157 domain->setMaxX(qMax(domain->maxX(),x));
152 158 domain->setMaxY(qMax(domain->maxY(),y));
153 159 }
154 160 if(lowerSeries) {
155 161 for (int i = 0; i < lowerSeries->count(); i++)
156 162 {
157 163 qreal x = lowerSeries->x(i);
158 164 qreal y = lowerSeries->y(i);
159 165 domain->setMinX(qMin(domain->minX(),x));
160 166 domain->setMinY(qMin(domain->minY(),y));
161 167 domain->setMaxX(qMax(domain->maxX(),x));
162 168 domain->setMaxY(qMax(domain->maxY(),y));
163 169 }}
164 170 break;
165 171 }
166 172 case QSeries::SeriesTypeBar: {
167 173 qDebug() << "QChartSeries::SeriesTypeBar";
168 174 QBarSeries* barSeries = static_cast<QBarSeries*>(series);
169 175 qreal x = barSeries->categoryCount();
170 176 qreal y = barSeries->max();
171 177 domain->setMinX(qMin(domain->minX(),x));
172 178 domain->setMinY(qMin(domain->minY(),y));
173 179 domain->setMaxX(qMax(domain->maxX(),x));
174 180 domain->setMaxY(qMax(domain->maxY(),y));
175 181 break;
176 182 }
177 183 case QSeries::SeriesTypeStackedBar: {
178 184 qDebug() << "QChartSeries::SeriesTypeStackedBar";
179 185
180 186 QStackedBarSeries* stackedBarSeries = static_cast<QStackedBarSeries*>(series);
181 187 qreal x = stackedBarSeries->categoryCount();
182 188 qreal y = stackedBarSeries->maxCategorySum();
183 189 domain->setMinX(qMin(domain->minX(),x));
184 190 domain->setMinY(qMin(domain->minY(),y));
185 191 domain->setMaxX(qMax(domain->maxX(),x));
186 192 domain->setMaxY(qMax(domain->maxY(),y));
187 193 break;
188 194 }
189 195 case QSeries::SeriesTypePercentBar: {
190 196 qDebug() << "QChartSeries::SeriesTypePercentBar";
191 197
192 198 QPercentBarSeries* percentBarSeries = static_cast<QPercentBarSeries*>(series);
193 199 qreal x = percentBarSeries->categoryCount();
194 200 domain->setMinX(qMin(domain->minX(),x));
195 201 domain->setMinY(0);
196 202 domain->setMaxX(qMax(domain->maxX(),x));
197 203 domain->setMaxY(100);
198 204 break;
199 205 }
200 206
201 207 case QSeries::SeriesTypePie: {
202 208 QPieSeries *pieSeries = static_cast<QPieSeries *>(series);
203 209 // TODO: domain stuff
204 210 break;
205 211 }
206 212
207 213 case QSeries::SeriesTypeScatter: {
208 214 QScatterSeries *scatterSeries = qobject_cast<QScatterSeries *>(series);
209 215 Q_ASSERT(scatterSeries);
210 216 foreach (QPointF point, scatterSeries->data()) {
211 217 domain->setMinX(qMin(domain->minX(), point.x()));
212 218 domain->setMinY(qMax(domain->maxX(), point.x()));
213 219 domain->setMaxX(qMin(domain->minY(), point.y()));
214 220 domain->setMaxY(qMax(domain->maxY(), point.y()));
215 221 }
216 222 break;
217 223 }
218 224
219 225 case QSeries::SeriesTypeSpline: {
220 226 QSplineSeries* splineSeries = static_cast<QSplineSeries*>(series);
221 227
222 228 for (int i = 0; i < splineSeries->count(); i++)
223 229 {
224 230 qreal x = splineSeries->x(i);
225 231 qreal y = splineSeries->y(i);
226 232 domain->setMinX(qMin(domain->minX(),x));
227 233 domain->setMinY(qMin(domain->minY(),y));
228 234 domain->setMaxX(qMax(domain->maxX(),x));
229 235 domain->setMaxY(qMax(domain->maxY(),y));
230 236 }
231 237 break;
232 238 }
233 239
234 240 default: {
235 241 qDebug()<<__FUNCTION__<<"type" << series->type()<<"not supported";
236 242 return;
237 243 break;
238 244 }
239 245
240 246 }
241 247 }
242 248
243 249 void ChartDataSet::zoomInDomain(const QRectF& rect, const QSizeF& size)
244 250 {
245 251 QMapIterator<QChartAxis*, Domain*> i( m_axisDomainMap);
246 252 while (i.hasNext()) {
247 253 i.next();
248 254 i.value()->zoomIn(rect,size);
249 255 }
250 256 }
251 257
252 258 void ChartDataSet::zoomOutDomain(const QRectF& rect, const QSizeF& size)
253 259 {
254 260 QMapIterator<QChartAxis*, Domain*> i( m_axisDomainMap);
255 261 while (i.hasNext()) {
256 262 i.next();
257 263 i.value()->zoomOut(rect,size);
258 264 }
259 265 }
260 266
261 267 QChartAxis* ChartDataSet::axisY(QSeries* series) const
262 268 {
263 269 if(series == 0) return m_axisY;
264 270 return m_seriesAxisMap.value(series);
265 271 }
266 272
267 273 Domain* ChartDataSet::domain(QSeries* series) const
268 274 {
269 275 QChartAxis* axis = m_seriesAxisMap.value(series);
270 276 if(axis){
271 277 return m_axisDomainMap.value(axis);
272 278 }else
273 279 return 0;
274 280 }
275 281
276 282 Domain* ChartDataSet::domain(QChartAxis* axis) const
277 283 {
278 return m_axisDomainMap.value(axis);
284 if(axis==axisX()) {
285 return m_axisDomainMap.value(axisY());
286 }
287 else {
288 return m_axisDomainMap.value(axis);
289 }
279 290 }
280 291
281 292 QChartAxis* ChartDataSet::axis(QSeries* series) const
282 293 {
283 294 return m_seriesAxisMap.value(series);
284 295 }
285 296
286 297 #include "moc_chartdataset_p.cpp"
287 298
288 299 QTCOMMERCIALCHART_END_NAMESPACE
General Comments 0
You need to be logged in to leave comments. Login now