/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Charts module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "datasource.h"#include <QtWidgets/QApplication>#include <QtWidgets/QMainWindow>#include <QtCharts/QChartView>#include <QtCharts/QLineSeries>#include <QtCharts/QScatterSeries>#include <QtCharts/QValueAxis>#include <QtCharts/QLogValueAxis>#include <QtWidgets/QLabel>// Uncomment to use logarithmic axes instead of regular value axes//#define USE_LOG_AXIS// Uncomment to use regular series instead of OpenGL accelerated series//#define DONT_USE_GL_SERIES// Uncomment to add a simple regular series (thick line) and a matching OpenGL series (thinner line)// to verify the series have same visible geometry.//#define ADD_SIMPLE_SERIES
QT_CHARTS_USE_NAMESPACE
int main(int argc,char*argv[])
{
QApplication a(argc, argv);
QStringList colors;
colors <<"red"<<"blue"<<"green"<<"black";
QChart*chart =newQChart();
chart->legend()->hide();
#ifdef USE_LOG_AXISQLogValueAxis*axisX =newQLogValueAxis;
QLogValueAxis*axisY =newQLogValueAxis;
#elseQValueAxis*axisX =newQValueAxis;
QValueAxis*axisY =newQValueAxis;
#endif
chart->addAxis(axisX,Qt::AlignBottom);
chart->addAxis(axisY,Qt::AlignLeft);
constint seriesCount =10;
#ifdef DONT_USE_GL_SERIESconstint pointCount =100;
chart->setTitle("Unaccelerated Series");
#elseconstint pointCount =10000;
chart->setTitle("OpenGL Accelerated Series");
#endifQList<QXYSeries*> seriesList;
for (int i =0; i < seriesCount; i++) {
QXYSeries*series =0;
int colorIndex = i % colors.size();
if (i %2) {
series =newQScatterSeries;
QScatterSeries*scatter =static_cast<QScatterSeries*>(series);
scatter->setColor(QColor(colors.at(colorIndex)));
scatter->setMarkerSize(qreal(colorIndex +2) /2.0);
// Scatter pen doesn't have affect in OpenGL drawing, but if you disable OpenGL drawing// this makes the marker border visible and gives comparable marker size to OpenGL// scatter points.
scatter->setPen(QPen("black"));
} else {
series =newQLineSeries;
series->setPen(QPen(QBrush(QColor(colors.at(colorIndex))),qreal(colorIndex +2) /2.0));
}
seriesList.append(series);
#ifdef DONT_USE_GL_SERIES
series->setUseOpenGL(false);
#else
series->setUseOpenGL(true);
#endif
chart->addSeries(series);
series->attachAxis(axisX);
series->attachAxis(axisY);
}
if (axisX->type() ==QAbstractAxis::AxisTypeLogValue)
axisX->setRange(0.1,20.0);
else
axisX->setRange(0,20.0);
if (axisY->type() ==QAbstractAxis::AxisTypeLogValue)
axisY->setRange(0.1,10.0);
else
axisY->setRange(0,10.0);
#ifdef ADD_SIMPLE_SERIESQLineSeries*simpleRasterSeries =newQLineSeries;
*simpleRasterSeries <<QPointF(0.001,0.001)
<<QPointF(2.5,8.0)
<<QPointF(5.0,4.0)
<<QPointF(7.5,9.0)
<<QPointF(10.0,0.001)
<<QPointF(12.5,2.0)
<<QPointF(15.0,1.0)
<<QPointF(17.5,6.0)
<<QPointF(20.0,10.0);
simpleRasterSeries->setUseOpenGL(false);
simpleRasterSeries->setPen(QPen(QBrush("magenta"),8));
chart->addSeries(simpleRasterSeries);
simpleRasterSeries->attachAxis(axisX);
simpleRasterSeries->attachAxis(axisY);
QLineSeries*simpleGLSeries =newQLineSeries;
simpleGLSeries->setUseOpenGL(true);
simpleGLSeries->setPen(QPen(QBrush("black"),2));
simpleGLSeries->replace(simpleRasterSeries->points());
chart->addSeries(simpleGLSeries);
simpleGLSeries->attachAxis(axisX);
simpleGLSeries->attachAxis(axisY);
#endifQChartView*chartView =newQChartView(chart);
QMainWindow window;
window.setCentralWidget(chartView);
window.resize(600,400);
window.show();
DataSource dataSource;
dataSource.generateData(seriesCount,10, pointCount);
QLabel*fpsLabel =newQLabel(&window);
QLabel*countLabel =newQLabel(&window);
QString countText =QStringLiteral("Total point count: %1");
countLabel->setText(countText.arg(pointCount * seriesCount));
countLabel->adjustSize();
fpsLabel->move(10,2);
fpsLabel->adjustSize();
fpsLabel->raise();
fpsLabel->show();
countLabel->move(10, fpsLabel->height());
fpsLabel->raise();
countLabel->show();
// We can get more than one changed event per frame, so do async update.// This also allows the application to be responsive.QObject::connect(chart->scene(),&QGraphicsScene::changed,&dataSource,&DataSource::handleSceneChanged);
dataSource.startUpdates(seriesList, fpsLabel);
return a.exec();
}