main.cpp 范例文件

openglseries/main.cpp
/**************************************************************************** ** ** 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 = new QChart(); chart->legend()->hide(); #ifdef USE_LOG_AXIS QLogValueAxis *axisX = new QLogValueAxis; QLogValueAxis *axisY = new QLogValueAxis; #else QValueAxis *axisX = new QValueAxis; QValueAxis *axisY = new QValueAxis; #endif chart->addAxis(axisX, Qt::AlignBottom); chart->addAxis(axisY, Qt::AlignLeft); const int seriesCount = 10; #ifdef DONT_USE_GL_SERIES const int pointCount = 100; chart->setTitle("Unaccelerated Series"); #else const int pointCount = 10000; chart->setTitle("OpenGL Accelerated Series"); #endif QList<QXYSeries *> seriesList; for (int i = 0; i < seriesCount; i++) { QXYSeries *series = 0; int colorIndex = i % colors.size(); if (i % 2) { series = new QScatterSeries; 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 = new QLineSeries; 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_SERIES QLineSeries *simpleRasterSeries = new QLineSeries; *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 = new QLineSeries; simpleGLSeries->setUseOpenGL(true); simpleGLSeries->setPen(QPen(QBrush("black"), 2)); simpleGLSeries->replace(simpleRasterSeries->points()); chart->addSeries(simpleGLSeries); simpleGLSeries->attachAxis(axisX); simpleGLSeries->attachAxis(axisY); #endif QChartView *chartView = new QChartView(chart); QMainWindow window; window.setCentralWidget(chartView); window.resize(600, 400); window.show(); DataSource dataSource; dataSource.generateData(seriesCount, 10, pointCount); QLabel *fpsLabel = new QLabel(&window); QLabel *countLabel = new QLabel(&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(); }