@@ -93,15 +93,13 void QChart::addSeries(QChartSeries* series) | |||||
93 | } |
|
93 | } | |
94 | } |
|
94 | } | |
95 |
|
95 | |||
96 |
QChartSeries* QChart::createSeries( |
|
96 | QChartSeries* QChart::createSeries(QChartSeries::QChartSeriesType type) | |
97 | { |
|
97 | { | |
98 | // TODO: support also other types; not only scatter and pie |
|
98 | // TODO: support also other types; not only scatter and pie | |
99 | Q_ASSERT(type == QChartSeries::SeriesTypeScatter |
|
|||
100 | || type == QChartSeries::SeriesTypePie); |
|
|||
101 |
|
99 | |||
102 | switch (type) { |
|
100 | switch (type) { | |
103 | case QChartSeries::SeriesTypeScatter: { |
|
101 | case QChartSeries::SeriesTypeScatter: { | |
104 |
QScatterSeries *scatterSeries = new QScatterSeries( |
|
102 | QScatterSeries *scatterSeries = new QScatterSeries(this); | |
105 | connect(this, SIGNAL(sizeChanged(QRectF)), |
|
103 | connect(this, SIGNAL(sizeChanged(QRectF)), | |
106 | scatterSeries, SLOT(chartSizeChanged(QRectF))); |
|
104 | scatterSeries, SLOT(chartSizeChanged(QRectF))); | |
107 | scatterSeries->d->setParentItem(this); |
|
105 | scatterSeries->d->setParentItem(this); | |
@@ -110,12 +108,13 QChartSeries* QChart::createSeries(QList<qreal> x, QList<qreal> y, QChartSeries: | |||||
110 | case QChartSeries::SeriesTypePie: { |
|
108 | case QChartSeries::SeriesTypePie: { | |
111 | // TODO: we now have also a list of y values as a parameter, it is ignored |
|
109 | // TODO: we now have also a list of y values as a parameter, it is ignored | |
112 | // we should use a generic data class instead of list of x and y values |
|
110 | // we should use a generic data class instead of list of x and y values | |
113 |
QPieSeries *pieSeries = new QPieSeries( |
|
111 | QPieSeries *pieSeries = new QPieSeries(this); | |
114 | connect(this, SIGNAL(sizeChanged(QRectF)), |
|
112 | connect(this, SIGNAL(sizeChanged(QRectF)), | |
115 | pieSeries, SLOT(chartSizeChanged(QRectF))); |
|
113 | pieSeries, SLOT(chartSizeChanged(QRectF))); | |
116 | return pieSeries; |
|
114 | return pieSeries; | |
117 | } |
|
115 | } | |
118 | default: |
|
116 | default: | |
|
117 | Q_ASSERT(false); | |||
119 | break; |
|
118 | break; | |
120 | } |
|
119 | } | |
121 |
|
120 |
@@ -36,7 +36,7 public: | |||||
36 | void addSeries(QChartSeries* series); |
|
36 | void addSeries(QChartSeries* series); | |
37 | //TODO: QChartSeries* createSeries(QSeriesData *data, QChartSeries::QChartSeriesType type); |
|
37 | //TODO: QChartSeries* createSeries(QSeriesData *data, QChartSeries::QChartSeriesType type); | |
38 | // TODO: who owns the series now? maybe owned by chart and returned a reference instead... |
|
38 | // TODO: who owns the series now? maybe owned by chart and returned a reference instead... | |
39 |
QChartSeries* createSeries( |
|
39 | QChartSeries* createSeries(QChartSeries::QChartSeriesType type); | |
40 |
|
40 | |||
41 | virtual void setSize(const QSizeF& rect); |
|
41 | virtual void setSize(const QSizeF& rect); | |
42 | void setMargin(int margin); |
|
42 | void setMargin(int margin); |
@@ -25,11 +25,14 protected: | |||||
25 | public: |
|
25 | public: | |
26 | virtual ~QChartSeries(){}; |
|
26 | virtual ~QChartSeries(){}; | |
27 |
|
27 | |||
28 |
// |
|
28 | // Factory method | |
29 | static QChartSeries* create(QObject* parent = 0 ){ return 0;} |
|
29 | static QChartSeries* create(QObject* parent = 0 ){ return 0;} | |
30 |
// |
|
30 | // Pure virtual | |
31 | virtual QChartSeriesType type() const = 0; |
|
31 | virtual QChartSeriesType type() const = 0; | |
32 |
|
32 | |||
|
33 | virtual bool setData(QList<int> data) { return false; } | |||
|
34 | virtual bool setData(QList<qreal> data) { return false; } | |||
|
35 | virtual bool setData(QList<qreal> x, QList<qreal> y){ return false; } | |||
33 | }; |
|
36 | }; | |
34 |
|
37 | |||
35 | QTCOMMERCIALCHART_END_NAMESPACE |
|
38 | QTCOMMERCIALCHART_END_NAMESPACE |
@@ -40,10 +40,10 void QChartView::addSeries(QChartSeries* series) | |||||
40 | m_chart->addSeries(series); |
|
40 | m_chart->addSeries(series); | |
41 | } |
|
41 | } | |
42 |
|
42 | |||
43 |
QChartSeries* QChartView::createSeries( |
|
43 | QChartSeries* QChartView::createSeries(QChartSeries::QChartSeriesType type) | |
44 | { |
|
44 | { | |
45 |
|
45 | |||
46 |
return m_chart->createSeries( |
|
46 | return m_chart->createSeries(type); | |
47 | } |
|
47 | } | |
48 |
|
48 | |||
49 | void QChartView::mousePressEvent(QMouseEvent *event) |
|
49 | void QChartView::mousePressEvent(QMouseEvent *event) |
@@ -21,9 +21,9 public: | |||||
21 | //implement from QWidget |
|
21 | //implement from QWidget | |
22 | void resizeEvent(QResizeEvent *event); |
|
22 | void resizeEvent(QResizeEvent *event); | |
23 |
|
23 | |||
24 | // TODO: addSeries and createSeries are optional solutions |
|
|||
25 | void addSeries(QChartSeries* series); |
|
24 | void addSeries(QChartSeries* series); | |
26 | QChartSeries* createSeries(QList<qreal> x, QList<qreal> y, QChartSeries::QChartSeriesType type); |
|
25 | // Convenience function | |
|
26 | QChartSeries* createSeries(QChartSeries::QChartSeriesType type); | |||
27 |
|
27 | |||
28 | protected: |
|
28 | protected: | |
29 | void mouseMoveEvent (QMouseEvent *event); |
|
29 | void mouseMoveEvent (QMouseEvent *event); |
@@ -14,7 +14,7 QGraphicsView(parent) | |||||
14 | setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); |
|
14 | setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); | |
15 | setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); |
|
15 | setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); | |
16 | setScene(m_scene); |
|
16 | setScene(m_scene); | |
17 |
|
17 | |||
18 | m_chart = new QChart(); |
|
18 | m_chart = new QChart(); | |
19 | m_scene->addItem(m_chart); |
|
19 | m_scene->addItem(m_chart); | |
20 | show(); |
|
20 | show(); | |
@@ -42,9 +42,9 void QChartWidget::addSeries(QChartSeries* series) | |||||
42 | m_chart->addSeries(series); |
|
42 | m_chart->addSeries(series); | |
43 | } |
|
43 | } | |
44 |
|
44 | |||
45 |
QChartSeries* QChartWidget::createSeries( |
|
45 | QChartSeries* QChartWidget::createSeries(QChartSeries::QChartSeriesType type) | |
46 | { |
|
46 | { | |
47 |
return m_chart->createSeries( |
|
47 | return m_chart->createSeries(type); | |
48 | } |
|
48 | } | |
49 | #include "moc_qchartwidget.cpp" |
|
49 | #include "moc_qchartwidget.cpp" | |
50 |
|
50 |
@@ -26,7 +26,7 public: | |||||
26 | // TODO: addSeries and createSeries are optional solutions |
|
26 | // TODO: addSeries and createSeries are optional solutions | |
27 | // TODO: currently createSeries assumes x, y value pairs. This isn't case with all charts. So is there another createSeries for other types (for example one list of ints)? |
|
27 | // TODO: currently createSeries assumes x, y value pairs. This isn't case with all charts. So is there another createSeries for other types (for example one list of ints)? | |
28 | void addSeries(QChartSeries* series); |
|
28 | void addSeries(QChartSeries* series); | |
29 |
QChartSeries* createSeries( |
|
29 | QChartSeries* createSeries(QChartSeries::QChartSeriesType type); | |
30 |
|
30 | |||
31 | private: |
|
31 | private: | |
32 | Q_DISABLE_COPY(QChartWidget) |
|
32 | Q_DISABLE_COPY(QChartWidget) |
@@ -5,23 +5,34 | |||||
5 |
|
5 | |||
6 | QTCOMMERCIALCHART_BEGIN_NAMESPACE |
|
6 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | |
7 |
|
7 | |||
8 |
QPieSeries::QPieSeries( |
|
8 | QPieSeries::QPieSeries(QGraphicsObject *parent) : | |
9 | QChartSeries(parent), |
|
9 | QChartSeries(parent), | |
10 | m_x(x), |
|
|||
11 | m_sizeFactor(1.0) |
|
10 | m_sizeFactor(1.0) | |
12 | { |
|
11 | { | |
|
12 | } | |||
|
13 | ||||
|
14 | QPieSeries::~QPieSeries() | |||
|
15 | { | |||
|
16 | while (m_slices.count()) | |||
|
17 | delete m_slices.takeLast(); | |||
|
18 | } | |||
|
19 | ||||
|
20 | bool QPieSeries::setData(QList<qreal> data) | |||
|
21 | { | |||
|
22 | m_data = data; | |||
|
23 | ||||
13 | // Create slices |
|
24 | // Create slices | |
14 | qreal fullPie = 360; |
|
25 | qreal fullPie = 360; | |
15 | qreal total = 0; |
|
26 | qreal total = 0; | |
16 |
foreach (qreal value, m_ |
|
27 | foreach (qreal value, m_data) | |
17 | total += value; |
|
28 | total += value; | |
18 |
|
29 | |||
19 | QGraphicsItem *parentItem = qobject_cast<QGraphicsItem *>(parent); |
|
30 | QGraphicsItem *parentItem = qobject_cast<QGraphicsItem *>(parent()); | |
20 | Q_ASSERT(parentItem); |
|
31 | Q_ASSERT(parentItem); | |
21 | m_chartSize = parentItem->boundingRect(); |
|
32 | m_chartSize = parentItem->boundingRect(); | |
22 | qreal angle = 0; |
|
33 | qreal angle = 0; | |
23 | // TODO: no need to create new slices in case size changed; we should re-use the existing ones |
|
34 | // TODO: no need to create new slices in case size changed; we should re-use the existing ones | |
24 |
foreach (qreal value, m_ |
|
35 | foreach (qreal value, m_data) { | |
25 | qreal span = value / total * fullPie; |
|
36 | qreal span = value / total * fullPie; | |
26 | PieSlice *slice = new PieSlice(randomColor(), angle, span, parentItem->boundingRect()); |
|
37 | PieSlice *slice = new PieSlice(randomColor(), angle, span, parentItem->boundingRect()); | |
27 | slice->setParentItem(parentItem); |
|
38 | slice->setParentItem(parentItem); | |
@@ -30,12 +41,7 QPieSeries::QPieSeries(QList<qreal> x, QGraphicsObject *parent) : | |||||
30 | } |
|
41 | } | |
31 |
|
42 | |||
32 | resizeSlices(m_chartSize); |
|
43 | resizeSlices(m_chartSize); | |
33 | } |
|
44 | return true; | |
34 |
|
||||
35 | QPieSeries::~QPieSeries() |
|
|||
36 | { |
|
|||
37 | while (m_slices.count()) |
|
|||
38 | delete m_slices.takeLast(); |
|
|||
39 | } |
|
45 | } | |
40 |
|
46 | |||
41 | void QPieSeries::chartSizeChanged(QRectF chartRect) |
|
47 | void QPieSeries::chartSizeChanged(QRectF chartRect) |
@@ -16,7 +16,7 class QTCOMMERCIALCHART_EXPORT QPieSeries : public QChartSeries | |||||
16 |
|
16 | |||
17 | public: |
|
17 | public: | |
18 | // TODO: use a generic data class instead of x and y |
|
18 | // TODO: use a generic data class instead of x and y | |
19 |
QPieSeries( |
|
19 | QPieSeries(QGraphicsObject *parent = 0); | |
20 | ~QPieSeries(); |
|
20 | ~QPieSeries(); | |
21 | QColor randomColor(); |
|
21 | QColor randomColor(); | |
22 | void setSizeFactor(qreal sizeFactor); |
|
22 | void setSizeFactor(qreal sizeFactor); | |
@@ -24,6 +24,7 public: | |||||
24 |
|
24 | |||
25 | public: // from QChartSeries |
|
25 | public: // from QChartSeries | |
26 | QChartSeriesType type() const { return QChartSeries::SeriesTypePie; } |
|
26 | QChartSeriesType type() const { return QChartSeries::SeriesTypePie; } | |
|
27 | bool setData(QList<qreal> data); | |||
27 |
|
28 | |||
28 | public Q_SLOTS: |
|
29 | public Q_SLOTS: | |
29 | void chartSizeChanged(QRectF rect); |
|
30 | void chartSizeChanged(QRectF rect); | |
@@ -33,7 +34,7 private: | |||||
33 | //Q_DECLARE_PRIVATE(QPieSeries) |
|
34 | //Q_DECLARE_PRIVATE(QPieSeries) | |
34 | Q_DISABLE_COPY(QPieSeries) |
|
35 | Q_DISABLE_COPY(QPieSeries) | |
35 | // TODO: move the followin to internal impl |
|
36 | // TODO: move the followin to internal impl | |
36 |
QList<qreal> m_ |
|
37 | QList<qreal> m_data; | |
37 | QList<PieSlice*> m_slices; |
|
38 | QList<PieSlice*> m_slices; | |
38 | QRectF m_chartSize; |
|
39 | QRectF m_chartSize; | |
39 | qreal m_sizeFactor; |
|
40 | qreal m_sizeFactor; |
@@ -9,14 +9,11 QTCOMMERCIALCHART_BEGIN_NAMESPACE | |||||
9 |
|
9 | |||
10 | //#define QSeriesData QList<qreal> |
|
10 | //#define QSeriesData QList<qreal> | |
11 |
|
11 | |||
12 |
QScatterSeriesPrivate::QScatterSeriesPrivate( |
|
12 | QScatterSeriesPrivate::QScatterSeriesPrivate(QGraphicsItem *parent) : | |
13 | QGraphicsItem(parent), |
|
13 | QGraphicsItem(parent), | |
14 | m_x(x), |
|
|||
15 | m_y(y), |
|
|||
16 | m_scalex(100), // TODO: let the use define the scale (or autoscaled) |
|
14 | m_scalex(100), // TODO: let the use define the scale (or autoscaled) | |
17 | m_scaley(100) |
|
15 | m_scaley(100) | |
18 | { |
|
16 | { | |
19 | resize(parent->boundingRect()); |
|
|||
20 | } |
|
17 | } | |
21 |
|
18 | |||
22 | void QScatterSeriesPrivate::resize(QRectF rect) |
|
19 | void QScatterSeriesPrivate::resize(QRectF rect) | |
@@ -58,12 +55,23 void QScatterSeriesPrivate::paint(QPainter *painter, const QStyleOptionGraphicsI | |||||
58 | } |
|
55 | } | |
59 | } |
|
56 | } | |
60 |
|
57 | |||
61 |
QScatterSeries::QScatterSeries( |
|
58 | QScatterSeries::QScatterSeries(QObject *parent) : | |
62 | QChartSeries(parent), |
|
59 | QChartSeries(parent), | |
63 |
d(new QScatterSeriesPrivate( |
|
60 | d(new QScatterSeriesPrivate(qobject_cast<QGraphicsItem *> (parent))) | |
64 | { |
|
61 | { | |
65 | } |
|
62 | } | |
66 |
|
63 | |||
|
64 | bool QScatterSeries::setData(QList<qreal> x, QList<qreal> y) | |||
|
65 | { | |||
|
66 | // TODO: validate data | |||
|
67 | d->m_x = x; | |||
|
68 | d->m_y = y; | |||
|
69 | QGraphicsItem *parentItem = qobject_cast<QGraphicsItem *>(parent()); | |||
|
70 | Q_ASSERT(parentItem); | |||
|
71 | d->resize(parentItem->boundingRect()); | |||
|
72 | return true; | |||
|
73 | } | |||
|
74 | ||||
67 | void QScatterSeries::chartSizeChanged(QRectF rect) |
|
75 | void QScatterSeries::chartSizeChanged(QRectF rect) | |
68 | { |
|
76 | { | |
69 | // Recalculate scatter data point locations on the scene |
|
77 | // Recalculate scatter data point locations on the scene |
@@ -12,11 +12,12 class QTCOMMERCIALCHART_EXPORT QScatterSeries : public QChartSeries | |||||
12 | Q_OBJECT |
|
12 | Q_OBJECT | |
13 | public: |
|
13 | public: | |
14 | //QScatterSeries(QSeriesData *data, QObject *chart); |
|
14 | //QScatterSeries(QSeriesData *data, QObject *chart); | |
15 |
QScatterSeries( |
|
15 | QScatterSeries(QObject *parent = 0); | |
16 | ~QScatterSeries(); |
|
16 | ~QScatterSeries(); | |
17 |
|
17 | |||
18 | public: // from QChartSeries |
|
18 | public: // from QChartSeries | |
19 | QChartSeriesType type() const { return QChartSeries::SeriesTypeScatter; } |
|
19 | QChartSeriesType type() const { return QChartSeries::SeriesTypeScatter; } | |
|
20 | bool setData(QList<qreal> x, QList<qreal> y); | |||
20 |
|
21 | |||
21 | public Q_SLOTS: |
|
22 | public Q_SLOTS: | |
22 | void chartSizeChanged(QRectF rect); |
|
23 | void chartSizeChanged(QRectF rect); |
@@ -12,7 +12,7 QTCOMMERCIALCHART_BEGIN_NAMESPACE | |||||
12 | class QScatterSeriesPrivate : public QGraphicsItem |
|
12 | class QScatterSeriesPrivate : public QGraphicsItem | |
13 | { |
|
13 | { | |
14 | public: |
|
14 | public: | |
15 |
QScatterSeriesPrivate( |
|
15 | QScatterSeriesPrivate(QGraphicsItem *parent); | |
16 |
|
16 | |||
17 | public: // from QGraphicsItem |
|
17 | public: // from QGraphicsItem | |
18 | void resize(QRectF rect); |
|
18 | void resize(QRectF rect); |
@@ -120,7 +120,6 void MainWidget::addSeries(QString series, QString data) | |||||
120 | { |
|
120 | { | |
121 | qDebug() << "addSeries: " << series << " data: " << data; |
|
121 | qDebug() << "addSeries: " << series << " data: " << data; | |
122 | m_defaultSeriesName = series; |
|
122 | m_defaultSeriesName = series; | |
123 | QChartSeries *newSeries = QXYChartSeries::create(); |
|
|||
124 |
|
123 | |||
125 | // TODO: a dedicated data class for storing x and y values |
|
124 | // TODO: a dedicated data class for storing x and y values | |
126 | QList<qreal> x; |
|
125 | QList<qreal> x; | |
@@ -131,40 +130,37 void MainWidget::addSeries(QString series, QString data) | |||||
131 | x.append(i); |
|
130 | x.append(i); | |
132 | y.append(i); |
|
131 | y.append(i); | |
133 | } |
|
132 | } | |
134 | for (int i = 0; i < 20; i++) |
|
|||
135 | ((QXYChartSeries *)newSeries)->add(i, i); |
|
|||
136 | } else if (data == "linear, 1M") { |
|
133 | } else if (data == "linear, 1M") { | |
137 | for (int i = 0; i < 10000; i++) { |
|
134 | for (int i = 0; i < 10000; i++) { | |
138 | x.append(i); |
|
135 | x.append(i); | |
139 | y.append(20); |
|
136 | y.append(20); | |
140 | } |
|
137 | } | |
141 | for (int i = 0; i < 1000000; i++) |
|
|||
142 | ((QXYChartSeries *)newSeries)->add(i, 10); |
|
|||
143 | } else if (data == "SIN") { |
|
138 | } else if (data == "SIN") { | |
144 | for (int i = 0; i < 100; i++) { |
|
139 | for (int i = 0; i < 100; i++) { | |
145 | x.append(i); |
|
140 | x.append(i); | |
146 | y.append(abs(sin(3.14159265358979 / 50 * i) * 100)); |
|
141 | y.append(abs(sin(3.14159265358979 / 50 * i) * 100)); | |
147 | } |
|
142 | } | |
148 | for (int i = 0; i < 100; i++) |
|
|||
149 | ((QXYChartSeries *)newSeries)->add(i, abs(sin(3.14159265358979 / 50 * i) * 100)); |
|
|||
150 | } else if (data == "SIN + random") { |
|
143 | } else if (data == "SIN + random") { | |
151 | for (qreal i = 0; i < 100; i += 0.1) { |
|
144 | for (qreal i = 0; i < 100; i += 0.1) { | |
152 | x.append(i + (rand() % 5)); |
|
145 | x.append(i + (rand() % 5)); | |
153 | y.append(abs(sin(3.14159265358979 / 50 * i) * 100) + (rand() % 5)); |
|
146 | y.append(abs(sin(3.14159265358979 / 50 * i) * 100) + (rand() % 5)); | |
154 | } |
|
147 | } | |
155 | for (qreal i = 0; i < 100; i += 0.1) |
|
|||
156 | ((QXYChartSeries *)newSeries)->add(i + (rand() % 5), abs(sin(3.14159265358979 / 50 * i) * 100) + (rand() % 5)); |
|
|||
157 | } else { |
|
148 | } else { | |
158 | // TODO: check if data has a valid file name |
|
149 | // TODO: check if data has a valid file name | |
|
150 | Q_ASSERT(false); | |||
159 | } |
|
151 | } | |
160 |
|
152 | |||
161 | // TODO: color of the series |
|
153 | // TODO: color of the series | |
|
154 | QChartSeries *newSeries = 0; | |||
162 | if (series == "Scatter") { |
|
155 | if (series == "Scatter") { | |
163 |
newSeries = m_chartWidget->createSeries( |
|
156 | newSeries = m_chartWidget->createSeries(QChartSeries::SeriesTypeScatter); | |
|
157 | Q_ASSERT(newSeries->setData(x, y)); | |||
164 | } else if (series == "Pie") { |
|
158 | } else if (series == "Pie") { | |
165 |
newSeries = m_chartWidget->createSeries( |
|
159 | newSeries = m_chartWidget->createSeries(QChartSeries::SeriesTypePie); | |
|
160 | Q_ASSERT(newSeries->setData(y)); | |||
166 | } else if (series == "Line") { |
|
161 | } else if (series == "Line") { | |
167 |
m_chartWidget-> |
|
162 | newSeries = m_chartWidget->createSeries(QChartSeries::SeriesTypePie); | |
|
163 | Q_ASSERT(newSeries->setData(x, y)); | |||
168 | } else { |
|
164 | } else { | |
169 | // TODO |
|
165 | // TODO | |
170 | } |
|
166 | } |
General Comments 0
You need to be logged in to leave comments.
Login now