##// END OF EJS Templates
Improved bar chart series
sauimone -
r71:1f789ed92d7b
parent child
Show More
@@ -1,3 +1,4
1 #include <QDebug>
1 #include "barchartseries.h"
2 #include "barchartseries.h"
2 QTCOMMERCIALCHART_BEGIN_NAMESPACE
3 QTCOMMERCIALCHART_BEGIN_NAMESPACE
3
4
@@ -6,23 +7,29 BarChartSeries::BarChartSeries(QObject *parent)
6 {
7 {
7 }
8 }
8
9
9 bool BarChartSeries::setData(QList<int> data)
10 bool BarChartSeries::setData(QAbstractItemModel* model)
10 {
11 {
11 mData = data;
12 mModel = model;
12 return true;
13 }
13 }
14
14
15
15 int BarChartSeries::min()
16 int BarChartSeries::min()
16 {
17 {
17 Q_ASSERT(mData.count() > 0);
18 Q_ASSERT(mModel->rowCount() > 0);
19 Q_ASSERT(mModel->columnCount() > 0);
18
20
19 // TODO: make min and max members and update them when data changes.
21 // TODO: make min and max members and update them when data changes.
20 // This is slower since they are checked every time, even if data is same since previous call.
22 // This is slower since they are checked every time, even if data is same since previous call.
21 int min = mData.at(0);
23 QModelIndex modelIndex = mModel->index(0,0);
24 int min = mModel->data(modelIndex).toInt();
22
25
23 for (int i=0; i <mData.count(); i++) {
26 for (int i=0; i <mModel->rowCount(); i++) {
24 if (mData.at(i) < min) {
27 for(int j=0; j<mModel->columnCount(); j++) {
25 min = mData.at(i);
28 modelIndex = mModel->index(i,j);
29 int temp = mModel->data(modelIndex).toInt();
30 if (temp < min) {
31 min = temp;
32 }
26 }
33 }
27 }
34 }
28 return min;
35 return min;
@@ -30,26 +37,54 int BarChartSeries::min()
30
37
31 int BarChartSeries::max()
38 int BarChartSeries::max()
32 {
39 {
33 Q_ASSERT(mData.count() > 0);
40 Q_ASSERT(mModel->rowCount() > 0);
41 Q_ASSERT(mModel->columnCount() > 0);
34
42
35 int max = mData.at(0);
43 // TODO: make min and max members and update them when data changes.
44 // This is slower since they are checked every time, even if data is same since previous call.
45 QModelIndex modelIndex = mModel->index(0,0);
46 int max = mModel->data(modelIndex).toInt();
36
47
37 for (int i=0; i <mData.count(); i++) {
48 for (int i=0; i <mModel->rowCount(); i++) {
38 if (mData.at(i) > max) {
49 for(int j=0; j<mModel->columnCount(); j++) {
39 max = mData.at(i);
50 modelIndex = mModel->index(i,j);
51 int temp = mModel->data(modelIndex).toInt();
52 if (temp > max) {
53 max = temp;
54 }
40 }
55 }
41 }
56 }
42 return max;
57 return max;
43 }
58 }
44
59
45 int BarChartSeries::count()
60
61 int BarChartSeries::countSeries()
62 {
63 return mModel->rowCount();
64 }
65
66 int BarChartSeries::countItemsInSeries()
46 {
67 {
47 return mData.count();
68 return mModel->columnCount();
48 }
69 }
49
70
50 int BarChartSeries::valueAt(int i)
71 int BarChartSeries::countTotalItems()
51 {
72 {
52 return mData.at(i);
73 return mModel->rowCount() * mModel->columnCount();
53 }
74 }
54
75
76 int BarChartSeries::valueAt(int series, int item)
77 {
78 QModelIndex index = mModel->index(series,item);
79 return mModel->data(index).toInt();
80 }
81
82
83 void BarChartSeries::chartSizeChanged(QRectF rect)
84 {
85 qDebug() << "barchart size changed:" << rect;
86 }
87
88 #include "moc_barchartseries.cpp"
89
55 QTCOMMERCIALCHART_END_NAMESPACE
90 QTCOMMERCIALCHART_END_NAMESPACE
@@ -2,6 +2,8
2 #define BARCHARTSERIES_H
2 #define BARCHARTSERIES_H
3
3
4 #include <QList>
4 #include <QList>
5 #include <QRectF>
6 #include <QAbstractItemModel>
5 #include "qchartseries.h"
7 #include "qchartseries.h"
6 #include "qchartglobal.h"
8 #include "qchartglobal.h"
7
9
@@ -10,28 +12,32 QTCOMMERCIALCHART_BEGIN_NAMESPACE
10 // Container for series
12 // Container for series
11 class QTCOMMERCIALCHART_EXPORT BarChartSeries : public QChartSeries
13 class QTCOMMERCIALCHART_EXPORT BarChartSeries : public QChartSeries
12 {
14 {
13 // TODO:
15 Q_OBJECT
14 // Q_OBJECT
15 public:
16 public:
16 BarChartSeries(QObject* parent=0);
17 BarChartSeries(QObject* parent=0);
17
18
18 // from QChartSeries
19 // from QChartSeries
19 virtual QChartSeriesType type() const { return QChartSeries::SeriesTypeBar; }
20 virtual QChartSeriesType type() const { return QChartSeries::SeriesTypeBar; }
20
21
21 virtual bool setData(QList<int> data);
22 // TODO: This as dataModel instead of n different setters. (data model itself can accept lists and whatnot)
22 virtual bool setData(QList<qreal> data) {return false;}
23 virtual bool setData(QAbstractItemModel* model);
23 virtual bool setData(QList<qreal> x, QList<qreal> y) {return false;}
24
25
24
26 // Methods to find out minimum and maximum values of data
25 // Methods to find out minimum and maximum values of data
27 int min();
26 int min();
28 int max();
27 int max();
29 int count();
28 int countSeries();
30 int valueAt(int i);
29 int countItemsInSeries(); // Count items in one series.
30 int countTotalItems();
31 int valueAt(int series, int item);
32
33 public Q_SLOTS:
34
35 void chartSizeChanged(QRectF rect);
31
36
32 private:
37 private:
33
38
34 QList<int> mData;
39 //QList<int> mData;
40 QAbstractItemModel* mModel;
35 };
41 };
36
42
37 QTCOMMERCIALCHART_END_NAMESPACE
43 QTCOMMERCIALCHART_END_NAMESPACE
@@ -4,11 +4,17
4
4
5 QTCOMMERCIALCHART_BEGIN_NAMESPACE
5 QTCOMMERCIALCHART_BEGIN_NAMESPACE
6
6
7 // TODO: singleton?
8 //BarGroup* BarGroup::mBarGroupInstance = NULL;
9
10 //BarGroup::BarGroup(QGraphicsItem *parent) :
11 // QGraphicsItem(parent)
12 // ,mSeries(series)
7 BarGroup::BarGroup(BarChartSeries& series, QGraphicsItem *parent) :
13 BarGroup::BarGroup(BarChartSeries& series, QGraphicsItem *parent) :
8 QGraphicsItem(parent)
14 QGraphicsItem(parent)
9 ,mSeries(series)
15 ,mSeries(series)
10 ,mLayoutSet(false)
16 ,mLayoutSet(false)
11 ,mLayoutDirty(true)
17 ,mLayoutDirty(true)
12 {
18 {
13 dataChanged();
19 dataChanged();
14 }
20 }
@@ -68,7 +74,8 void BarGroup::dataChanged()
68 }
74 }
69
75
70 // Create new graphic items for bars
76 // Create new graphic items for bars
71 for (int i=0; i<mSeries.count(); i++) {
77 int totalItems = mSeries.countTotalItems();
78 for (int i=0; i<totalItems; i++) {
72 Bar *bar = new Bar(this);
79 Bar *bar = new Bar(this);
73 childItems().append(bar);
80 childItems().append(bar);
74 }
81 }
@@ -80,7 +87,7 void BarGroup::layoutChanged()
80 {
87 {
81 // Scale bars to new layout
88 // Scale bars to new layout
82 // Layout for bars:
89 // Layout for bars:
83 int count = mSeries.count();
90 int count = mSeries.countSeries();
84 if (count <= 0) {
91 if (count <= 0) {
85 // Nothing to do.
92 // Nothing to do.
86 return;
93 return;
@@ -92,13 +99,17 void BarGroup::layoutChanged()
92 qDebug() << "startpos" << startPos;
99 qDebug() << "startpos" << startPos;
93
100
94 // Scaling. TODO: better one.
101 // Scaling. TODO: better one.
95 for (int i=0; i<count; i++) {
102 int itemIndex(0);
96 int barHeight = mSeries.valueAt(i) * mHeight / mMax;
103 for (int series = 0; series < count; series++) {
97 Bar* bar = reinterpret_cast<Bar*> (childItems().at(i));
104 for (int item=0; item < count; item++) {
98
105 int barHeight = mSeries.valueAt(series, item) * mHeight / mMax;
99 bar->resize(mBarDefaultWidth, barHeight); // TODO: width settable per bar
106 Bar* bar = reinterpret_cast<Bar*> (childItems().at(itemIndex));
100 bar->setColor(mColor);
107
101 bar->setPos(i*posStep+startPos, 0);
108 bar->resize(mBarDefaultWidth, barHeight); // TODO: width settable per bar
109 bar->setColor(mColor);
110 bar->setPos(itemIndex*posStep+startPos, 0);
111 itemIndex++;
112 }
102 }
113 }
103 mLayoutDirty = true;
114 mLayoutDirty = true;
104 }
115 }
@@ -1,7 +1,7
1 #ifndef QBARCHART_H
1 #ifndef QBARCHART_H
2 #define QBARCHART_H
2 #define QBARCHART_H
3
3
4 #include <QGraphicsItem>
4 #include <QGraphicsObject>
5
5
6 #include "bar.h"
6 #include "bar.h"
7 //#include "qbarchartview.h"
7 //#include "qbarchartview.h"
@@ -10,11 +10,25
10 QTCOMMERCIALCHART_BEGIN_NAMESPACE
10 QTCOMMERCIALCHART_BEGIN_NAMESPACE
11
11
12 // TODO: Better name for this? The function of this class is to know where each bar in series is laid out.
12 // TODO: Better name for this? The function of this class is to know where each bar in series is laid out.
13 // Class has knowledge of single series of data (owns vs reference?)
13 //class BarGroup : public QGraphicsItemGroup
14
14 class BarGroup : public QGraphicsItem
15 class BarGroup : public QGraphicsItem
15 {
16 {
17 /* // TODO: implement as singleton?
18 private:
19 static BarGroup* mBarGroupInstance;
16
20
17 public:
21 public:
22 static BarGroup* instance()
23 {
24 if (mBarGroupInstance == NULL) {
25 mBarGroupInstance = new BarGroup();
26 }
27 return mBarGroupInstance;
28 }
29 private:
30 */
31 public:
18 explicit BarGroup(BarChartSeries& series, QGraphicsItem *parent = 0);
32 explicit BarGroup(BarChartSeries& series, QGraphicsItem *parent = 0);
19
33
20 // Layout "api"
34 // Layout "api"
@@ -84,11 +84,9 void QChart::addSeries(QChartSeries* series)
84
84
85 qDebug() << "barSeries added";
85 qDebug() << "barSeries added";
86 BarChartSeries* barSeries = static_cast<BarChartSeries*>(series);
86 BarChartSeries* barSeries = static_cast<BarChartSeries*>(series);
87 connect(this, SIGNAL(sizeChanged(QRectF)),
88 barSeries, SLOT(chartSizeChanged(QRectF)));
87
89
88 // Who owns the series?
89 BarGroup* group = new BarGroup(*barSeries, this);
90 scene()->addItem(group);
91 m_BarGroupItems.append(group); // If we need to access group later
92 break;
90 break;
93 }
91 }
94 case QChartSeries::SeriesTypeScatter: {
92 case QChartSeries::SeriesTypeScatter: {
@@ -78,7 +78,6 private:
78 int m_plotDataIndex;
78 int m_plotDataIndex;
79 int m_marginSize;
79 int m_marginSize;
80 QList<QColor> m_themeColors;
80 QList<QColor> m_themeColors;
81 QList<BarGroup*> m_BarGroupItems;
82 };
81 };
83
82
84 QTCOMMERCIALCHART_END_NAMESPACE
83 QTCOMMERCIALCHART_END_NAMESPACE
@@ -8,6 +8,7 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8
8
9 QChartSeries* QChartSeries::create(QChartSeriesType type, QObject* parent)
9 QChartSeries* QChartSeries::create(QChartSeriesType type, QObject* parent)
10 {
10 {
11 qDebug() << "QChartSeries::create";
11 // TODO: Other types
12 // TODO: Other types
12 switch (type) {
13 switch (type) {
13 case QChartSeries::SeriesTypeLine: {
14 case QChartSeries::SeriesTypeLine: {
@@ -29,4 +30,5 QChartSeries* QChartSeries::create(QChartSeriesType type, QObject* parent)
29 }
30 }
30 }
31 }
31
32
33 #include "moc_qchartseries.cpp"
32 QTCOMMERCIALCHART_END_NAMESPACE
34 QTCOMMERCIALCHART_END_NAMESPACE
@@ -3,13 +3,13
3
3
4 #include "qchartglobal.h"
4 #include "qchartglobal.h"
5 #include <QObject>
5 #include <QObject>
6 #include <QAbstractItemModel>
6
7
7 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8 QTCOMMERCIALCHART_BEGIN_NAMESPACE
8
9
9 class QTCOMMERCIALCHART_EXPORT QChartSeries : public QObject
10 class QTCOMMERCIALCHART_EXPORT QChartSeries : public QObject
10 {
11 {
11 //TODO:
12 Q_OBJECT
12 //Q_OBJECT
13 public:
13 public:
14 enum QChartSeriesType {
14 enum QChartSeriesType {
15 SeriesTypeLine = 0,
15 SeriesTypeLine = 0,
@@ -35,6 +35,10 public:
35 virtual bool setData(QList<int> data) { return false; }
35 virtual bool setData(QList<int> data) { return false; }
36 virtual bool setData(QList<qreal> data) { return false; }
36 virtual bool setData(QList<qreal> data) { return false; }
37 virtual bool setData(QList<qreal> x, QList<qreal> y){ return false; }
37 virtual bool setData(QList<qreal> x, QList<qreal> y){ return false; }
38
39 // Prototype for data model. TODO: remove the other setData methods and use something like this for now?
40 virtual bool setData(QAbstractItemModel* model) { return false; }
41
38 };
42 };
39
43
40 QTCOMMERCIALCHART_END_NAMESPACE
44 QTCOMMERCIALCHART_END_NAMESPACE
@@ -303,7 +303,7 void MainWidget::yMaxChanged(int value)
303 void MainWidget::changeChartTheme(int themeIndex)
303 void MainWidget::changeChartTheme(int themeIndex)
304 {
304 {
305 qDebug() << "changeChartTheme: " << themeIndex;
305 qDebug() << "changeChartTheme: " << themeIndex;
306 m_chartWidget->setTheme((QChart::ChartTheme) themeIndex);
306 // m_chartWidget->setTheme((QChart::ChartTheme) themeIndex);
307 }
307 }
308
308
309 void MainWidget::setPieSizeFactor(double size)
309 void MainWidget::setPieSizeFactor(double size)
General Comments 0
You need to be logged in to leave comments. Login now