@@ -265,7 +265,8 QChart* ThemeWidget::createPieChart() const | |||
|
265 | 265 | } |
|
266 | 266 | qreal hPos = (pieSize / 2) + (i / (qreal) m_dataTable.count()); |
|
267 | 267 | series->setPieSize(pieSize); |
|
268 |
series->set |
|
|
268 | series->setHorizontalPosition(hPos); | |
|
269 | series->setVerticalPosition(0.5); | |
|
269 | 270 | chart->addSeries(series); |
|
270 | 271 | } |
|
271 | 272 |
@@ -85,13 +85,13 MainWidget::MainWidget(QWidget* parent) | |||
|
85 | 85 | m_hPosition->setMinimum(0.0); |
|
86 | 86 | m_hPosition->setMaximum(1.0); |
|
87 | 87 | m_hPosition->setSingleStep(0.1); |
|
88 |
m_hPosition->setValue(m_series-> |
|
|
88 | m_hPosition->setValue(m_series->horizontalPosition()); | |
|
89 | 89 | |
|
90 | 90 | m_vPosition = new QDoubleSpinBox(); |
|
91 | 91 | m_vPosition->setMinimum(0.0); |
|
92 | 92 | m_vPosition->setMaximum(1.0); |
|
93 | 93 | m_vPosition->setSingleStep(0.1); |
|
94 |
m_vPosition->setValue(m_series-> |
|
|
94 | m_vPosition->setValue(m_series->verticalPosition()); | |
|
95 | 95 | |
|
96 | 96 | m_sizeFactor = new QDoubleSpinBox(); |
|
97 | 97 | m_sizeFactor->setMinimum(0.0); |
@@ -215,7 +215,8 void MainWidget::updateChartSettings() | |||
|
215 | 215 | |
|
216 | 216 | void MainWidget::updateSerieSettings() |
|
217 | 217 | { |
|
218 |
m_series->set |
|
|
218 | m_series->setHorizontalPosition(m_hPosition->value()); | |
|
219 | m_series->setVerticalPosition(m_vPosition->value()); | |
|
219 | 220 | m_series->setPieSize(m_sizeFactor->value()); |
|
220 | 221 | m_series->setPieStartAngle(m_startAngle->value()); |
|
221 | 222 | m_series->setPieEndAngle(m_endAngle->value()); |
@@ -40,7 +40,6 void DeclarativePieSeries::componentComplete() | |||
|
40 | 40 | if (declarativeChart) { |
|
41 | 41 | QChart *chart = qobject_cast<QChart *>(declarativeChart->m_chart); |
|
42 | 42 | Q_ASSERT(chart); |
|
43 | qDebug() << "parent for pie:" << chart; | |
|
44 | 43 | chart->addSeries(this); |
|
45 | 44 | } |
|
46 | 45 | } |
@@ -133,8 +133,8 void PieChartItem::handleGeometryChanged(const QRectF& rect) | |||
|
133 | 133 | void PieChartItem::calculatePieLayout() |
|
134 | 134 | { |
|
135 | 135 | // find pie center coordinates |
|
136 |
m_pieCenter.setX(m_rect.left() + (m_rect.width() * m_series-> |
|
|
137 |
m_pieCenter.setY(m_rect.top() + (m_rect.height() * m_series-> |
|
|
136 | m_pieCenter.setX(m_rect.left() + (m_rect.width() * m_series->horizontalPosition())); | |
|
137 | m_pieCenter.setY(m_rect.top() + (m_rect.height() * m_series->verticalPosition())); | |
|
138 | 138 | |
|
139 | 139 | // find maximum radius for pie |
|
140 | 140 | m_pieRadius = m_rect.height() / 2; |
@@ -184,6 +184,32 void QPieSeriesPrivate::modelDataRemoved(QModelIndex parent, int start, int end) | |||
|
184 | 184 | q->remove(m_slices.at(start)); |
|
185 | 185 | } |
|
186 | 186 | |
|
187 | bool QPieSeriesPrivate::setRealValue(qreal &value, qreal newValue, qreal max, qreal min) | |
|
188 | { | |
|
189 | // Remove rounding errors | |
|
190 | qreal roundedValue = newValue; | |
|
191 | if (qFuzzyIsNull(min) && qFuzzyIsNull(newValue)) | |
|
192 | roundedValue = 0.0; | |
|
193 | else if (qFuzzyCompare(newValue, max)) | |
|
194 | roundedValue = max; | |
|
195 | else if (qFuzzyCompare(newValue, min)) | |
|
196 | roundedValue = min; | |
|
197 | ||
|
198 | // Check if the position is valid after removing the rounding errors | |
|
199 | if (roundedValue < min || roundedValue > max) { | |
|
200 | qWarning("QPieSeries: Illegal value"); | |
|
201 | return false; | |
|
202 | } | |
|
203 | ||
|
204 | if (!qFuzzyIsNull(value - roundedValue)) { | |
|
205 | value = roundedValue; | |
|
206 | return true; | |
|
207 | } | |
|
208 | ||
|
209 | // The change was so small it is considered a rounding error | |
|
210 | return false; | |
|
211 | } | |
|
212 | ||
|
187 | 213 | |
|
188 | 214 | |
|
189 | 215 | /*! |
@@ -380,33 +406,32 QList<QPieSlice*> QPieSeries::slices() const | |||
|
380 | 406 | } |
|
381 | 407 | |
|
382 | 408 | /*! |
|
383 |
Sets the center position of the pie |
|
|
384 | ||
|
385 | The factors are relative to the chart rectangle where: | |
|
409 | Sets the horizontal center position of the pie to \relativePosition. If \relativePosition is | |
|
410 | set to 0.0 the pie is drawn on the left side of the chart and if it's set to 1.0 the pie is | |
|
411 | drawn on right side of the chart. The default value 0.5 puts the pie in the middle. | |
|
386 | 412 | |
|
387 | \a relativeHorizontalPosition 0.0 means the absolute left. | |
|
388 | \a relativeHorizontalPosition 1.0 means the absolute right. | |
|
389 | \a relativeVerticalPosition 0.0 means the absolute top. | |
|
390 | \a relativeVerticalPosition 1.0 means the absolute bottom. | |
|
413 | \sa setHorizontalPosition(), setPieSize() | |
|
414 | */ | |
|
415 | void QPieSeries::setHorizontalPosition(qreal relativePosition) | |
|
416 | { | |
|
417 | Q_D(QPieSeries); | |
|
418 | if (d->setRealValue(d->m_pieRelativeHorPos, relativePosition, 1.0)) | |
|
419 | emit piePositionChanged(); | |
|
420 | } | |
|
391 | 421 | |
|
392 | By default both values are 0.5 which puts the pie in the middle of the chart rectangle. | |
|
422 | /*! | |
|
423 | Sets the vertical center position of the pie to \relativePosition. If \relativePosition is | |
|
424 | set to 0.0 the pie is drawn on the top of the chart and if it's set to 1.0 the pie is drawn | |
|
425 | on bottom of the chart. The default value 0.5 puts the pie in the middle. | |
|
393 | 426 | |
|
394 |
\sa |
|
|
427 | \sa setVerticalPosition(), setPieSize() | |
|
395 | 428 | */ |
|
396 |
void QPieSeries::set |
|
|
429 | void QPieSeries::setVerticalPosition(qreal relativePosition) | |
|
397 | 430 | { |
|
398 | 431 | Q_D(QPieSeries); |
|
399 | if (relativeHorizontalPosition < 0.0 || relativeHorizontalPosition > 1.0 || | |
|
400 | relativeVerticalPosition < 0.0 || relativeVerticalPosition > 1.0) | |
|
401 | return; | |
|
402 | ||
|
403 | if (!qFuzzyIsNull(d->m_pieRelativeHorPos - relativeHorizontalPosition) || | |
|
404 | !qFuzzyIsNull(d->m_pieRelativeVerPos - relativeVerticalPosition)) { | |
|
405 | d->m_pieRelativeHorPos = relativeHorizontalPosition; | |
|
406 | d->m_pieRelativeVerPos = relativeVerticalPosition; | |
|
432 | if (d->setRealValue(d->m_pieRelativeVerPos, relativePosition, 1.0)) | |
|
407 | 433 | emit piePositionChanged(); |
|
408 | 434 | } |
|
409 | } | |
|
410 | 435 | |
|
411 | 436 | /*! |
|
412 | 437 | Gets the horizontal position of the pie. |
@@ -418,9 +443,9 void QPieSeries::setPiePosition(qreal relativeHorizontalPosition, qreal relative | |||
|
418 | 443 | |
|
419 | 444 | By default it is 0.5 which puts the pie in the horizontal middle of the chart rectangle. |
|
420 | 445 | |
|
421 |
\sa |
|
|
446 | \sa verticalPosition(), setPieSize() | |
|
422 | 447 | */ |
|
423 |
qreal QPieSeries:: |
|
|
448 | qreal QPieSeries::horizontalPosition() const | |
|
424 | 449 | { |
|
425 | 450 | Q_D(const QPieSeries); |
|
426 | 451 | return d->m_pieRelativeHorPos; |
@@ -436,9 +461,9 qreal QPieSeries::pieHorizontalPosition() const | |||
|
436 | 461 | |
|
437 | 462 | By default it is 0.5 which puts the pie in the vertical middle of the chart rectangle. |
|
438 | 463 | |
|
439 |
\sa |
|
|
464 | \sa horizontalPosition(), setPieSize() | |
|
440 | 465 | */ |
|
441 |
qreal QPieSeries:: |
|
|
466 | qreal QPieSeries::verticalPosition() const | |
|
442 | 467 | { |
|
443 | 468 | Q_D(const QPieSeries); |
|
444 | 469 | return d->m_pieRelativeVerPos; |
@@ -456,14 +481,9 qreal QPieSeries::pieVerticalPosition() const | |||
|
456 | 481 | void QPieSeries::setPieSize(qreal relativeSize) |
|
457 | 482 | { |
|
458 | 483 | Q_D(QPieSeries); |
|
459 |
if ( |
|
|
460 | return; | |
|
461 | ||
|
462 | if (!qFuzzyIsNull(d->m_pieRelativeSize- relativeSize)) { | |
|
463 | d->m_pieRelativeSize = relativeSize; | |
|
484 | if (d->setRealValue(d->m_pieRelativeSize, relativeSize, 1.0)) | |
|
464 | 485 | emit pieSizeChanged(); |
|
465 | 486 | } |
|
466 | } | |
|
467 | 487 | |
|
468 | 488 | /*! |
|
469 | 489 | Gets the relative size of the pie. |
@@ -493,15 +513,9 qreal QPieSeries::pieSize() const | |||
|
493 | 513 | void QPieSeries::setPieStartAngle(qreal angle) |
|
494 | 514 | { |
|
495 | 515 | Q_D(QPieSeries); |
|
496 | ||
|
497 | if (angle < 0 || angle > 360 || angle > d->m_pieEndAngle) | |
|
498 | return; | |
|
499 | ||
|
500 | if (!qFuzzyIsNull(angle - d->m_pieStartAngle)) { | |
|
501 | d->m_pieStartAngle = angle; | |
|
516 | if (d->setRealValue(d->m_pieStartAngle, angle, d->m_pieEndAngle)) | |
|
502 | 517 | d->updateDerivativeData(); |
|
503 | 518 | } |
|
504 | } | |
|
505 | 519 | |
|
506 | 520 | /*! |
|
507 | 521 | Gets the start angle of the pie. |
@@ -529,14 +543,9 void QPieSeries::setPieEndAngle(qreal angle) | |||
|
529 | 543 | { |
|
530 | 544 | Q_D(QPieSeries); |
|
531 | 545 | |
|
532 |
if ( |
|
|
533 | return; | |
|
534 | ||
|
535 | if (!qFuzzyIsNull(angle - d->m_pieEndAngle)) { | |
|
536 | d->m_pieEndAngle = angle; | |
|
546 | if (d->setRealValue(d->m_pieEndAngle, angle, 360.0, d->m_pieStartAngle)) | |
|
537 | 547 | d->updateDerivativeData(); |
|
538 | 548 | } |
|
539 | } | |
|
540 | 549 | |
|
541 | 550 | /*! |
|
542 | 551 | Returns the end angle of the pie. |
@@ -30,6 +30,11 class QPieSlice; | |||
|
30 | 30 | class QTCOMMERCIALCHART_EXPORT QPieSeries : public QSeries |
|
31 | 31 | { |
|
32 | 32 | Q_OBJECT |
|
33 | Q_PROPERTY(qreal horizontalPosition READ horizontalPosition WRITE setHorizontalPosition) | |
|
34 | Q_PROPERTY(qreal verticalPosition READ verticalPosition WRITE setVerticalPosition) | |
|
35 | Q_PROPERTY(qreal size READ pieSize WRITE setPieSize) | |
|
36 | Q_PROPERTY(qreal startAngle READ pieStartAngle WRITE setPieStartAngle) | |
|
37 | Q_PROPERTY(qreal endAngle READ pieEndAngle WRITE setPieEndAngle) | |
|
33 | 38 | |
|
34 | 39 | public: |
|
35 | 40 | QPieSeries(QObject *parent = 0); |
@@ -57,9 +62,10 public: | |||
|
57 | 62 | qreal total() const; |
|
58 | 63 | |
|
59 | 64 | // pie customization |
|
60 |
void set |
|
|
61 |
qreal |
|
|
62 | qreal pieVerticalPosition() const; | |
|
65 | void setHorizontalPosition(qreal relativePosition); | |
|
66 | qreal horizontalPosition() const; | |
|
67 | void setVerticalPosition(qreal relativePosition); | |
|
68 | qreal verticalPosition() const; | |
|
63 | 69 | void setPieSize(qreal relativeSize); |
|
64 | 70 | qreal pieSize() const; |
|
65 | 71 | void setPieStartAngle(qreal startAngle); |
@@ -46,6 +46,7 public Q_SLOTS: | |||
|
46 | 46 | void modelUpdated(QModelIndex topLeft, QModelIndex bottomRight); |
|
47 | 47 | void modelDataAdded(QModelIndex parent, int start, int end); |
|
48 | 48 | void modelDataRemoved(QModelIndex parent, int start, int end); |
|
49 | bool setRealValue(qreal &value, qreal newValue, qreal max, qreal min = 0.0); | |
|
49 | 50 | |
|
50 | 51 | public: |
|
51 | 52 | QPieSeries * const q_ptr; |
@@ -82,6 +82,5 | |||
|
82 | 82 | \brief Returns the name of the series. |
|
83 | 83 | */ |
|
84 | 84 | |
|
85 |
QTCOMMERCIALCHART_ |
|
|
85 | QTCOMMERCIALCHART_USE_NAMESPACE | |
|
86 | 86 | #include "moc_qseries.cpp" |
|
87 | QTCOMMERCIALCHART_END_NAMESPACE |
@@ -33,6 +33,8 QTCOMMERCIALCHART_BEGIN_NAMESPACE | |||
|
33 | 33 | class QTCOMMERCIALCHART_EXPORT QSeries : public QObject |
|
34 | 34 | { |
|
35 | 35 | Q_OBJECT |
|
36 | Q_PROPERTY(QString name READ name WRITE setName) | |
|
37 | ||
|
36 | 38 | public: |
|
37 | 39 | enum QSeriesType { |
|
38 | 40 | SeriesTypeLine, |
@@ -58,16 +58,20 Rectangle { | |||
|
58 | 58 | |
|
59 | 59 | BarSeries { |
|
60 | 60 | barCategories: [ "2008", "2009", "2010", "2011", "2012" ] |
|
61 | // TBD: data | |
|
61 | 62 | } |
|
62 | 63 | |
|
63 | 64 | PieSeries { |
|
65 | horizontalPosition: 0.2 | |
|
66 | verticalPosition: 0.3 | |
|
67 | size: 0.4 | |
|
68 | endAngle: 0.52 * 360 // The share of "others" is 52% | |
|
64 | 69 | slices: [ |
|
65 | 70 | PieSlice { label: "Volkswagen"; value: 13.5 }, |
|
66 | 71 | PieSlice { label: "Toyota"; value: 10.9 }, |
|
67 | 72 | PieSlice { label: "Ford"; value: 8.6 }, |
|
68 | 73 | PieSlice { label: "Skoda"; value: 8.2 }, |
|
69 |
PieSlice { label: "Volvo"; value: 6.8 } |
|
|
70 | PieSlice { label: "Others"; value: 52.0 } | |
|
74 | PieSlice { label: "Volvo"; value: 6.8 } | |
|
71 | 75 | ] |
|
72 | 76 | } |
|
73 | 77 | } |
@@ -82,6 +86,7 Rectangle { | |||
|
82 | 86 | theme: Chart.ChartThemeBrownSand |
|
83 | 87 | |
|
84 | 88 | LineSeries { |
|
89 | name: "Line" | |
|
85 | 90 | points: [ |
|
86 | 91 | XyPoint { x: 0.0; y: 0.0 }, |
|
87 | 92 | XyPoint { x: 1.1; y: 2.1 }, |
@@ -91,6 +96,7 Rectangle { | |||
|
91 | 96 | } |
|
92 | 97 | |
|
93 | 98 | SplineSeries { |
|
99 | name: "Spline" | |
|
94 | 100 | points: [ |
|
95 | 101 | XyPoint { x: 0.0; y: 0.3 }, |
|
96 | 102 | XyPoint { x: 1.1; y: 3.2 }, |
@@ -99,6 +105,7 Rectangle { | |||
|
99 | 105 | } |
|
100 | 106 | |
|
101 | 107 | AreaSeries { |
|
108 | name: "Area" | |
|
102 | 109 | points: [ |
|
103 | 110 | XyPoint { x: 0.0; y: 1.1 }, |
|
104 | 111 | XyPoint { x: 2.5; y: 3.6 }, |
@@ -112,6 +119,7 Rectangle { | |||
|
112 | 119 | } |
|
113 | 120 | |
|
114 | 121 | ScatterSeries { |
|
122 | name: "Scatter1" | |
|
115 | 123 | points: [ |
|
116 | 124 | XyPoint { x: 1.5; y: 1.5 }, |
|
117 | 125 | XyPoint { x: 1.5; y: 1.6 }, |
@@ -119,6 +127,7 Rectangle { | |||
|
119 | 127 | ] |
|
120 | 128 | } |
|
121 | 129 | ScatterSeries { |
|
130 | name: "Scatter2" | |
|
122 | 131 | points: [ |
|
123 | 132 | XyPoint { x: 2.0; y: 2.0 }, |
|
124 | 133 | XyPoint { x: 2.0; y: 2.1 }, |
@@ -126,6 +135,7 Rectangle { | |||
|
126 | 135 | ] |
|
127 | 136 | } |
|
128 | 137 | ScatterSeries { |
|
138 | name: "Scatter3" | |
|
129 | 139 | points: [ |
|
130 | 140 | XyPoint { x: 2.6; y: 2.6 }, |
|
131 | 141 | XyPoint { x: 2.6; y: 2.7 }, |
General Comments 0
You need to be logged in to leave comments.
Login now