diff options
Diffstat (limited to 'examples/charts/qmloscilloscope')
9 files changed, 539 insertions, 0 deletions
diff --git a/examples/charts/qmloscilloscope/datasource.cpp b/examples/charts/qmloscilloscope/datasource.cpp new file mode 100644 index 00000000..ff651110 --- /dev/null +++ b/examples/charts/qmloscilloscope/datasource.cpp @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the Qt Enterprise Charts Add-on. +** +** $QT_BEGIN_LICENSE$ +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "datasource.h" +#include <QXYSeries> +#include <QAreaSeries> +#include <QtQuick/QQuickView> +#include <QtQuick/QQuickItem> +#include <QDebug> +#include <qmath.h> + +QT_CHARTS_USE_NAMESPACE + +Q_DECLARE_METATYPE(QAbstractSeries *) +Q_DECLARE_METATYPE(QAbstractAxis *) + +DataSource::DataSource(QQuickView *appViewer, QObject *parent) : + QObject(parent), + m_appViewer(appViewer), + m_index(-1) +{ + qRegisterMetaType<QAbstractSeries*>(); + qRegisterMetaType<QAbstractAxis*>(); + + generateData(0, 5, 1024); +} + +void DataSource::update(QAbstractSeries *series) +{ + if (series) { + QXYSeries *xySeries = static_cast<QXYSeries *>(series); + m_index++; + if (m_index > m_data.count() - 1) + m_index = 0; + + QList<QPointF> points = m_data.at(m_index); + // Use replace instead of clear + append, it's optimized for performance + xySeries->replace(points); + } +} + +void DataSource::generateData(int type, int rowCount, int colCount) +{ + // Remove previous data + foreach (QList<QPointF> row, m_data) + row.clear(); + m_data.clear(); + + // Append the new data depending on the type + for (int i(0); i < rowCount; i++) { + QList<QPointF> points; + for (int j(0); j < colCount; j++) { + qreal x(0); + qreal y(0); + switch (type) { + case 0: + // data with sin + random component + y = qSin(3.14159265358979 / 50 * j) + 0.5 + (qreal) rand() / (qreal) RAND_MAX; + x = j; + break; + case 1: + // linear data + x = j; + y = (qreal) i / 10; + break; + default: + // unknown, do nothing + break; + } + points.append(QPointF(x, y)); + } + m_data.append(points); + } +} diff --git a/examples/charts/qmloscilloscope/datasource.h b/examples/charts/qmloscilloscope/datasource.h new file mode 100644 index 00000000..8cb8daa7 --- /dev/null +++ b/examples/charts/qmloscilloscope/datasource.h @@ -0,0 +1,49 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the Qt Enterprise Charts Add-on. +** +** $QT_BEGIN_LICENSE$ +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef DATASOURCE_H +#define DATASOURCE_H + +#include <QObject> +#include <QAbstractSeries> + +class QQuickView; + +QT_CHARTS_USE_NAMESPACE + +class DataSource : public QObject +{ + Q_OBJECT +public: + explicit DataSource(QQuickView *appViewer, QObject *parent = 0); + +signals: + +public slots: + void generateData(int type, int rowCount, int colCount); + void update(QAbstractSeries *series); + +private: + QQuickView *m_appViewer; + QList<QList<QPointF> > m_data; + int m_index; +}; + +#endif // DATASOURCE_H diff --git a/examples/charts/qmloscilloscope/main.cpp b/examples/charts/qmloscilloscope/main.cpp new file mode 100644 index 00000000..cb68260f --- /dev/null +++ b/examples/charts/qmloscilloscope/main.cpp @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the Qt Enterprise Charts Add-on. +** +** $QT_BEGIN_LICENSE$ +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtWidgets/QApplication> +#include <QtQml/QQmlContext> +#include <QtQuick/QQuickView> +#include <QtQml/QQmlEngine> +#include <QtCore/QDir> +#include "datasource.h" + +int main(int argc, char *argv[]) +{ + // Qt Charts uses Qt Graphics View Framework for drawing, therefore QApplication must be used. + QApplication app(argc, argv); + + QQuickView viewer; + + // The following are needed to make examples run without having to install the module + // in desktop environments. +#ifdef Q_OS_WIN + QString extraImportPath(QStringLiteral("%1/../../../../%2")); +#else + QString extraImportPath(QStringLiteral("%1/../../../%2")); +#endif + viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(), + QString::fromLatin1("qml"))); + QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close); + + viewer.setTitle(QStringLiteral("QML Oscilloscope")); + + DataSource dataSource(&viewer); + viewer.rootContext()->setContextProperty("dataSource", &dataSource); + + viewer.setSource(QUrl("qrc:/qml/qmloscilloscope/main.qml")); + viewer.setResizeMode(QQuickView::SizeRootObjectToView); + viewer.show(); + + return app.exec(); +} diff --git a/examples/charts/qmloscilloscope/qml/qmloscilloscope/ControlPanel.qml b/examples/charts/qmloscilloscope/qml/qmloscilloscope/ControlPanel.qml new file mode 100644 index 00000000..72b9b5df --- /dev/null +++ b/examples/charts/qmloscilloscope/qml/qmloscilloscope/ControlPanel.qml @@ -0,0 +1,88 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the Qt Enterprise Charts Add-on. +** +** $QT_BEGIN_LICENSE$ +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick.Layouts 1.0 + +ColumnLayout { + spacing: 8 + Layout.fillHeight: true + signal animationsEnabled(bool enabled) + signal seriesTypeChanged(string type) + signal refreshRateChanged(variant rate); + signal signalSourceChanged(string source, int signalCount, int sampleCount); + signal antialiasingEnabled(bool enabled) + + Text { + text: "Scope" + font.pointSize: 18 + color: "white" + } + + MultiButton { + text: "Graph: " + items: ["line", "spline", "scatter"] + currentSelection: 0 + onSelectionChanged: seriesTypeChanged(items[currentSelection]); + } + + MultiButton { + id: signalSourceButton + text: "Source: " + items: ["sin", "linear"] + currentSelection: 0 + onSelectionChanged: signalSourceChanged( + selection, + 5, + sampleCountButton.items[sampleCountButton.currentSelection]); + } + + MultiButton { + id: sampleCountButton + text: "Samples: " + items: [6, 128, 1024, 10000] + currentSelection: 2 + onSelectionChanged: signalSourceChanged( + signalSourceButton.items[signalSourceButton.currentSelection], + 5, + selection); + } + + MultiButton { + text: "Refresh rate: " + items: [1, 24, 60, 100] + currentSelection: 2 + onSelectionChanged: refreshRateChanged(items[currentSelection]); + } + + MultiButton { + text: "Animations: " + items: ["OFF", "ON"] + currentSelection: 0 + onSelectionChanged: animationsEnabled(currentSelection == 1); + } + + MultiButton { + text: "Antialias: " + items: ["OFF", "ON"] + currentSelection: 0 + onSelectionChanged: antialiasingEnabled(currentSelection == 1); + } +} diff --git a/examples/charts/qmloscilloscope/qml/qmloscilloscope/MultiButton.qml b/examples/charts/qmloscilloscope/qml/qmloscilloscope/MultiButton.qml new file mode 100644 index 00000000..8f6e1e1e --- /dev/null +++ b/examples/charts/qmloscilloscope/qml/qmloscilloscope/MultiButton.qml @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the Qt Enterprise Charts Add-on. +** +** $QT_BEGIN_LICENSE$ +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick.Controls 1.0 +import QtQuick.Controls.Styles 1.0 + +Item { + id: button + + property string text: "Option: " + property variant items: ["first"] + property int currentSelection: 0 + signal selectionChanged(variant selection) + + signal clicked + + implicitWidth: buttonText.implicitWidth + 5 + implicitHeight: buttonText.implicitHeight + 10 + + Button { + id: buttonText + width: parent.width + height: parent.height + + style: ButtonStyle { + label: Component { + Text { + text: button.text + button.items[currentSelection] + clip: true + wrapMode: Text.WordWrap + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + anchors.fill: parent + } + } + } + onClicked: { + currentSelection = (currentSelection + 1) % items.length; + selectionChanged(button.items[currentSelection]); + } + } +} diff --git a/examples/charts/qmloscilloscope/qml/qmloscilloscope/ScopeView.qml b/examples/charts/qmloscilloscope/qml/qmloscilloscope/ScopeView.qml new file mode 100644 index 00000000..d27bf0aa --- /dev/null +++ b/examples/charts/qmloscilloscope/qml/qmloscilloscope/ScopeView.qml @@ -0,0 +1,115 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the Qt Enterprise Charts Add-on. +** +** $QT_BEGIN_LICENSE$ +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import QtCharts 2.0 + +//![1] +ChartView { + id: chartView + animationOptions: ChartView.NoAnimation + theme: ChartView.ChartThemeDark + + ValueAxis { + id: axisY1 + min: -1 + max: 4 + } + + ValueAxis { + id: axisY2 + min: -10 + max: 5 + } + + ValueAxis { + id: axisX + min: 0 + max: 1000 + } + + LineSeries { + id: lineSeries1 + name: "signal 1" + axisX: axisX + axisY: axisY1 + } + LineSeries { + id: lineSeries2 + name: "signal 2" + axisX: axisX + axisYRight: axisY2 + } +//![1] + + //![2] + Timer { + id: refreshTimer + interval: 1 / 60 * 1000 // 60 Hz + running: true + repeat: true + onTriggered: { + dataSource.update(chartView.series(0)); + dataSource.update(chartView.series(1)); + } + } + //![2] + + //![3] + function changeSeriesType(type) { + chartView.removeAllSeries(); + + // Create two new series of the correct type. Axis x is the same for both of the series, + // but the series have their own y-axes to make it possible to control the y-offset + // of the "signal sources". + if (type == "line") { + chartView.createSeries(ChartView.SeriesTypeLine, "signal 1", axisX, axisY1); + chartView.createSeries(ChartView.SeriesTypeLine, "signal 2", axisX, axisY2); + } else if (type == "spline") { + chartView.createSeries(ChartView.SeriesTypeSpline, "signal 1", axisX, axisY1); + chartView.createSeries(ChartView.SeriesTypeSpline, "signal 2", axisX, axisY2); + } else { + var series1 = chartView.createSeries(ChartView.SeriesTypeScatter, "signal 1", axisX, axisY1); + series1.markerSize = 3; + series1.borderColor = "transparent"; + var series2 = chartView.createSeries(ChartView.SeriesTypeScatter, "signal 2", axisX, axisY2); + series2.markerSize = 3; + series2.borderColor = "transparent"; + } + } + + function createAxis(min, max) { + // The following creates a ValueAxis object that can be then set as a x or y axis for a series + return Qt.createQmlObject("import QtQuick 2.0; import QtCharts 2.0; ValueAxis { min: " + + min + "; max: " + max + " }", chartView); + } + //![3] + + function setAnimations(enabled) { + if (enabled) + chartView.animationOptions = ChartView.SeriesAnimations; + else + chartView.animationOptions = ChartView.NoAnimation; + } + + function changeRefreshRate(rate) { + refreshTimer.interval = 1 / Number(rate) * 1000; + } +} diff --git a/examples/charts/qmloscilloscope/qml/qmloscilloscope/main.qml b/examples/charts/qmloscilloscope/qml/qmloscilloscope/main.qml new file mode 100644 index 00000000..c88dfab3 --- /dev/null +++ b/examples/charts/qmloscilloscope/qml/qmloscilloscope/main.qml @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the Qt Enterprise Charts Add-on. +** +** $QT_BEGIN_LICENSE$ +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +//![1] +Rectangle { + id: main + width: 400 + height: 300 + color: "#404040" + + ControlPanel { + id: controlPanel + anchors.top: parent.top + anchors.topMargin: 10 + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.leftMargin: 10 +//![1] + + onSignalSourceChanged: { + if (source == "sin") + dataSource.generateData(0, signalCount, sampleCount); + else + dataSource.generateData(1, signalCount, sampleCount); + } + onAnimationsEnabled: scopeView.setAnimations(enabled); + onSeriesTypeChanged: scopeView.changeSeriesType(type); + onRefreshRateChanged: scopeView.changeRefreshRate(rate); + onAntialiasingEnabled: scopeView.antialiasing = enabled; + } + +//![2] + ScopeView { + id: scopeView + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: parent.right + anchors.left: controlPanel.right + height: main.height + } +//![2] +} diff --git a/examples/charts/qmloscilloscope/qmloscilloscope.pro b/examples/charts/qmloscilloscope/qmloscilloscope.pro new file mode 100644 index 00000000..a66fabcd --- /dev/null +++ b/examples/charts/qmloscilloscope/qmloscilloscope.pro @@ -0,0 +1,11 @@ +!include( ../examples.pri ) { + error( "Couldn't find the examples.pri file!" ) +} + +RESOURCES += resources.qrc +SOURCES += main.cpp \ + datasource.cpp +OTHER_FILES += qml/qmloscilloscope/* + +HEADERS += \ + datasource.h diff --git a/examples/charts/qmloscilloscope/resources.qrc b/examples/charts/qmloscilloscope/resources.qrc new file mode 100644 index 00000000..e2aadae8 --- /dev/null +++ b/examples/charts/qmloscilloscope/resources.qrc @@ -0,0 +1,8 @@ +<RCC> + <qresource prefix="/"> + <file>qml/qmloscilloscope/main.qml</file> + <file>qml/qmloscilloscope/ControlPanel.qml</file> + <file>qml/qmloscilloscope/ScopeView.qml</file> + <file>qml/qmloscilloscope/MultiButton.qml</file> + </qresource> +</RCC> |