@@ -0,0 +1,22 | |||
|
1 | #include "chartview.h" | |
|
2 | ||
|
3 | ChartView::ChartView(QChartWidget* chartWidget,QWidget* parent):QGraphicsView(parent), | |
|
4 | m_chartWidget(chartWidget), | |
|
5 | m_scene(new QGraphicsScene(parent)) | |
|
6 | { | |
|
7 | setScene(m_scene); | |
|
8 | m_scene->addItem(chartWidget); | |
|
9 | setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); | |
|
10 | setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); | |
|
11 | // get rid off ugly default 1 pixel border | |
|
12 | setStyleSheet( "QGraphicsView { border-style: none; }" ); | |
|
13 | } | |
|
14 | ||
|
15 | ChartView::~ChartView() { | |
|
16 | // TODO Auto-generated destructor stub | |
|
17 | } | |
|
18 | ||
|
19 | void ChartView::resizeEvent(QResizeEvent *event){ | |
|
20 | m_chartWidget->resize(size()); | |
|
21 | QGraphicsView::resizeEvent(event); | |
|
22 | } |
@@ -0,0 +1,22 | |||
|
1 | #ifndef CHARTVIEW_H_ | |
|
2 | #define CHARTVIEW_H_ | |
|
3 | #include <qchartwidget.h> | |
|
4 | #include <QGraphicsView> | |
|
5 | ||
|
6 | class QGraphicsScene; | |
|
7 | ||
|
8 | QCHART_USE_NAMESPACE | |
|
9 | ||
|
10 | class ChartView: public QGraphicsView | |
|
11 | { | |
|
12 | public: | |
|
13 | ChartView (QChartWidget* chartWidget,QWidget* parent=0); | |
|
14 | virtual ~ChartView(); | |
|
15 | void resizeEvent(QResizeEvent *event); | |
|
16 | ||
|
17 | private: | |
|
18 | QChartWidget* m_chartWidget; | |
|
19 | QGraphicsScene* m_scene; | |
|
20 | }; | |
|
21 | ||
|
22 | #endif /* CHARTVIEW_H_ */ |
@@ -0,0 +1,9 | |||
|
1 | TARGET = lineChart | |
|
2 | TEMPLATE = app | |
|
3 | ||
|
4 | QT += core gui | |
|
5 | ||
|
6 | CONFIG += charts | |
|
7 | ||
|
8 | HEADERS += chartview.h | |
|
9 | SOURCES += main.cpp chartview.cpp |
@@ -0,0 +1,57 | |||
|
1 | #include <QApplication> | |
|
2 | #include <QMainWindow> | |
|
3 | #include <qchartwidget.h> | |
|
4 | #include <qchart.h> | |
|
5 | #include "chartview.h" | |
|
6 | #include <cmath> | |
|
7 | ||
|
8 | QCHART_USE_NAMESPACE | |
|
9 | ||
|
10 | #define PI 3.14159265358979 | |
|
11 | ||
|
12 | int main(int argc, char *argv[]) | |
|
13 | { | |
|
14 | QApplication a(argc, argv); | |
|
15 | ||
|
16 | QMainWindow window; | |
|
17 | ||
|
18 | QXYSeries* series0 = new QXYSeries(); | |
|
19 | series0->setColor(Qt::blue); | |
|
20 | QXYSeries* series1 = new QXYSeries(); | |
|
21 | series1->setColor(Qt::red); | |
|
22 | QXYSeries* series2 = new QXYSeries(); | |
|
23 | series2->setColor(Qt::gray); | |
|
24 | QXYSeries* series3 = new QXYSeries(); | |
|
25 | series3->setColor(Qt::green); | |
|
26 | ||
|
27 | int numPoints = 100; | |
|
28 | ||
|
29 | for (int x = 0; x < numPoints; ++x) { | |
|
30 | series0->add(x,0); | |
|
31 | series1->add(x, uint(sin(PI/25*x)*100) % 100); | |
|
32 | series2->add(x, uint(cos(PI/25*x)*100) % 100); | |
|
33 | series3->add(x,100); | |
|
34 | } | |
|
35 | ||
|
36 | QList<QXYSeries*> dataset; | |
|
37 | ||
|
38 | qDebug()<<"Series 1:" << *series1; | |
|
39 | qDebug()<<"Series 2:" << *series2; | |
|
40 | ||
|
41 | dataset << series0; | |
|
42 | dataset << series1; | |
|
43 | dataset << series2; | |
|
44 | dataset << series3; | |
|
45 | ||
|
46 | QChart* chart = QChart::createXYLineChart(dataset); | |
|
47 | chart->setMargin(50); | |
|
48 | QChartWidget* chartWidget = new QChartWidget(); | |
|
49 | chartWidget->addChart(chart); | |
|
50 | ||
|
51 | ChartView* view = new ChartView(chartWidget,&window); | |
|
52 | window.setCentralWidget(view); | |
|
53 | window.resize(400, 300); | |
|
54 | window.show(); | |
|
55 | ||
|
56 | return a.exec(); | |
|
57 | } |
@@ -0,0 +1,50 | |||
|
1 | #include "axis_p.h" | |
|
2 | #include <QPainter> | |
|
3 | #include <QDebug> | |
|
4 | ||
|
5 | QCHART_BEGIN_NAMESPACE | |
|
6 | ||
|
7 | Axis::Axis(QGraphicsItem* parent): QGraphicsItem(parent) | |
|
8 | { | |
|
9 | } | |
|
10 | ||
|
11 | Axis::~Axis() | |
|
12 | { | |
|
13 | } | |
|
14 | ||
|
15 | void Axis::setLength(int length) | |
|
16 | { | |
|
17 | QPainterPath path; | |
|
18 | path.moveTo(QPointF(0,0)); | |
|
19 | path.lineTo(length,0); | |
|
20 | // path.lineTo(length-4,0); | |
|
21 | // path.lineTo(length,3); | |
|
22 | // path.lineTo(length-4,6); | |
|
23 | // path.lineTo(length-4,4); | |
|
24 | // path.lineTo(0,4); | |
|
25 | // path.lineTo(0,2); | |
|
26 | m_path=path; | |
|
27 | update(); | |
|
28 | } | |
|
29 | ||
|
30 | QRectF Axis::boundingRect() const | |
|
31 | { | |
|
32 | return m_path.boundingRect(); | |
|
33 | } | |
|
34 | ||
|
35 | QPainterPath Axis::shape() const | |
|
36 | { | |
|
37 | return m_path; | |
|
38 | } | |
|
39 | ||
|
40 | void Axis::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget) | |
|
41 | { | |
|
42 | painter->save(); | |
|
43 | QPen pen(Qt::black); | |
|
44 | //pen.setWidth(10); | |
|
45 | painter->setPen(pen); | |
|
46 | painter->drawPath(m_path); | |
|
47 | painter->restore(); | |
|
48 | } | |
|
49 | ||
|
50 | QCHART_END_NAMESPACE |
@@ -0,0 +1,29 | |||
|
1 | #ifndef AXIS_H_ | |
|
2 | #define AXIS_H_ | |
|
3 | ||
|
4 | #include <qchartconfig.h> | |
|
5 | #include <QGraphicsItem> | |
|
6 | ||
|
7 | QCHART_BEGIN_NAMESPACE | |
|
8 | ||
|
9 | class Axis: public QGraphicsItem | |
|
10 | { | |
|
11 | public: | |
|
12 | Axis(QGraphicsItem* parent = 0); | |
|
13 | virtual ~Axis(); | |
|
14 | ||
|
15 | //from QGraphicsItem | |
|
16 | virtual QPainterPath shape() const; | |
|
17 | virtual QRectF boundingRect() const; | |
|
18 | virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); | |
|
19 | ||
|
20 | void setLength(int length); | |
|
21 | void setWidth(int width); | |
|
22 | ||
|
23 | private: | |
|
24 | QPainterPath m_path; | |
|
25 | }; | |
|
26 | ||
|
27 | QCHART_END_NAMESPACE | |
|
28 | ||
|
29 | #endif /* AXIS_H_ */ |
@@ -0,0 +1,30 | |||
|
1 | #include "qchart.h" | |
|
2 | #include "xylinechart_p.h" | |
|
3 | ||
|
4 | QCHART_BEGIN_NAMESPACE | |
|
5 | ||
|
6 | QChart::QChart(QGraphicsItem* parent):QGraphicsItem(parent), | |
|
7 | m_marginSize(0) | |
|
8 | { | |
|
9 | // setFlags(QGraphicsItem::ItemClipsChildrenToShape); | |
|
10 | } | |
|
11 | ||
|
12 | QChart::~QChart(){} | |
|
13 | ||
|
14 | ||
|
15 | QChart* QChart::createXYLineChart(const QList<QXYSeries*>& dataset) | |
|
16 | { | |
|
17 | ||
|
18 | XYLineChart* chart = new XYLineChart(); | |
|
19 | foreach (const QXYSeries* series,dataset) { | |
|
20 | chart->addXYSeries(series); | |
|
21 | } | |
|
22 | return chart; | |
|
23 | } | |
|
24 | ||
|
25 | void QChart::setMargin(int margin) | |
|
26 | { | |
|
27 | m_marginSize=margin; | |
|
28 | } | |
|
29 | ||
|
30 | QCHART_END_NAMESPACE |
@@ -0,0 +1,31 | |||
|
1 | #ifndef CHART_H | |
|
2 | #define CHART_H | |
|
3 | ||
|
4 | #include <qchartconfig.h> | |
|
5 | #include <qxyseries.h> | |
|
6 | #include <QGraphicsItem> | |
|
7 | ||
|
8 | QCHART_BEGIN_NAMESPACE | |
|
9 | ||
|
10 | class QCHART_EXPORT QChart : public QGraphicsItem | |
|
11 | { | |
|
12 | ||
|
13 | protected: | |
|
14 | QChart(QGraphicsItem* parent =0); | |
|
15 | ||
|
16 | public: | |
|
17 | virtual ~QChart(); | |
|
18 | ||
|
19 | static QChart* createXYLineChart(const QList<QXYSeries*>& dataset); | |
|
20 | ||
|
21 | virtual void setSize(const QSizeF& rect)=0; | |
|
22 | void setMargin(int margin); | |
|
23 | int margin() const { return m_marginSize;} | |
|
24 | ||
|
25 | private: | |
|
26 | int m_marginSize; | |
|
27 | }; | |
|
28 | ||
|
29 | QCHART_END_NAMESPACE | |
|
30 | ||
|
31 | #endif |
@@ -0,0 +1,41 | |||
|
1 | #include "qchartwidget.h" | |
|
2 | #include "qchart.h" | |
|
3 | ||
|
4 | QCHART_BEGIN_NAMESPACE | |
|
5 | ||
|
6 | ||
|
7 | class QChartWidgetPrivate | |
|
8 | { | |
|
9 | public: | |
|
10 | QChart* chart; | |
|
11 | //Q_DECLARE_PUBLIC(ChartWidget) | |
|
12 | QChartWidgetPrivate() {} | |
|
13 | }; | |
|
14 | ||
|
15 | //////////////////////////////////////////////////////////////////////////// | |
|
16 | ||
|
17 | QChartWidget::QChartWidget(QGraphicsItem *parent,Qt::WindowFlags wFlags) | |
|
18 | : QGraphicsWidget(parent,wFlags), | |
|
19 | d_ptr(new QChartWidgetPrivate()) | |
|
20 | { | |
|
21 | } | |
|
22 | ||
|
23 | QChartWidget::~QChartWidget() | |
|
24 | { | |
|
25 | delete d_ptr; | |
|
26 | } | |
|
27 | ||
|
28 | ||
|
29 | void QChartWidget::addChart(QChart *chart) | |
|
30 | { | |
|
31 | d_ptr->chart=chart; | |
|
32 | chart->setParentItem(this); | |
|
33 | } | |
|
34 | ||
|
35 | void QChartWidget::setGeometry(const QRectF & rect) | |
|
36 | { | |
|
37 | d_ptr->chart->setSize(rect.size()); | |
|
38 | QGraphicsWidget::setGeometry(rect); | |
|
39 | } | |
|
40 | ||
|
41 | QCHART_END_NAMESPACE |
@@ -0,0 +1,34 | |||
|
1 | #ifndef QCHARTWIDGET_H | |
|
2 | #define QCHARTWIDGET_H | |
|
3 | ||
|
4 | #include <qchartconfig.h> | |
|
5 | #include <QGraphicsWidget> | |
|
6 | ||
|
7 | class QGraphicsItem; | |
|
8 | ||
|
9 | QCHART_BEGIN_NAMESPACE | |
|
10 | ||
|
11 | class QChart; | |
|
12 | class QChartWidgetPrivate; | |
|
13 | ||
|
14 | class QCHART_EXPORT QChartWidget : public QGraphicsWidget | |
|
15 | { | |
|
16 | ||
|
17 | public: | |
|
18 | explicit QChartWidget(QGraphicsItem *parent = 0,Qt::WindowFlags wFlags = 0); | |
|
19 | ~QChartWidget(); | |
|
20 | ||
|
21 | QChart* chart() const; | |
|
22 | void addChart(QChart* chart); | |
|
23 | ||
|
24 | virtual void setGeometry(const QRectF & rect); | |
|
25 | ||
|
26 | private: | |
|
27 | Q_DISABLE_COPY(QChartWidget) | |
|
28 | Q_DECLARE_PRIVATE(QChartWidget) | |
|
29 | QChartWidgetPrivate * const d_ptr; | |
|
30 | }; | |
|
31 | ||
|
32 | QCHART_END_NAMESPACE | |
|
33 | ||
|
34 | #endif |
@@ -0,0 +1,59 | |||
|
1 | #include "qxyseries.h" | |
|
2 | ||
|
3 | QXYSeries::QXYSeries(): | |
|
4 | m_color(Qt::black) | |
|
5 | { | |
|
6 | } | |
|
7 | ||
|
8 | QXYSeries::~QXYSeries() | |
|
9 | { | |
|
10 | } | |
|
11 | ||
|
12 | ||
|
13 | void QXYSeries::setColor(const QColor& color) | |
|
14 | { | |
|
15 | m_color = color; | |
|
16 | } | |
|
17 | ||
|
18 | ||
|
19 | void QXYSeries::add(qreal x,qreal y) | |
|
20 | { | |
|
21 | m_x<<x; | |
|
22 | m_y<<y; | |
|
23 | } | |
|
24 | ||
|
25 | void QXYSeries::clear() | |
|
26 | { | |
|
27 | m_x.clear(); | |
|
28 | m_y.clear(); | |
|
29 | } | |
|
30 | ||
|
31 | qreal QXYSeries::x(int pos) const | |
|
32 | { | |
|
33 | return m_x.at(pos); | |
|
34 | } | |
|
35 | ||
|
36 | qreal QXYSeries::y(int pos) const | |
|
37 | { | |
|
38 | return m_y.at(pos); | |
|
39 | } | |
|
40 | ||
|
41 | int QXYSeries::count() const | |
|
42 | { | |
|
43 | Q_ASSERT(m_x.size() == m_y.size()); | |
|
44 | ||
|
45 | return m_x.size(); | |
|
46 | ||
|
47 | } | |
|
48 | ||
|
49 | QDebug operator<< (QDebug debug, const QXYSeries series) | |
|
50 | { | |
|
51 | Q_ASSERT(series.m_x.size() == series.m_y.size()); | |
|
52 | ||
|
53 | int size = series.m_x.size(); | |
|
54 | ||
|
55 | for (int i=0;i<size;i++) { | |
|
56 | debug.nospace() << "(" << series.m_x.at(i) << ','<< series.m_y.at(i) << ") "; | |
|
57 | } | |
|
58 | return debug.space(); | |
|
59 | } |
@@ -0,0 +1,28 | |||
|
1 | #ifndef QXYSERIES_H_ | |
|
2 | #define QXYSERIES_H_ | |
|
3 | #include <QDebug> | |
|
4 | #include <QColor> | |
|
5 | ||
|
6 | ||
|
7 | class QXYSeries | |
|
8 | { | |
|
9 | public: | |
|
10 | QXYSeries(); | |
|
11 | virtual ~QXYSeries(); | |
|
12 | void add(qreal x, qreal y); | |
|
13 | void clear(); | |
|
14 | void setColor(const QColor& color); | |
|
15 | const QColor& color() const { return m_color;} | |
|
16 | int count() const; | |
|
17 | qreal x(int pos) const; | |
|
18 | qreal y(int pos) const; | |
|
19 | friend QDebug operator<< (QDebug d, const QXYSeries series); | |
|
20 | ||
|
21 | private: | |
|
22 | QColor m_color; | |
|
23 | QList<qreal> m_x; | |
|
24 | QList<qreal> m_y; | |
|
25 | ||
|
26 | }; | |
|
27 | ||
|
28 | #endif |
@@ -0,0 +1,67 | |||
|
1 | #include "xygrid_p.h" | |
|
2 | #include "xylinechart_p.h" | |
|
3 | #include <QPainter> | |
|
4 | ||
|
5 | QCHART_BEGIN_NAMESPACE | |
|
6 | ||
|
7 | XYGrid::XYGrid(const XYLineChart* const chart, QGraphicsItem* parent):QGraphicsItem(parent), | |
|
8 | m_chart(chart) | |
|
9 | { | |
|
10 | } | |
|
11 | ||
|
12 | XYGrid::~XYGrid() | |
|
13 | { | |
|
14 | // TODO Auto-generated destructor stub | |
|
15 | } | |
|
16 | ||
|
17 | void XYGrid::setSize(const QSizeF& size) { | |
|
18 | m_rect.setSize(size.toSize()); | |
|
19 | } | |
|
20 | ||
|
21 | ||
|
22 | QRectF XYGrid::boundingRect() const | |
|
23 | { | |
|
24 | return m_rect; | |
|
25 | } | |
|
26 | ||
|
27 | void XYGrid::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget) | |
|
28 | { | |
|
29 | if (!m_rect.isValid()) | |
|
30 | return; | |
|
31 | ||
|
32 | const XYPlotData& plotData = m_chart->xyPlotData(); | |
|
33 | ||
|
34 | const qreal deltaX = (m_rect.width() -1) / plotData.ticksX(); | |
|
35 | const qreal deltaY = (m_rect.height() - 1) / plotData.ticksY(); | |
|
36 | ||
|
37 | for (int i = 0; i <= plotData.ticksX(); ++i) { | |
|
38 | ||
|
39 | int x = i * deltaX + m_rect.left(); | |
|
40 | qreal label = plotData.m_minX + (i * plotData.spanX() | |
|
41 | / plotData.ticksX()); | |
|
42 | painter->drawLine(x, m_rect.top()+1, x, m_rect.bottom()); | |
|
43 | //painter->drawLine(x, m_rect.bottom(), x, m_rect.bottom() + 5); | |
|
44 | ||
|
45 | painter->drawText(x - 50, m_rect.bottom() + 5, 100, 20, | |
|
46 | Qt::AlignHCenter | Qt::AlignTop, | |
|
47 | QString::number(label)); | |
|
48 | } | |
|
49 | ||
|
50 | for (int j = 0; j <= plotData.ticksY(); ++j) { | |
|
51 | ||
|
52 | int y = j * -deltaY + m_rect.bottom(); | |
|
53 | qreal label = plotData.m_minY + (j * plotData.spanY() | |
|
54 | / plotData.ticksY()); | |
|
55 | ||
|
56 | painter->drawLine(m_rect.left(), y, m_rect.right()-1, y); | |
|
57 | //painter->drawLine(m_rect.left() - 5, y, m_rect.left(), y); | |
|
58 | //TODO : margin = 50 ; | |
|
59 | painter->drawText(m_rect.left() - 50, y - 10, 50 - 5, 20, | |
|
60 | Qt::AlignRight | Qt::AlignVCenter, | |
|
61 | QString::number(label)); | |
|
62 | } | |
|
63 | ||
|
64 | //painter->drawRect(m_rect.adjusted(0, 0, -1, -1)); | |
|
65 | } | |
|
66 | ||
|
67 | QCHART_END_NAMESPACE |
@@ -0,0 +1,31 | |||
|
1 | #ifndef XYGRID_H_ | |
|
2 | #define XYGRID_H_ | |
|
3 | ||
|
4 | #include <qchartconfig.h> | |
|
5 | #include <QGraphicsItem> | |
|
6 | ||
|
7 | QCHART_BEGIN_NAMESPACE | |
|
8 | ||
|
9 | class XYPlotData; | |
|
10 | class XYLineChart; | |
|
11 | ||
|
12 | class XYGrid : public QGraphicsItem | |
|
13 | { | |
|
14 | public: | |
|
15 | XYGrid(const XYLineChart* const chart,QGraphicsItem* parent = 0); | |
|
16 | virtual ~XYGrid(); | |
|
17 | ||
|
18 | //from QGraphicsItem | |
|
19 | virtual QRectF boundingRect() const; | |
|
20 | virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); | |
|
21 | ||
|
22 | void setSize(const QSizeF& rect); | |
|
23 | ||
|
24 | private: | |
|
25 | QRectF m_rect; | |
|
26 | const XYLineChart* const m_chart; | |
|
27 | }; | |
|
28 | ||
|
29 | QCHART_END_NAMESPACE | |
|
30 | ||
|
31 | #endif /* XYGRID_H_ */ |
@@ -0,0 +1,86 | |||
|
1 | #include "xylinechart_p.h" | |
|
2 | #include "axis_p.h" | |
|
3 | #include "xygrid_p.h" | |
|
4 | #include <QPainter> | |
|
5 | #include <QStyleOptionGraphicsItem> | |
|
6 | #include <QDebug> | |
|
7 | ||
|
8 | QCHART_BEGIN_NAMESPACE | |
|
9 | ||
|
10 | XYLineChart::XYLineChart(QGraphicsItem *parent):QChart(parent), | |
|
11 | m_axisX(new Axis(this)), | |
|
12 | m_axisY(new Axis(this)), | |
|
13 | m_grid(new XYGrid(this,this)), | |
|
14 | m_plotDataIndex(0) | |
|
15 | { | |
|
16 | // set axis | |
|
17 | m_axisY->rotate(90); | |
|
18 | ||
|
19 | XYPlotData data; | |
|
20 | data.m_minX = 0.0; | |
|
21 | data.m_maxX = 100.0; | |
|
22 | data.m_minY = 0.0; | |
|
23 | data.m_maxY = 100.0; | |
|
24 | data.m_ticksX=4; | |
|
25 | data.m_ticksY=4; | |
|
26 | ||
|
27 | m_plotDataList.clear(); | |
|
28 | m_plotDataList << data; | |
|
29 | ||
|
30 | } | |
|
31 | ||
|
32 | void XYLineChart::setSize(const QSizeF& size) { | |
|
33 | ||
|
34 | m_rect = QRect(QPoint(0,0),size.toSize()); | |
|
35 | m_rect.adjust(margin(),margin(),-margin(),-margin()); | |
|
36 | updateGeometry(); | |
|
37 | } | |
|
38 | ||
|
39 | void XYLineChart::addXYSeries(const QXYSeries* series) | |
|
40 | { | |
|
41 | m_series<<series; | |
|
42 | } | |
|
43 | ||
|
44 | QRectF XYLineChart::boundingRect() const | |
|
45 | { | |
|
46 | return m_rect; | |
|
47 | } | |
|
48 | ||
|
49 | void XYLineChart::updateGeometry() | |
|
50 | { | |
|
51 | //m_axisX->setPos(m_rect.bottomLeft()); | |
|
52 | //m_axisX->setLength(m_rect.width()); | |
|
53 | //m_axisY->setLength(m_rect.height()); | |
|
54 | m_grid->setPos(m_rect.topLeft()); | |
|
55 | m_grid->setSize(m_rect.size()); | |
|
56 | update(); | |
|
57 | } | |
|
58 | ||
|
59 | void XYLineChart::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget) | |
|
60 | { | |
|
61 | const XYPlotData& xyplotData = xyPlotData(); | |
|
62 | ||
|
63 | if (!m_rect.isValid()) | |
|
64 | return; | |
|
65 | ||
|
66 | painter->setClipRect(m_rect.adjusted(+1, +1, -1, -1)); | |
|
67 | ||
|
68 | const qreal deltaX = (m_rect.width()-1)/xyplotData.spanX(); | |
|
69 | const qreal deltaY = (m_rect.height()-1)/xyplotData.spanY(); | |
|
70 | ||
|
71 | foreach (const QXYSeries* series, m_series) { | |
|
72 | ||
|
73 | QPolygonF polyline(series->count()); | |
|
74 | ||
|
75 | for (int j = 0; j < series->count(); ++j) { | |
|
76 | qreal dx = series->x(j) - xyplotData.m_minX; | |
|
77 | qreal dy = series->y(j) - xyplotData.m_minY; | |
|
78 | qreal x = (dx * deltaX) + m_rect.left(); | |
|
79 | qreal y = - (dy * deltaY) + m_rect.bottom(); | |
|
80 | polyline[j] = QPointF(x, y); | |
|
81 | } | |
|
82 | painter->setPen(series->color()); | |
|
83 | painter->drawPolyline(polyline); | |
|
84 | } | |
|
85 | } | |
|
86 | QCHART_END_NAMESPACE |
@@ -0,0 +1,52 | |||
|
1 | #ifndef XYLINECHART_H | |
|
2 | #define XYLINECHART_H | |
|
3 | ||
|
4 | #include "qchartconfig.h" | |
|
5 | #include "qchart.h" | |
|
6 | #include "qxyseries.h" | |
|
7 | #include "xyplotdata_p.h" | |
|
8 | ||
|
9 | QCHART_BEGIN_NAMESPACE | |
|
10 | ||
|
11 | class Axis; | |
|
12 | class XYGrid; | |
|
13 | ||
|
14 | class XYLineChart : public QChart | |
|
15 | { | |
|
16 | ||
|
17 | public: | |
|
18 | XYLineChart(QGraphicsItem *parent = 0); | |
|
19 | virtual ~XYLineChart(){}; | |
|
20 | ||
|
21 | //from QGraphicsItem | |
|
22 | virtual QRectF boundingRect() const; | |
|
23 | virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); | |
|
24 | ||
|
25 | //from QChart | |
|
26 | virtual void setSize(const QSizeF& size); | |
|
27 | ||
|
28 | void addXYSeries(const QXYSeries* series); | |
|
29 | ||
|
30 | const XYPlotData& xyPlotData() const { return m_plotDataList.at(m_plotDataIndex); } | |
|
31 | ||
|
32 | private: | |
|
33 | void updateGeometry(); | |
|
34 | void drawData(QPainter *painter); | |
|
35 | ||
|
36 | private: | |
|
37 | QRect m_rect; | |
|
38 | QList<const QXYSeries*> m_series; | |
|
39 | Axis* m_axisX; | |
|
40 | Axis* m_axisY; | |
|
41 | XYGrid* m_grid; | |
|
42 | QPointF* m_origin; | |
|
43 | QMap<int, QVector<QPointF> > curveMap; | |
|
44 | QList<XYPlotData> m_plotDataList; | |
|
45 | int m_plotDataIndex; | |
|
46 | ||
|
47 | ||
|
48 | }; | |
|
49 | ||
|
50 | QCHART_END_NAMESPACE | |
|
51 | ||
|
52 | #endif |
@@ -0,0 +1,27 | |||
|
1 | #include "xyplotdata_p.h" | |
|
2 | ||
|
3 | QCHART_BEGIN_NAMESPACE | |
|
4 | ||
|
5 | XYPlotData::XYPlotData() | |
|
6 | { | |
|
7 | ||
|
8 | } | |
|
9 | ||
|
10 | XYPlotData::~XYPlotData() | |
|
11 | { | |
|
12 | // TODO Auto-generated destructor stub | |
|
13 | } | |
|
14 | ||
|
15 | qreal XYPlotData::spanX() const | |
|
16 | { | |
|
17 | Q_ASSERT(m_maxX >= m_minX); | |
|
18 | return m_maxX - m_minX; | |
|
19 | } | |
|
20 | ||
|
21 | qreal XYPlotData::spanY() const | |
|
22 | { | |
|
23 | Q_ASSERT(m_maxY >= m_minY); | |
|
24 | return m_maxY - m_minY; | |
|
25 | } | |
|
26 | ||
|
27 | QCHART_END_NAMESPACE |
@@ -0,0 +1,31 | |||
|
1 | #ifndef PLOTTER_H_ | |
|
2 | #define PLOTTER_H_ | |
|
3 | #include "qchartconfig.h" | |
|
4 | #include <QtGlobal> | |
|
5 | ||
|
6 | QCHART_BEGIN_NAMESPACE | |
|
7 | ||
|
8 | class XYPlotData { | |
|
9 | public: | |
|
10 | XYPlotData(); | |
|
11 | virtual ~XYPlotData(); | |
|
12 | ||
|
13 | qreal spanX() const; | |
|
14 | qreal spanY() const; | |
|
15 | int ticksX() const { return m_ticksX; } | |
|
16 | int ticksY() const { return m_ticksY; } | |
|
17 | ||
|
18 | public: | |
|
19 | int m_ticksX; | |
|
20 | int m_ticksY; | |
|
21 | qreal m_minX; | |
|
22 | qreal m_maxX; | |
|
23 | qreal m_minY; | |
|
24 | qreal m_maxY; | |
|
25 | ||
|
26 | ||
|
27 | }; | |
|
28 | ||
|
29 | QCHART_END_NAMESPACE | |
|
30 | ||
|
31 | #endif /* PLOTTER_H_ */ |
General Comments 0
You need to be logged in to leave comments.
Login now