@@ -0,0 +1,55 | |||
|
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 "datasource.h" | |
|
22 | #include <QXYSeries> | |
|
23 | #include <QDebug> | |
|
24 | ||
|
25 | QTCOMMERCIALCHART_USE_NAMESPACE | |
|
26 | ||
|
27 | DataSource::DataSource(QObject *parent) : | |
|
28 | QObject(parent), | |
|
29 | m_index(0) | |
|
30 | { | |
|
31 | const int rowCount = 5; | |
|
32 | const int colCount = 1024; | |
|
33 | ||
|
34 | for (int i(0); i < rowCount; i++) { | |
|
35 | QList<QPointF> points; | |
|
36 | for (int j(0); j < colCount; j++) { | |
|
37 | qreal x = j; | |
|
38 | qreal y = sin(3.14159265358979 / 50 * x) + 0.5 + (qreal) rand() / (qreal) RAND_MAX; | |
|
39 | points.append(QPointF(x, y)); | |
|
40 | } | |
|
41 | m_data.append(points); | |
|
42 | } | |
|
43 | } | |
|
44 | ||
|
45 | void DataSource::update(QAbstractSeries *series) | |
|
46 | { | |
|
47 | QXYSeries *xySeries = qobject_cast<QXYSeries *>(series); | |
|
48 | Q_ASSERT(xySeries); | |
|
49 | ||
|
50 | QList<QPointF> points = m_data.at(m_index); | |
|
51 | //xySeries->clear(); | |
|
52 | //xySeries->append(points); | |
|
53 | xySeries->replace(points); | |
|
54 | m_index = (m_index + 1) % m_data.count(); | |
|
55 | } |
@@ -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 DATASOURCE_H | |
|
22 | #define DATASOURCE_H | |
|
23 | ||
|
24 | #include <QObject> | |
|
25 | #include <QAbstractSeries> | |
|
26 | ||
|
27 | QTCOMMERCIALCHART_USE_NAMESPACE | |
|
28 | ||
|
29 | class DataSource : public QObject | |
|
30 | { | |
|
31 | Q_OBJECT | |
|
32 | public: | |
|
33 | explicit DataSource(QObject *parent = 0); | |
|
34 | ||
|
35 | signals: | |
|
36 | ||
|
37 | public slots: | |
|
38 | void update(QAbstractSeries *series); | |
|
39 | ||
|
40 | private: | |
|
41 | QList<QList<QPointF> > m_data; | |
|
42 | int m_index; | |
|
43 | }; | |
|
44 | ||
|
45 | #endif // DATASOURCE_H |
@@ -0,0 +1,42 | |||
|
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 <QtGui/QApplication> | |
|
22 | #include <QDeclarativeEngine> | |
|
23 | #include <QDeclarativeContext> | |
|
24 | #include <QGLWidget> | |
|
25 | #include "qmlapplicationviewer.h" | |
|
26 | #include "datasource.h" | |
|
27 | ||
|
28 | Q_DECL_EXPORT int main(int argc, char *argv[]) | |
|
29 | { | |
|
30 | QScopedPointer<QApplication> app(createApplication(argc, argv)); | |
|
31 | QScopedPointer<QmlApplicationViewer> viewer(QmlApplicationViewer::create()); | |
|
32 | ||
|
33 | DataSource dataSource; | |
|
34 | viewer->rootContext()->setContextProperty("dataSource", &dataSource); | |
|
35 | ||
|
36 | viewer->setOrientation(QmlApplicationViewer::ScreenOrientationAuto); | |
|
37 | viewer->setSource(QUrl("qrc:/qml/qmloscilloscope/main.qml")); | |
|
38 | viewer->setViewport(new QGLWidget()); | |
|
39 | viewer->showExpanded(); | |
|
40 | ||
|
41 | return app->exec(); | |
|
42 | } |
@@ -0,0 +1,72 | |||
|
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 | import QtQuick 1.0 | |
|
22 | import QtCommercial.Chart 1.0 | |
|
23 | ||
|
24 | Rectangle { | |
|
25 | width: 400 | |
|
26 | height: 300 | |
|
27 | ||
|
28 | ChartView { | |
|
29 | id: chartView | |
|
30 | anchors.fill: parent | |
|
31 | title: "Oscilloscope" | |
|
32 | animationOptions: ChartView.NoAnimation | |
|
33 | ||
|
34 | ValuesAxis { | |
|
35 | id: axisY | |
|
36 | min: -1 | |
|
37 | max: 3 | |
|
38 | } | |
|
39 | ||
|
40 | ValuesAxis { | |
|
41 | id: axisX | |
|
42 | min: 0 | |
|
43 | max: 1000 | |
|
44 | } | |
|
45 | ||
|
46 | LineSeries { | |
|
47 | id: lineSeries1 | |
|
48 | name: "signal 1" | |
|
49 | } | |
|
50 | LineSeries { | |
|
51 | id: lineSeries2 | |
|
52 | name: "signal 2" | |
|
53 | } | |
|
54 | } | |
|
55 | ||
|
56 | Timer { | |
|
57 | interval: 16 // 60 Hz | |
|
58 | running: true | |
|
59 | repeat: true | |
|
60 | onTriggered: { | |
|
61 | dataSource.update(lineSeries1); | |
|
62 | dataSource.update(lineSeries2); | |
|
63 | } | |
|
64 | } | |
|
65 | ||
|
66 | Component.onCompleted: { | |
|
67 | chartView.setAxisX(axisX, lineSeries1); | |
|
68 | chartView.setAxisY(axisY, lineSeries1); | |
|
69 | chartView.setAxisX(axisX, lineSeries2); | |
|
70 | chartView.setAxisY(axisY, lineSeries2); | |
|
71 | } | |
|
72 | } |
@@ -0,0 +1,200 | |||
|
1 | // checksum 0x78c version 0x60010 | |
|
2 | /* | |
|
3 | This file was generated by the Qt Quick Application wizard of Qt Creator. | |
|
4 | QmlApplicationViewer is a convenience class containing mobile device specific | |
|
5 | code such as screen orientation handling. Also QML paths and debugging are | |
|
6 | handled here. | |
|
7 | It is recommended not to modify this file, since newer versions of Qt Creator | |
|
8 | may offer an updated version of it. | |
|
9 | */ | |
|
10 | ||
|
11 | #include "qmlapplicationviewer.h" | |
|
12 | ||
|
13 | #include <QtCore/QDir> | |
|
14 | #include <QtCore/QFileInfo> | |
|
15 | #include <QtDeclarative/QDeclarativeComponent> | |
|
16 | #include <QtDeclarative/QDeclarativeEngine> | |
|
17 | #include <QtDeclarative/QDeclarativeContext> | |
|
18 | #include <QtGui/QApplication> | |
|
19 | ||
|
20 | #include <qplatformdefs.h> // MEEGO_EDITION_HARMATTAN | |
|
21 | ||
|
22 | #ifdef HARMATTAN_BOOSTER | |
|
23 | #include <MDeclarativeCache> | |
|
24 | #endif | |
|
25 | ||
|
26 | #if defined(QMLJSDEBUGGER) && QT_VERSION < 0x040800 | |
|
27 | ||
|
28 | #include <qt_private/qdeclarativedebughelper_p.h> | |
|
29 | ||
|
30 | #if !defined(NO_JSDEBUGGER) | |
|
31 | #include <jsdebuggeragent.h> | |
|
32 | #endif | |
|
33 | #if !defined(NO_QMLOBSERVER) | |
|
34 | #include <qdeclarativeviewobserver.h> | |
|
35 | #endif | |
|
36 | ||
|
37 | // Enable debugging before any QDeclarativeEngine is created | |
|
38 | struct QmlJsDebuggingEnabler | |
|
39 | { | |
|
40 | QmlJsDebuggingEnabler() | |
|
41 | { | |
|
42 | QDeclarativeDebugHelper::enableDebugging(); | |
|
43 | } | |
|
44 | }; | |
|
45 | ||
|
46 | // Execute code in constructor before first QDeclarativeEngine is instantiated | |
|
47 | static QmlJsDebuggingEnabler enableDebuggingHelper; | |
|
48 | ||
|
49 | #endif // QMLJSDEBUGGER | |
|
50 | ||
|
51 | class QmlApplicationViewerPrivate | |
|
52 | { | |
|
53 | QmlApplicationViewerPrivate(QDeclarativeView *view_) : view(view_) {} | |
|
54 | ||
|
55 | QString mainQmlFile; | |
|
56 | QDeclarativeView *view; | |
|
57 | friend class QmlApplicationViewer; | |
|
58 | QString adjustPath(const QString &path); | |
|
59 | }; | |
|
60 | ||
|
61 | QString QmlApplicationViewerPrivate::adjustPath(const QString &path) | |
|
62 | { | |
|
63 | #ifdef Q_OS_UNIX | |
|
64 | #ifdef Q_OS_MAC | |
|
65 | if (!QDir::isAbsolutePath(path)) | |
|
66 | return QCoreApplication::applicationDirPath() | |
|
67 | + QLatin1String("/../Resources/") + path; | |
|
68 | #else | |
|
69 | QString pathInInstallDir; | |
|
70 | const QString applicationDirPath = QCoreApplication::applicationDirPath(); | |
|
71 | pathInInstallDir = QString::fromAscii("%1/../%2").arg(applicationDirPath, path); | |
|
72 | ||
|
73 | if (QFileInfo(pathInInstallDir).exists()) | |
|
74 | return pathInInstallDir; | |
|
75 | #endif | |
|
76 | #endif | |
|
77 | return path; | |
|
78 | } | |
|
79 | ||
|
80 | QmlApplicationViewer::QmlApplicationViewer(QWidget *parent) | |
|
81 | : QDeclarativeView(parent) | |
|
82 | , d(new QmlApplicationViewerPrivate(this)) | |
|
83 | { | |
|
84 | connect(engine(), SIGNAL(quit()), SLOT(close())); | |
|
85 | setResizeMode(QDeclarativeView::SizeRootObjectToView); | |
|
86 | // Qt versions prior to 4.8.0 don't have QML/JS debugging services built in | |
|
87 | #if defined(QMLJSDEBUGGER) && QT_VERSION < 0x040800 | |
|
88 | #if !defined(NO_JSDEBUGGER) | |
|
89 | new QmlJSDebugger::JSDebuggerAgent(d->view->engine()); | |
|
90 | #endif | |
|
91 | #if !defined(NO_QMLOBSERVER) | |
|
92 | new QmlJSDebugger::QDeclarativeViewObserver(d->view, d->view); | |
|
93 | #endif | |
|
94 | #endif | |
|
95 | } | |
|
96 | ||
|
97 | QmlApplicationViewer::QmlApplicationViewer(QDeclarativeView *view, QWidget *parent) | |
|
98 | : QDeclarativeView(parent) | |
|
99 | , d(new QmlApplicationViewerPrivate(view)) | |
|
100 | { | |
|
101 | connect(view->engine(), SIGNAL(quit()), view, SLOT(close())); | |
|
102 | view->setResizeMode(QDeclarativeView::SizeRootObjectToView); | |
|
103 | // Qt versions prior to 4.8.0 don't have QML/JS debugging services built in | |
|
104 | #if defined(QMLJSDEBUGGER) && QT_VERSION < 0x040800 | |
|
105 | #if !defined(NO_JSDEBUGGER) | |
|
106 | new QmlJSDebugger::JSDebuggerAgent(d->view->engine()); | |
|
107 | #endif | |
|
108 | #if !defined(NO_QMLOBSERVER) | |
|
109 | new QmlJSDebugger::QDeclarativeViewObserver(d->view, d->view); | |
|
110 | #endif | |
|
111 | #endif | |
|
112 | } | |
|
113 | ||
|
114 | QmlApplicationViewer::~QmlApplicationViewer() | |
|
115 | { | |
|
116 | delete d; | |
|
117 | } | |
|
118 | ||
|
119 | QmlApplicationViewer *QmlApplicationViewer::create() | |
|
120 | { | |
|
121 | #ifdef HARMATTAN_BOOSTER | |
|
122 | return new QmlApplicationViewer(MDeclarativeCache::qDeclarativeView(), 0); | |
|
123 | #else | |
|
124 | return new QmlApplicationViewer(); | |
|
125 | #endif | |
|
126 | } | |
|
127 | ||
|
128 | void QmlApplicationViewer::setMainQmlFile(const QString &file) | |
|
129 | { | |
|
130 | d->mainQmlFile = d->adjustPath(file); | |
|
131 | d->view->setSource(QUrl::fromLocalFile(d->mainQmlFile)); | |
|
132 | } | |
|
133 | ||
|
134 | void QmlApplicationViewer::addImportPath(const QString &path) | |
|
135 | { | |
|
136 | d->view->engine()->addImportPath(d->adjustPath(path)); | |
|
137 | } | |
|
138 | ||
|
139 | void QmlApplicationViewer::setOrientation(ScreenOrientation orientation) | |
|
140 | { | |
|
141 | #if defined(Q_OS_SYMBIAN) | |
|
142 | // If the version of Qt on the device is < 4.7.2, that attribute won't work | |
|
143 | if (orientation != ScreenOrientationAuto) { | |
|
144 | const QStringList v = QString::fromAscii(qVersion()).split(QLatin1Char('.')); | |
|
145 | if (v.count() == 3 && (v.at(0).toInt() << 16 | v.at(1).toInt() << 8 | v.at(2).toInt()) < 0x040702) { | |
|
146 | qWarning("Screen orientation locking only supported with Qt 4.7.2 and above"); | |
|
147 | return; | |
|
148 | } | |
|
149 | } | |
|
150 | #endif // Q_OS_SYMBIAN | |
|
151 | ||
|
152 | Qt::WidgetAttribute attribute; | |
|
153 | switch (orientation) { | |
|
154 | #if QT_VERSION < 0x040702 | |
|
155 | // Qt < 4.7.2 does not yet have the Qt::WA_*Orientation attributes | |
|
156 | case ScreenOrientationLockPortrait: | |
|
157 | attribute = static_cast<Qt::WidgetAttribute>(128); | |
|
158 | break; | |
|
159 | case ScreenOrientationLockLandscape: | |
|
160 | attribute = static_cast<Qt::WidgetAttribute>(129); | |
|
161 | break; | |
|
162 | default: | |
|
163 | case ScreenOrientationAuto: | |
|
164 | attribute = static_cast<Qt::WidgetAttribute>(130); | |
|
165 | break; | |
|
166 | #else // QT_VERSION < 0x040702 | |
|
167 | case ScreenOrientationLockPortrait: | |
|
168 | attribute = Qt::WA_LockPortraitOrientation; | |
|
169 | break; | |
|
170 | case ScreenOrientationLockLandscape: | |
|
171 | attribute = Qt::WA_LockLandscapeOrientation; | |
|
172 | break; | |
|
173 | default: | |
|
174 | case ScreenOrientationAuto: | |
|
175 | attribute = Qt::WA_AutoOrientation; | |
|
176 | break; | |
|
177 | #endif // QT_VERSION < 0x040702 | |
|
178 | }; | |
|
179 | setAttribute(attribute, true); | |
|
180 | } | |
|
181 | ||
|
182 | void QmlApplicationViewer::showExpanded() | |
|
183 | { | |
|
184 | #if defined(Q_OS_SYMBIAN) || defined(MEEGO_EDITION_HARMATTAN) || defined(Q_WS_SIMULATOR) | |
|
185 | d->view->showFullScreen(); | |
|
186 | #elif defined(Q_WS_MAEMO_5) | |
|
187 | d->view->showMaximized(); | |
|
188 | #else | |
|
189 | d->view->show(); | |
|
190 | #endif | |
|
191 | } | |
|
192 | ||
|
193 | QApplication *createApplication(int &argc, char **argv) | |
|
194 | { | |
|
195 | #ifdef HARMATTAN_BOOSTER | |
|
196 | return MDeclarativeCache::qApplication(argc, argv); | |
|
197 | #else | |
|
198 | return new QApplication(argc, argv); | |
|
199 | #endif | |
|
200 | } |
@@ -0,0 +1,47 | |||
|
1 | // checksum 0x82ed version 0x60010 | |
|
2 | /* | |
|
3 | This file was generated by the Qt Quick Application wizard of Qt Creator. | |
|
4 | QmlApplicationViewer is a convenience class containing mobile device specific | |
|
5 | code such as screen orientation handling. Also QML paths and debugging are | |
|
6 | handled here. | |
|
7 | It is recommended not to modify this file, since newer versions of Qt Creator | |
|
8 | may offer an updated version of it. | |
|
9 | */ | |
|
10 | ||
|
11 | #ifndef QMLAPPLICATIONVIEWER_H | |
|
12 | #define QMLAPPLICATIONVIEWER_H | |
|
13 | ||
|
14 | #include <QtDeclarative/QDeclarativeView> | |
|
15 | ||
|
16 | class QmlApplicationViewer : public QDeclarativeView | |
|
17 | { | |
|
18 | Q_OBJECT | |
|
19 | ||
|
20 | public: | |
|
21 | enum ScreenOrientation { | |
|
22 | ScreenOrientationLockPortrait, | |
|
23 | ScreenOrientationLockLandscape, | |
|
24 | ScreenOrientationAuto | |
|
25 | }; | |
|
26 | ||
|
27 | explicit QmlApplicationViewer(QWidget *parent = 0); | |
|
28 | virtual ~QmlApplicationViewer(); | |
|
29 | ||
|
30 | static QmlApplicationViewer *create(); | |
|
31 | ||
|
32 | void setMainQmlFile(const QString &file); | |
|
33 | void addImportPath(const QString &path); | |
|
34 | ||
|
35 | // Note that this will only have an effect on Symbian and Fremantle. | |
|
36 | void setOrientation(ScreenOrientation orientation); | |
|
37 | ||
|
38 | void showExpanded(); | |
|
39 | ||
|
40 | private: | |
|
41 | explicit QmlApplicationViewer(QDeclarativeView *view, QWidget *parent); | |
|
42 | class QmlApplicationViewerPrivate *d; | |
|
43 | }; | |
|
44 | ||
|
45 | QApplication *createApplication(int &argc, char **argv); | |
|
46 | ||
|
47 | #endif // QMLAPPLICATIONVIEWER_H |
@@ -0,0 +1,13 | |||
|
1 | QT += declarative | |
|
2 | ||
|
3 | SOURCES += $$PWD/qmlapplicationviewer.cpp | |
|
4 | HEADERS += $$PWD/qmlapplicationviewer.h | |
|
5 | INCLUDEPATH += $$PWD | |
|
6 | ||
|
7 | # Include JS debugger library if QMLJSDEBUGGER_PATH is set | |
|
8 | !isEmpty(QMLJSDEBUGGER_PATH) { | |
|
9 | include($$QMLJSDEBUGGER_PATH/qmljsdebugger-lib.pri) | |
|
10 | } else { | |
|
11 | DEFINES -= QMLJSDEBUGGER | |
|
12 | } | |
|
13 |
@@ -0,0 +1,13 | |||
|
1 | !include( ../demos.pri ) { | |
|
2 | error( "Couldn't find the demos.pri file!" ) | |
|
3 | } | |
|
4 | ||
|
5 | QT += opengl | |
|
6 | RESOURCES += resources.qrc | |
|
7 | SOURCES += main.cpp \ | |
|
8 | datasource.cpp | |
|
9 | ||
|
10 | include(qmlapplicationviewer/qmlapplicationviewer.pri) | |
|
11 | ||
|
12 | HEADERS += \ | |
|
13 | datasource.h |
@@ -0,0 +1,5 | |||
|
1 | <RCC> | |
|
2 | <qresource prefix="/"> | |
|
3 | <file>qml/qmloscilloscope/main.qml</file> | |
|
4 | </qresource> | |
|
5 | </RCC> |
@@ -12,4 +12,5 SUBDIRS += chartthemes \ | |||
|
12 | 12 | qmlf1legends \ |
|
13 | 13 | qmlcustomizations \ |
|
14 | 14 | qmlcustommodel \ |
|
15 | qmloscilloscope \ | |
|
15 | 16 | chartviewer |
@@ -75,6 +75,7 QSplineSeries::QSplineSeries(QObject *parent) : | |||
|
75 | 75 | QObject::connect(this,SIGNAL(pointAdded(int)), d, SLOT(updateControlPoints())); |
|
76 | 76 | QObject::connect(this,SIGNAL(pointRemoved(int)), d, SLOT(updateControlPoints())); |
|
77 | 77 | QObject::connect(this,SIGNAL(pointReplaced(int)), d, SLOT(updateControlPoints())); |
|
78 | QObject::connect(this,SIGNAL(pointsReplaced()), d, SLOT(updateControlPoints())); | |
|
78 | 79 | } |
|
79 | 80 | |
|
80 | 81 | /*! |
@@ -98,6 +98,15 QTCOMMERCIALCHART_BEGIN_NAMESPACE | |||
|
98 | 98 | */ |
|
99 | 99 | |
|
100 | 100 | /*! |
|
101 | \fn void QXYSeries::pointsReplaced() | |
|
102 | Signal is emitted when all points have been replaced with another points. | |
|
103 | \sa replace() | |
|
104 | */ | |
|
105 | /*! | |
|
106 | \qmlsignal XYSeries::onPointsReplaced() | |
|
107 | */ | |
|
108 | ||
|
109 | /*! | |
|
101 | 110 | \fn void QXYSeries::pointAdded(int index) |
|
102 | 111 | Signal is emitted when a point has been added at \a index. |
|
103 | 112 | \sa append(), insert() |
@@ -192,7 +201,6 void QXYSeries::append(const QPointF &point) | |||
|
192 | 201 | { |
|
193 | 202 | Q_D(QXYSeries); |
|
194 | 203 | d->m_points<<point; |
|
195 | // emit d->pointAdded(d->m_points.count()-1); | |
|
196 | 204 | emit pointAdded(d->m_points.count()-1); |
|
197 | 205 | } |
|
198 | 206 | |
@@ -209,6 +217,7 void QXYSeries::append(const QList<QPointF> &points) | |||
|
209 | 217 | |
|
210 | 218 | /*! |
|
211 | 219 | Replaces data point \a oldX \a oldY with data point \a newX \a newY. |
|
220 | \sa QXYSeries::pointReplaced() | |
|
212 | 221 | */ |
|
213 | 222 | void QXYSeries::replace(qreal oldX,qreal oldY,qreal newX,qreal newY) |
|
214 | 223 | { |
@@ -217,6 +226,7 void QXYSeries::replace(qreal oldX,qreal oldY,qreal newX,qreal newY) | |||
|
217 | 226 | |
|
218 | 227 | /*! |
|
219 | 228 | Replaces \a oldPoint with \a newPoint. |
|
229 | \sa QXYSeries::pointReplaced() | |
|
220 | 230 | */ |
|
221 | 231 | void QXYSeries::replace(const QPointF &oldPoint,const QPointF &newPoint) |
|
222 | 232 | { |
@@ -228,6 +238,19 void QXYSeries::replace(const QPointF &oldPoint,const QPointF &newPoint) | |||
|
228 | 238 | } |
|
229 | 239 | |
|
230 | 240 | /*! |
|
241 | Replaces the current points with \a points. This is faster than replacing data points one by one, | |
|
242 | or first clearing all data, and then appending the new data. Emits QXYSeries::pointsReplaced() | |
|
243 | when the points have been replaced. | |
|
244 | \sa QXYSeries::pointsReplaced() | |
|
245 | */ | |
|
246 | void QXYSeries::replace(QList<QPointF> points) | |
|
247 | { | |
|
248 | Q_D(QXYSeries); | |
|
249 | d->m_points = points.toVector(); | |
|
250 | emit pointsReplaced(); | |
|
251 | } | |
|
252 | ||
|
253 | /*! | |
|
231 | 254 | Removes current \a x and \a y value. |
|
232 | 255 | */ |
|
233 | 256 | void QXYSeries::remove(qreal x,qreal y) |
@@ -246,7 +269,6 void QXYSeries::remove(const QPointF &point) | |||
|
246 | 269 | int index = d->m_points.indexOf(point); |
|
247 | 270 | if(index==-1) return; |
|
248 | 271 | d->m_points.remove(index); |
|
249 | // emit d->pointRemoved(index); | |
|
250 | 272 | emit pointRemoved(index); |
|
251 | 273 | } |
|
252 | 274 | |
@@ -257,7 +279,6 void QXYSeries::insert(int index, const QPointF &point) | |||
|
257 | 279 | { |
|
258 | 280 | Q_D(QXYSeries); |
|
259 | 281 | d->m_points.insert(index, point); |
|
260 | // emit d->pointAdded(index); | |
|
261 | 282 | emit pointAdded(index); |
|
262 | 283 | } |
|
263 | 284 |
@@ -72,12 +72,15 public: | |||
|
72 | 72 | void setPointsVisible(bool visible = true); |
|
73 | 73 | bool pointsVisible() const; |
|
74 | 74 | |
|
75 | void replace(QList<QPointF> points); | |
|
76 | ||
|
75 | 77 | Q_SIGNALS: |
|
76 | 78 | void clicked(const QPointF &point); |
|
77 | 79 | void pointReplaced(int index); |
|
78 | 80 | void pointRemoved(int index); |
|
79 | 81 | void pointAdded(int index); |
|
80 | 82 | void colorChanged(QColor color); |
|
83 | void pointsReplaced(); | |
|
81 | 84 | |
|
82 | 85 | private: |
|
83 | 86 | Q_DECLARE_PRIVATE(QXYSeries) |
@@ -42,6 +42,7 m_animation(0), | |||
|
42 | 42 | m_dirty(true) |
|
43 | 43 | { |
|
44 | 44 | QObject::connect(series, SIGNAL(pointReplaced(int)), this, SLOT(handlePointReplaced(int))); |
|
45 | QObject::connect(series, SIGNAL(pointsReplaced()), this, SLOT(handlePointsReplaced())); | |
|
45 | 46 | QObject::connect(series, SIGNAL(pointAdded(int)), this, SLOT(handlePointAdded(int))); |
|
46 | 47 | QObject::connect(series, SIGNAL(pointRemoved(int)), this, SLOT(handlePointRemoved(int))); |
|
47 | 48 | QObject::connect(this, SIGNAL(clicked(QPointF)), series, SIGNAL(clicked(QPointF))); |
@@ -182,6 +183,13 void XYChart::handlePointReplaced(int index) | |||
|
182 | 183 | updateChart(m_points,points,index); |
|
183 | 184 | } |
|
184 | 185 | |
|
186 | void XYChart::handlePointsReplaced() | |
|
187 | { | |
|
188 | // All the points were replaced -> recalculate | |
|
189 | QVector<QPointF> points = calculateGeometryPoints(); | |
|
190 | updateChart(m_points, points, -1); | |
|
191 | } | |
|
192 | ||
|
185 | 193 | void XYChart::handleDomainUpdated() |
|
186 | 194 | { |
|
187 | 195 | m_minX=domain()->minX(); |
@@ -68,6 +68,7 public Q_SLOTS: | |||
|
68 | 68 | void handlePointAdded(int index); |
|
69 | 69 | void handlePointRemoved(int index); |
|
70 | 70 | void handlePointReplaced(int index); |
|
71 | void handlePointsReplaced(); | |
|
71 | 72 | void handleDomainUpdated(); |
|
72 | 73 | void handleGeometryChanged(const QRectF &size); |
|
73 | 74 |
@@ -254,27 +254,37 void tst_QXYSeries::replace_raw_data() | |||
|
254 | 254 | void tst_QXYSeries::replace_raw() |
|
255 | 255 | { |
|
256 | 256 | QFETCH(QList<QPointF>, points); |
|
257 |
QSignalSpy |
|
|
257 | QSignalSpy pointReplacedSpy(m_series, SIGNAL(pointReplaced(int))); | |
|
258 | QSignalSpy pointsReplacedSpy(m_series, SIGNAL(pointsReplaced())); | |
|
258 | 259 | m_series->append(points); |
|
259 |
TRY_COMPARE( |
|
|
260 | TRY_COMPARE(pointReplacedSpy.count(), 0); | |
|
261 | TRY_COMPARE(pointsReplacedSpy.count(), 0); | |
|
260 | 262 | QCOMPARE(m_series->points(), points); |
|
261 | 263 | |
|
262 | 264 | foreach(const QPointF& point, points) |
|
263 | 265 | m_series->replace(point.x(),point.y(),point.x(),0); |
|
264 |
TRY_COMPARE( |
|
|
266 | TRY_COMPARE(pointReplacedSpy.count(), points.count()); | |
|
267 | TRY_COMPARE(pointsReplacedSpy.count(), 0); | |
|
265 | 268 | |
|
266 | 269 | // Replace a point that does not exist |
|
267 | 270 | m_series->replace(-123, 999, 0, 0); |
|
268 |
TRY_COMPARE( |
|
|
271 | TRY_COMPARE(pointReplacedSpy.count(), points.count()); | |
|
272 | TRY_COMPARE(pointsReplacedSpy.count(), 0); | |
|
269 | 273 | |
|
270 | 274 | QList<QPointF> newPoints = m_series->points(); |
|
271 | ||
|
272 | 275 | QCOMPARE(newPoints.count(), points.count()); |
|
273 | ||
|
274 | 276 | for(int i =0 ; i<points.count() ; ++i) { |
|
275 | 277 | QCOMPARE(points[i].x(), newPoints[i].x()); |
|
276 | 278 | QCOMPARE(newPoints[i].y(), 0.0); |
|
277 | 279 | } |
|
280 | ||
|
281 | // Replace all points | |
|
282 | QList<QPointF> allPoints; | |
|
283 | for (int i = 0; i < 10; i++) | |
|
284 | allPoints.append(QPointF(i, (qreal) rand() / (qreal) RAND_MAX)); | |
|
285 | m_series->replace(allPoints); | |
|
286 | TRY_COMPARE(pointReplacedSpy.count(), points.count()); | |
|
287 | TRY_COMPARE(pointsReplacedSpy.count(), 1); | |
|
278 | 288 | } |
|
279 | 289 | |
|
280 | 290 |
General Comments 0
You need to be logged in to leave comments.
Login now