##// END OF EJS Templates
Bar chart prototyping
sauimone -
r10:2932e9eb12b3
parent child
Show More
@@ -0,0 +1,30
1 #-------------------------------------------------
2 #
3 # Project created by QtCreator 2012-01-11T15:40:15
4 #
5 #-------------------------------------------------
6
7 QT += core gui
8
9 TARGET = QBarChart
10 TEMPLATE = app
11
12
13 SOURCES += main.cpp\
14 widget.cpp \
15 qbarchart.cpp \
16 qbarchartcontrol.cpp \
17 qbarchartmodel.cpp \
18 qbarchartbar.cpp \
19 qbarchartview.cpp \
20 qbarchartgrid.cpp \
21 qchartview.cpp
22
23 HEADERS += widget.h \
24 qbarchart.h \
25 qbarchartcontrol.h \
26 qbarchartmodel.h \
27 qbarchartbar.h \
28 qbarchartview.h \
29 qbarchartgrid.h \
30 qchartview.h
@@ -0,0 +1,39
1 #include <QtGui/QApplication>
2 #include <QGraphicsScene>
3 //QGraphicsScene *scene, QWidget *parent = 0#include <QGraphicsView>
4 //#include "widget.h"
5 //#include "qbarchart.h"
6 #include "qchartview.h"
7
8 int main(int argc, char *argv[])
9 {
10 QApplication a(argc, argv);
11
12 QGraphicsScene scene;
13 //QGraphicsView view(&scene);
14 QChartView view(&scene);
15 /*
16 QBarChart *barChart = new QBarChart();
17 barChart->setSize(640,480);
18 scene.addItem(barChart);
19
20 QList<int> data;
21 data << 1;
22 data << 1;
23 data << 2;
24 data << 3;
25 data << 5;
26 data << 8;
27 data << 13;
28 data << 21;
29 data << 42;
30 barChart->addSeries(data);
31 */
32 view.resize(640, 480);
33 QPalette p(view.palette());
34 p.setColor(QPalette::Base, QColor(0,0,0));
35 view.setPalette(p);
36 view.show();
37
38 return a.exec();
39 }
@@ -0,0 +1,92
1 #include "qbarchart.h"
2 #include "qbarchartbar.h"
3 #include <QDebug>
4
5 QBarChart::QBarChart(QGraphicsItem *parent) :
6 QGraphicsItem(parent)
7 ,mBarDefaultWidth( 1 )
8 {
9 }
10
11 void QBarChart::addSeries(QList<int> data)
12 {
13 mData.clear();
14 mData.append(data);
15 dataChanged();
16 }
17
18 void QBarChart::setSize( int h, int w )
19 {
20 mHeight = h;
21 mWidth = w;
22 dataChanged(); // TODO: separate data from grid
23 }
24
25 void QBarChart::setBarWidth( int w )
26 {
27 mBarDefaultWidth = w;
28 }
29
30 void QBarChart::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
31 {
32 qDebug() << "QBarChart::paint";
33 }
34
35 QRectF QBarChart::boundingRect() const
36 {
37 return QRectF(0,0,mWidth,mHeight); // TODO: size from layout
38 }
39
40
41 void QBarChart::dataChanged()
42 {
43 int count = mData.count();
44
45 if (count <= 0) {
46 // No items
47 return;
48 }
49
50 mMax = mData.at(0);
51 mMin = mData.at(0);
52
53 // Find out min and max values.
54 for (int i=0; i<count; i++) {
55 if (mData.at(i) > mMax) {
56 mMax = mData.at(i);
57 } else if (mData.at(i) < mMin) {
58 mMin = mData.at(i);
59 }
60 }
61
62 // Create items for data, delete old ones
63 foreach (QGraphicsItem* i, childItems()) {
64 delete i;
65 }
66
67 gridChanged();
68
69 int posStep = (mWidth / count) / 2; // TODO: Why I need magical 2 here to get correct step?
70
71 for (int i=0; i<count; i++) {
72 QBarChartBar *bar = new QBarChartBar(this);
73
74 // Scaling. TODO: better one.
75 int barHeight = mData.at(i) * mHeight / mMax;
76 bar->setSize(barHeight, mBarDefaultWidth * 3 * i); // TODO: widht settable by style or something.
77 bar->setColor(QColor(255 - i*25, i*10, i*15));
78 bar->setPos(i*posStep, 0);
79 childItems().append(bar);
80 }
81 }
82
83 void QBarChart::gridChanged()
84 {
85 // Scale of grid has changed
86 QBarChartGrid *grid = new QBarChartGrid(this);
87 grid->setSize(mHeight, mWidth);
88 grid->setLimits(mMin,mMax);
89 grid->setHorizontalLineCount(5);
90 childItems().append(grid);
91 }
92
@@ -0,0 +1,56
1 #ifndef QBARCHART_H
2 #define QBARCHART_H
3
4 #include <QGraphicsItem>
5
6 #include "qbarchartbar.h"
7 #include "qbarchartcontrol.h"
8 #include "qbarchartview.h"
9 #include "qbarchartgrid.h"
10
11 class QBarChart : public QGraphicsItem
12 {
13
14 public:
15 explicit QBarChart(QGraphicsItem *parent = 0);
16
17 // Data "api"
18 void addSeries(QList<int> data); // TODO: maybe some better structure
19
20 // Layout "api"
21 void setSize( int h, int w );
22 void setPos(qreal x, qreal y);
23 void setBarWidth( int w );
24
25 // From QGraphicsItem
26 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
27 QRectF boundingRect() const;
28
29 private:
30
31 void dataChanged();
32 void gridChanged();
33
34 private:
35
36 // Data
37 QList<int> mData; // use ints for now..
38 int mMin; // Min and max values of data. (updated when data is changed, used when drawing)
39 int mMax;
40
41 // View components
42 QList<QBarChartBar> mItems; // 2 first items in list are x and y axis, in that order
43 QBarChartGrid *mGrid;
44
45 int mHeight; // Layout spesific
46 int mWidth;
47 int mBarDefaultWidth;
48
49 // Controll stuff
50 QBarChartControl mBarControl;
51
52
53
54 };
55
56 #endif // QBARCHART_H
@@ -0,0 +1,39
1 #include "qbarchartbar.h"
2 #include <QDebug>
3 #include <Qpainter>
4
5 QBarChartBar::QBarChartBar(QGraphicsItem *parent)
6 : QGraphicsItem(parent)
7 {
8 }
9
10 void QBarChartBar::setSize( int h, int w )
11 {
12 mHeight = h;
13 mWidth = w;
14 }
15
16 void QBarChartBar::setColor( QColor col )
17 {
18 mColor = col;
19 }
20
21 void QBarChartBar::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
22 {
23 qDebug() << "QBarChartBar::paint" << scenePos();
24 // Set color for bar. TODO: gradients, textures etc
25 QPen pen = painter->pen();
26 pen.setColor( mColor );
27 pen.setWidth( mWidth );
28 painter->setPen(pen);
29
30 // Draw bar
31 painter->drawLine(scenePos().x(), scenePos().y() + parentItem()->boundingRect().height(),
32 scenePos().x(), scenePos().y() + parentItem()->boundingRect().height() - mHeight );
33 }
34
35 QRectF QBarChartBar::boundingRect() const
36 {
37 QRectF r(scenePos().x(), scenePos().y(), scenePos().x() + mWidth, scenePos().y() + mHeight );
38 return r;
39 }
@@ -0,0 +1,31
1 #ifndef QBARCHARTBAR_H
2 #define QBARCHARTBAR_H
3
4 #include <QGraphicsItem>
5
6 // Single bar item of chart
7
8 class QBarChartBar : public QGraphicsItem
9 {
10 public:
11 QBarChartBar(QGraphicsItem *parent=0);
12
13 // Layout Stuff
14 void setSize( int h, int w ); // Size of bar. in screen coordinates.
15 void setColor( QColor col ); // Color of bar
16
17 public:
18 // From QGraphicsItem
19
20 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
21 QRectF boundingRect() const;
22
23 private:
24
25 int mHeight;
26 int mWidth;
27 QPointF mPos;
28 QColor mColor;
29 };
30
31 #endif // QBARCHARTBAR_H
@@ -0,0 +1,6
1 #include "qbarchartcontrol.h"
2
3 QBarChartControl::QBarChartControl(QObject *parent) :
4 QObject(parent)
5 {
6 }
@@ -0,0 +1,18
1 #ifndef QBARCHARTCONTROL_H
2 #define QBARCHARTCONTROL_H
3
4 #include <QObject>
5
6 class QBarChartControl : public QObject
7 {
8 Q_OBJECT
9 public:
10 explicit QBarChartControl(QObject *parent = 0);
11
12 signals:
13
14 public slots:
15
16 };
17
18 #endif // QBARCHARTCONTROL_H
@@ -0,0 +1,52
1 #include "qbarchartgrid.h"
2 #include <QDebug>
3 #include <QPainter>
4
5 QBarChartGrid::QBarChartGrid(QGraphicsItem *parent) :
6 QGraphicsItem(parent)
7 {
8 }
9
10
11 void QBarChartGrid::setLimits( int min, int max )
12 {
13 mMin = min;
14 mMax = max;
15 }
16
17 void QBarChartGrid::setHorizontalLineCount(int count)
18 {
19 mHorizontalLineCount = count;
20 }
21
22 void QBarChartGrid::setSize( int h, int w )
23 {
24 mHeight = h;
25 mWidth = w;
26 }
27
28 void QBarChartGrid::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
29 {
30 qDebug() << "QBarChartGrid::paint w =" << mWidth << "h =" << mHeight;
31
32 QPen p = painter->pen();
33 p.setColor( QColor(0,255,0) );
34 p.setWidth( 1 );
35 painter->setPen(p);
36
37 // Draw horizontal lines
38 if ( mHorizontalLineCount >0 ) {
39 int step = mHeight / mHorizontalLineCount;
40 if (step > 0) {
41 for (int y=0; y<mHeight; y+=step) {
42 painter->drawLine(0,y,mWidth,y);
43 }
44 }
45 }
46 }
47
48 QRectF QBarChartGrid::boundingRect() const
49 {
50 QRectF r(scenePos().x(), scenePos().y(), scenePos().x() + mWidth, scenePos().y() + mHeight );
51 return r;
52 }
@@ -0,0 +1,33
1 #ifndef QBARCHARTGRID_H
2 #define QBARCHARTGRID_H
3
4 #include <QGraphicsItem>
5
6 class QBarChartGrid : public QGraphicsItem
7 {
8
9 public:
10 QBarChartGrid(QGraphicsItem *parent = 0);
11
12 // Data api:
13 void setLimits( int min, int max );
14 void setHorizontalLineCount( int count );
15
16 // Layout api:
17 void setSize( int h, int w );
18
19 // From QGraphicsItem
20 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
21 QRectF boundingRect() const;
22
23 private:
24
25 int mWidth;
26 int mHeight;
27
28 int mMin;
29 int mMax;
30 int mHorizontalLineCount; // Draw this many horizontal lines to grid
31 };
32
33 #endif // QBARCHARTGRID_H
@@ -0,0 +1,6
1 #include "qbarchartmodel.h"
2
3 QBarChartModel::QBarChartModel(QObject *parent) :
4 QAbstractItemModel(parent)
5 {
6 }
@@ -0,0 +1,18
1 #ifndef QBARCHARTMODEL_H
2 #define QBARCHARTMODEL_H
3
4 #include <QAbstractItemModel>
5
6 class QBarChartModel : public QAbstractItemModel
7 {
8 Q_OBJECT
9 public:
10 explicit QBarChartModel(QObject *parent = 0);
11
12 signals:
13
14 public slots:
15
16 };
17
18 #endif // QBARCHARTMODEL_H
@@ -0,0 +1,5
1 #include "qbarchartview.h"
2
3 QBarChartView::QBarChartView()
4 {
5 }
@@ -0,0 +1,10
1 #ifndef QBARCHARTVIEW_H
2 #define QBARCHARTVIEW_H
3
4 class QBarChartView
5 {
6 public:
7 QBarChartView();
8 };
9
10 #endif // QBARCHARTVIEW_H
@@ -0,0 +1,18
1 #include "qbarchartxaxis.h"
2
3 QBarChartXAxis::QBarChartXAxis(QGraphicsItem *parent) :
4 QGraphicsItem(parent)
5 {
6 }
7
8
9 void QBarChartXAxis::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
10 {
11
12 }
13
14 QRectF QBarChartXAxis::boundingRect() const
15 {
16 QRectF r(scenePos().x(), scenePos().y(), scenePos().x() + mWidth, scenePos().y() + mHeight );
17 return r;
18 }
@@ -0,0 +1,22
1 #ifndef QBARCHARTXAXIS_H
2 #define QBARCHARTXAXIS_H
3
4 #include <QGraphicsItem>
5
6 class QBarChartXAxis : public QGraphicsItem
7 {
8
9 public:
10 QBarChartXAxis(QGraphicsItem *parent = 0);
11
12 // From QGraphicsItem
13 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
14 QRectF boundingRect() const;
15
16 private:
17
18 int mWidth;
19 int mHeight;
20 };
21
22 #endif // QBARCHARTXAXIS_H
@@ -0,0 +1,30
1 #include "qchartview.h"
2 #include "qbarchart.h"
3 #include <qevent.h>
4
5 QChartView::QChartView(QGraphicsScene *scene, QWidget *parent ) :
6 QGraphicsView(scene,parent)
7 {
8 mChart = new QBarChart();
9 mChart->setSize(640,480);
10 scene->addItem(mChart);
11
12 QList<int> data;
13 data << 1;
14 data << 1;
15 data << 2;
16 data << 3;
17 data << 5;
18 data << 8;
19 data << 13;
20 data << 21;
21 data << 42;
22 mChart->addSeries(data);
23
24 }
25
26
27 void QChartView::resizeEvent(QResizeEvent *event)
28 {
29 mChart->setSize(event->size().height(), event->size().width());
30 }
@@ -0,0 +1,25
1 #ifndef QCHARTVIEW_H
2 #define QCHARTVIEW_H
3
4 #include <QGraphicsView>
5 #include "qbarchart.h"
6
7 class QChartView : public QGraphicsView
8 {
9 Q_OBJECT
10 public:
11 explicit QChartView(QGraphicsScene *scene, QWidget *parent = 0);
12
13 signals:
14
15 public slots:
16
17 protected:
18 void resizeEvent(QResizeEvent *event);
19
20 private:
21
22 QBarChart *mChart;
23 };
24
25 #endif // QCHARTVIEW_H
@@ -0,0 +1,11
1 #include "widget.h"
2
3 Widget::Widget(QWidget *parent)
4 : QWidget(parent)
5 {
6 }
7
8 Widget::~Widget()
9 {
10
11 }
@@ -0,0 +1,15
1 #ifndef WIDGET_H
2 #define WIDGET_H
3
4 #include <QtGui/QWidget>
5
6 class Widget : public QWidget
7 {
8 Q_OBJECT
9
10 public:
11 Widget(QWidget *parent = 0);
12 ~Widget();
13 };
14
15 #endif // WIDGET_H
General Comments 0
You need to be logged in to leave comments. Login now