@@ -0,0 +1,101 | |||
|
1 | /**************************************************************************** | |
|
2 | ** | |
|
3 | ** Copyright (C) 2012 Digia Plc | |
|
4 | ** All rights reserved. | |
|
5 | ** For any questions to Digia, please use contact form at http://qt.digia.com | |
|
6 | ** | |
|
7 | ** This file is part of the Qt Commercial Charts Add-on. | |
|
8 | ** | |
|
9 | ** $QT_BEGIN_LICENSE$ | |
|
10 | ** Licensees holding valid Qt Commercial licenses may use this file in | |
|
11 | ** accordance with the Qt Commercial License Agreement provided with the | |
|
12 | ** Software or, alternatively, in accordance with the terms contained in | |
|
13 | ** a written agreement between you and Digia. | |
|
14 | ** | |
|
15 | ** If you have questions regarding the use of this file, please use | |
|
16 | ** contact form at http://qt.digia.com | |
|
17 | ** $QT_END_LICENSE$ | |
|
18 | ** | |
|
19 | ****************************************************************************/ | |
|
20 | ||
|
21 | #include <QValuesAxis> | |
|
22 | #include <QAbstractAxis> | |
|
23 | #include <QDebug> | |
|
24 | ||
|
25 | #include "chart.h" | |
|
26 | ||
|
27 | Chart::Chart(QGraphicsItem *parent, Qt::WindowFlags wFlags, QLineSeries *series) | |
|
28 | : QChart(parent, wFlags), m_series(series) | |
|
29 | { | |
|
30 | m_clicked = false; | |
|
31 | } | |
|
32 | ||
|
33 | Chart::~Chart() | |
|
34 | { | |
|
35 | } | |
|
36 | ||
|
37 | void Chart::clickPoint(const QPointF &point) | |
|
38 | { | |
|
39 | //Get all points from the series. | |
|
40 | QList<QPointF> points = m_series->points(); | |
|
41 | //Construct a small rectangle around the clicked point | |
|
42 | //to identify the real point clicked from the series. | |
|
43 | QRectF clickRect(point.x() - 0.5, point.y() - 0.5, 1.0, 1.0); | |
|
44 | ||
|
45 | //Find the clicked point to be moved. | |
|
46 | foreach (QPointF p, points) { | |
|
47 | if (clickRect.contains(p)) { | |
|
48 | m_movingPoint = p; | |
|
49 | m_clicked = true; | |
|
50 | return; | |
|
51 | } | |
|
52 | } | |
|
53 | } | |
|
54 | ||
|
55 | void Chart::setPointClicked(bool clicked) | |
|
56 | { | |
|
57 | m_clicked = clicked; | |
|
58 | } | |
|
59 | ||
|
60 | void Chart::handlePointMove(const QPoint &point) | |
|
61 | { | |
|
62 | if (m_clicked) { | |
|
63 | //Map the point clicked from the ChartView | |
|
64 | //to the area occupied by the chart. | |
|
65 | QPoint mappedPoint = point; | |
|
66 | mappedPoint.setX(point.x()-this->plotArea().x()); | |
|
67 | mappedPoint.setY(point.y()-this->plotArea().y()); | |
|
68 | ||
|
69 | //Get the x- and y axis to be able to convert the mapped | |
|
70 | //coordinate point to the charts scale. | |
|
71 | QAbstractAxis * axisx = this->axisX(); | |
|
72 | QValuesAxis* haxis = 0; | |
|
73 | if (axisx->type() == QAbstractAxis::AxisTypeValues) | |
|
74 | haxis = qobject_cast<QValuesAxis*>(axisx); | |
|
75 | ||
|
76 | QAbstractAxis * axisy = this->axisY(); | |
|
77 | QValuesAxis* vaxis = 0; | |
|
78 | if (axisy->type() == QAbstractAxis::AxisTypeValues) | |
|
79 | vaxis = qobject_cast<QValuesAxis*>(axisy); | |
|
80 | ||
|
81 | if (haxis && vaxis) { | |
|
82 | //Calculate the "unit" between points on the x | |
|
83 | //y axis. | |
|
84 | double xUnit = this->plotArea().width()/haxis->max(); | |
|
85 | double yUnit = this->plotArea().height()/vaxis->max(); | |
|
86 | ||
|
87 | //Convert the mappedPoint to the actual chart scale. | |
|
88 | double x = mappedPoint.x()/xUnit; | |
|
89 | double y = vaxis->max() - mappedPoint.y()/yUnit; | |
|
90 | ||
|
91 | //Replace the old point with the new one. | |
|
92 | m_series->replace(m_movingPoint, QPointF(x, y)); | |
|
93 | ||
|
94 | //Update the m_movingPoint so we are able to | |
|
95 | //do the replace also during mousemoveEvent. | |
|
96 | m_movingPoint.setX(x); | |
|
97 | m_movingPoint.setY(y); | |
|
98 | } | |
|
99 | } | |
|
100 | } | |
|
101 |
@@ -0,0 +1,52 | |||
|
1 | /**************************************************************************** | |
|
2 | ** | |
|
3 | ** Copyright (C) 2012 Digia Plc | |
|
4 | ** All rights reserved. | |
|
5 | ** For any questions to Digia, please use contact form at http://qt.digia.com | |
|
6 | ** | |
|
7 | ** This file is part of the Qt Commercial Charts Add-on. | |
|
8 | ** | |
|
9 | ** $QT_BEGIN_LICENSE$ | |
|
10 | ** Licensees holding valid Qt Commercial licenses may use this file in | |
|
11 | ** accordance with the Qt Commercial License Agreement provided with the | |
|
12 | ** Software or, alternatively, in accordance with the terms contained in | |
|
13 | ** a written agreement between you and Digia. | |
|
14 | ** | |
|
15 | ** If you have questions regarding the use of this file, please use | |
|
16 | ** contact form at http://qt.digia.com | |
|
17 | ** $QT_END_LICENSE$ | |
|
18 | ** | |
|
19 | ****************************************************************************/ | |
|
20 | ||
|
21 | #ifndef CHART_H | |
|
22 | #define CHART_H | |
|
23 | ||
|
24 | #include <QChart> | |
|
25 | #include <QLineSeries> | |
|
26 | ||
|
27 | QTCOMMERCIALCHART_USE_NAMESPACE | |
|
28 | ||
|
29 | class Chart : public QChart | |
|
30 | { | |
|
31 | Q_OBJECT | |
|
32 | public: | |
|
33 | explicit Chart(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0, QLineSeries *series = 0); | |
|
34 | ~Chart(); | |
|
35 | ||
|
36 | public slots: | |
|
37 | void clickPoint(const QPointF &point); | |
|
38 | ||
|
39 | public: | |
|
40 | void handlePointMove(const QPoint &point); | |
|
41 | void setPointClicked(bool clicked); | |
|
42 | ||
|
43 | private: | |
|
44 | QLineSeries *m_series; | |
|
45 | QPointF m_movingPoint; | |
|
46 | ||
|
47 | //Boolean value to determine if an actual point in the | |
|
48 | //series is clicked. | |
|
49 | bool m_clicked; | |
|
50 | }; | |
|
51 | ||
|
52 | #endif // CHART_H |
@@ -0,0 +1,9 | |||
|
1 | !include( ../demos.pri ):error( "Couldn't find the demos.pri file!" ) | |
|
2 | ||
|
3 | QT += core gui | |
|
4 | ||
|
5 | TARGET = chartinteractions | |
|
6 | TEMPLATE = app | |
|
7 | ||
|
8 | HEADERS += chart.h chartview.h | |
|
9 | SOURCES += main.cpp chart.cpp chartview.cpp |
@@ -0,0 +1,50 | |||
|
1 | /**************************************************************************** | |
|
2 | ** | |
|
3 | ** Copyright (C) 2012 Digia Plc | |
|
4 | ** All rights reserved. | |
|
5 | ** For any questions to Digia, please use contact form at http://qt.digia.com | |
|
6 | ** | |
|
7 | ** This file is part of the Qt Commercial Charts Add-on. | |
|
8 | ** | |
|
9 | ** $QT_BEGIN_LICENSE$ | |
|
10 | ** Licensees holding valid Qt Commercial licenses may use this file in | |
|
11 | ** accordance with the Qt Commercial License Agreement provided with the | |
|
12 | ** Software or, alternatively, in accordance with the terms contained in | |
|
13 | ** a written agreement between you and Digia. | |
|
14 | ** | |
|
15 | ** If you have questions regarding the use of this file, please use | |
|
16 | ** contact form at http://qt.digia.com | |
|
17 | ** $QT_END_LICENSE$ | |
|
18 | ** | |
|
19 | ****************************************************************************/ | |
|
20 | ||
|
21 | #include <QMouseEvent> | |
|
22 | #include "chartview.h" | |
|
23 | #include "chart.h" | |
|
24 | ||
|
25 | ChartView::ChartView(Chart *chart, QWidget *parent) : | |
|
26 | QChartView(chart, parent) | |
|
27 | { | |
|
28 | m_chart = chart; | |
|
29 | } | |
|
30 | ||
|
31 | void ChartView::mousePressEvent(QMouseEvent *event) | |
|
32 | { | |
|
33 | m_mousePos = event->pos(); | |
|
34 | QChartView::mousePressEvent(event); | |
|
35 | } | |
|
36 | ||
|
37 | void ChartView::mouseMoveEvent(QMouseEvent *event) | |
|
38 | { | |
|
39 | m_chart->handlePointMove(event->pos()); | |
|
40 | QChartView::mouseMoveEvent(event); | |
|
41 | } | |
|
42 | ||
|
43 | void ChartView::mouseReleaseEvent(QMouseEvent *event) | |
|
44 | { | |
|
45 | if (event->pos() != m_mousePos) { | |
|
46 | m_chart->handlePointMove(event->pos()); | |
|
47 | m_chart->setPointClicked(false); | |
|
48 | } | |
|
49 | QChartView::mouseReleaseEvent(event); | |
|
50 | } |
@@ -0,0 +1,45 | |||
|
1 | /**************************************************************************** | |
|
2 | ** | |
|
3 | ** Copyright (C) 2012 Digia Plc | |
|
4 | ** All rights reserved. | |
|
5 | ** For any questions to Digia, please use contact form at http://qt.digia.com | |
|
6 | ** | |
|
7 | ** This file is part of the Qt Commercial Charts Add-on. | |
|
8 | ** | |
|
9 | ** $QT_BEGIN_LICENSE$ | |
|
10 | ** Licensees holding valid Qt Commercial licenses may use this file in | |
|
11 | ** accordance with the Qt Commercial License Agreement provided with the | |
|
12 | ** Software or, alternatively, in accordance with the terms contained in | |
|
13 | ** a written agreement between you and Digia. | |
|
14 | ** | |
|
15 | ** If you have questions regarding the use of this file, please use | |
|
16 | ** contact form at http://qt.digia.com | |
|
17 | ** $QT_END_LICENSE$ | |
|
18 | ** | |
|
19 | ****************************************************************************/ | |
|
20 | ||
|
21 | #ifndef CHARTVIEW_H | |
|
22 | #define CHARTVIEW_H | |
|
23 | ||
|
24 | #include <QChartView> | |
|
25 | ||
|
26 | class Chart; | |
|
27 | ||
|
28 | QTCOMMERCIALCHART_USE_NAMESPACE | |
|
29 | ||
|
30 | class ChartView : public QChartView | |
|
31 | { | |
|
32 | public: | |
|
33 | ChartView(Chart *chart, QWidget *parent = 0); | |
|
34 | ||
|
35 | protected: | |
|
36 | void mousePressEvent(QMouseEvent *event); | |
|
37 | void mouseMoveEvent(QMouseEvent *event); | |
|
38 | void mouseReleaseEvent(QMouseEvent *event); | |
|
39 | ||
|
40 | private: | |
|
41 | Chart *m_chart; | |
|
42 | QPoint m_mousePos; | |
|
43 | }; | |
|
44 | ||
|
45 | #endif |
@@ -0,0 +1,71 | |||
|
1 | /**************************************************************************** | |
|
2 | ** | |
|
3 | ** Copyright (C) 2012 Digia Plc | |
|
4 | ** All rights reserved. | |
|
5 | ** For any questions to Digia, please use contact form at http://qt.digia.com | |
|
6 | ** | |
|
7 | ** This file is part of the Qt Commercial Charts Add-on. | |
|
8 | ** | |
|
9 | ** $QT_BEGIN_LICENSE$ | |
|
10 | ** Licensees holding valid Qt Commercial licenses may use this file in | |
|
11 | ** accordance with the Qt Commercial License Agreement provided with the | |
|
12 | ** Software or, alternatively, in accordance with the terms contained in | |
|
13 | ** a written agreement between you and Digia. | |
|
14 | ** | |
|
15 | ** If you have questions regarding the use of this file, please use | |
|
16 | ** contact form at http://qt.digia.com | |
|
17 | ** $QT_END_LICENSE$ | |
|
18 | ** | |
|
19 | ****************************************************************************/ | |
|
20 | ||
|
21 | #include <QApplication> | |
|
22 | #include <QMainWindow> | |
|
23 | #include <QLineSeries> | |
|
24 | ||
|
25 | #include <QValuesAxis> | |
|
26 | ||
|
27 | #include "chart.h" | |
|
28 | #include "chartview.h" | |
|
29 | ||
|
30 | QTCOMMERCIALCHART_USE_NAMESPACE | |
|
31 | ||
|
32 | int main(int argc, char *argv[]) | |
|
33 | { | |
|
34 | QApplication a(argc, argv); | |
|
35 | ||
|
36 | QLineSeries* series = new QLineSeries(); | |
|
37 | ||
|
38 | series->append(0, 6); | |
|
39 | series->append(1, 3); | |
|
40 | series->append(2, 4); | |
|
41 | series->append(3, 8); | |
|
42 | series->append(7, 13); | |
|
43 | series->append(10, 5); | |
|
44 | *series << QPointF(11, 1) << QPointF(13, 3) << QPointF(17, 6) << QPointF(18, 3) << QPointF(20, 2); | |
|
45 | ||
|
46 | Chart* chart = new Chart(0, 0, series); | |
|
47 | chart->legend()->hide(); | |
|
48 | chart->addSeries(series); | |
|
49 | chart->createDefaultAxes(); | |
|
50 | chart->setTitle("Drag'n drop to move data points"); | |
|
51 | ||
|
52 | QValuesAxis *axisX = new QValuesAxis(); | |
|
53 | chart->setAxisX(axisX, series); | |
|
54 | axisX->setRange(0, 20); | |
|
55 | ||
|
56 | QValuesAxis *axisY = new QValuesAxis(); | |
|
57 | chart->setAxisY(axisY, series); | |
|
58 | axisY->setRange(0, 13); | |
|
59 | ||
|
60 | QObject::connect(series, SIGNAL(clicked(QPointF)), chart, SLOT(clickPoint(QPointF))); | |
|
61 | ||
|
62 | ChartView* chartView = new ChartView(chart); | |
|
63 | chartView->setRenderHint(QPainter::Antialiasing); | |
|
64 | ||
|
65 | QMainWindow window; | |
|
66 | window.setCentralWidget(chartView); | |
|
67 | window.resize(400, 300); | |
|
68 | window.show(); | |
|
69 | ||
|
70 | return a.exec(); | |
|
71 | } |
@@ -13,4 +13,5 SUBDIRS += chartthemes \ | |||
|
13 | 13 | qmlcustomizations \ |
|
14 | 14 | qmlcustommodel \ |
|
15 | 15 | qmloscilloscope \ |
|
16 | chartviewer | |
|
16 | chartviewer \ | |
|
17 | chartinteractions |
@@ -133,7 +133,7 Q_SIGNALS: | |||
|
133 | 133 | |
|
134 | 134 | protected: |
|
135 | 135 | QScopedPointer<QAbstractAxisPrivate> d_ptr; |
|
136 |
Q_DISABLE_COPY(QAbstractAxis) |
|
|
136 | Q_DISABLE_COPY(QAbstractAxis) | |
|
137 | 137 | friend class ChartDataSet; |
|
138 | 138 | friend class ChartAxis; |
|
139 | 139 | friend class ChartPresenter; |
@@ -55,13 +55,13 public: | |||
|
55 | 55 | BackgroundZValue = -1, |
|
56 | 56 | ShadesZValue , |
|
57 | 57 | GridZValue, |
|
58 | AxisZValue, | |
|
58 | 59 | SeriesZValue, |
|
59 | 60 | LineChartZValue = SeriesZValue, |
|
60 | 61 | SplineChartZValue = SeriesZValue, |
|
61 | 62 | BarSeriesZValue = SeriesZValue, |
|
62 | 63 | ScatterSeriesZValue = SeriesZValue, |
|
63 | 64 | PieSeriesZValue = SeriesZValue, |
|
64 | AxisZValue, | |
|
65 | 65 | LegendZValue, |
|
66 | 66 | TopMostZValue |
|
67 | 67 | }; |
General Comments 0
You need to be logged in to leave comments.
Login now