Qt QChart,利用QChart绘制动态曲线
2017年07月11日 20:18:27 wudroid 阅读数 21511
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/HiccupHiccup/article/details/74996618
这是一个简单的demo,在更新数据的时候我采用了官方中audio这个example的方式。
效果图

程序
-------------------------------------------------------------------------------------
运行环境 :
Qt Creator 4.2.1
Based on Qt 5.8.0 (MSVC 2015, 32 bit)
--------------------------------------------------------------------------------------
QtChartsTest.pro
这个文件中唯一需要添加的是
QT += charts
其他可以不看
-
#------------------------------------------------- -
# -
# Project created by QtCreator 2017-07-11T10:12:57 -
# -
#------------------------------------------------- -
QT += core gui -
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets -
TARGET = QtChartsTest -
TEMPLATE = app -
# The following define makes your compiler emit warnings if you use -
# any feature of Qt which as been marked as deprecated (the exact warnings -
# depend on your compiler). Please consult the documentation of the -
# deprecated API in order to know how to port your code away from it. -
DEFINES += QT_DEPRECATED_WARNINGS -
# You can also make your code fail to compile if you use deprecated APIs. -
# In order to do so, uncomment the following line. -
# You can also select to disable deprecated APIs only up to a certain version of Qt. -
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 -
SOURCES += main.cpp\ -
mainwindow.cpp -
HEADERS += mainwindow.h -
FORMS += mainwindow.ui -
QT += charts
mainwindow.h
这个文件声明了一个定时器的槽和一个获得数据的方法
-
#ifndef MAINWINDOW_H -
#define MAINWINDOW_H -
#include <QMainWindow> -
namespace Ui { -
class MainWindow; -
} -
class MainWindow : public QMainWindow -
{ -
Q_OBJECT -
public: -
explicit MainWindow(QWidget *parent = 0); -
~MainWindow(); -
protected: -
void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE; -
private: -
Ui::MainWindow *ui; -
double getData(double time); -
}; -
#endif // MAINWINDOW_H
mainwindow.cpp
主程序中配置好Qchart,QLineSeries是用来存放数据。更新的工作放在定时器的槽中。其中
m_series->setUseOpenGL(true);//openGl 加速
采用openGL加速,绘图速度加快
-
#include "mainwindow.h" -
#include "ui_mainwindow.h" -
#include "QtCharts/QChart" -
#include "QLineSeries" -
#include "QValueAxis" -
#include "QTimer" -
#include "QTime" -
#include "QList" -
#include "qmath.h" -
#include "QPointF" -
#include "QDebug" -
//#include <QtCharts/QChartGlobal> -
#include "QChartView" -
QT_CHARTS_USE_NAMESPACE -
QChart *m_chart; -
QLineSeries *m_series; -
//QList<double> dataList;//存储业务数据 -
int maxSize = 5000; -
//QTimer updateTimer; -
int timeId; -
MainWindow::MainWindow(QWidget *parent) : -
QMainWindow(parent),//默认初始化? -
ui(new Ui::MainWindow) -
{ -
ui->setupUi(this); -
m_chart = new QChart; -
QChartView *chartView = new QChartView(m_chart); -
// v.setRubberBand(QChartView::HorizontalRubberBand); -
chartView->setRubberBand(QChartView::RectangleRubberBand); -
// chartView->setRubberBand(); -
m_series = new QLineSeries; -
m_chart->addSeries(m_series); -
for(int i=0;i<maxSize;++i){ -
m_series->append(i,0); -
} -
m_series->setUseOpenGL(true);//openGl 加速 -
qDebug()<<m_series->useOpenGL(); -
QValueAxis *axisX = new QValueAxis; -
axisX->setRange(0,maxSize); -
axisX->setLabelFormat("%g"); -
axisX->setTitleText("axisX"); -
QValueAxis *axisY = new QValueAxis; -
axisY->setRange(-1.5,1.5); -
axisY->setTitleText("axisY"); -
m_chart->setAxisX(axisX,m_series); -
m_chart->setAxisY(axisY,m_series); -
m_chart->legend()->hide(); -
m_chart->setTitle("demo"); -
QVBoxLayout *layout = ui->verticalLayout; -
layout->addWidget(chartView); -
timeId = startTimer(30); -
} -
double MainWindow::getData(double time){ -
double s = qCos( time * M_PI * 2 ) ; -
return s; -
} -
void MainWindow::timerEvent(QTimerEvent *event){ -
if(event->timerId()==timeId){//定时器到时间,//模拟数据填充 -
static QTime dataTime(QTime::currentTime()); -
long int eltime = dataTime.elapsed(); -
static int lastpointtime = 0; -
int size = (eltime - lastpointtime);//数据个数 -
qDebug()<<"size-->"<<size; -
if(isVisible()){ -
QVector<QPointF> oldPoints = m_series->pointsVector();//Returns the points in the series as a vector -
QVector<QPointF> points; -
for(int i=size;i<oldPoints.count();++i){ -
points.append(QPointF(i-size ,oldPoints.at(i).y()));//替换数据用 -
} -
qint64 sizePoints = points.count(); -
for(int k=0;k<size;++k){ -
points.append(QPointF(k+sizePoints,getData((((double)lastpointtime+k+1)/1000)))); -
} -
m_series->replace(points); -
lastpointtime = eltime; -
} -
} -
} -
MainWindow::~MainWindow() -
{ -
delete ui; -
}
main.cpp
没什么好说的
-
#include "mainwindow.h" -
#include <QApplication> -
int main(int argc, char *argv[]) -
{ -
QApplication a(argc, argv); -
MainWindow w; -
w.show(); -
return a.exec(); -
}
mainwindow.ui
这个里自己放一个vertical Layout
这只是我根据别人的程序写的简单demo,有问题欢迎讨论。
demo文件:
链接:http://pan.baidu.com/s/1cKXtIQ 密码:5sm2
9637

被折叠的 条评论
为什么被折叠?



