Qt繪製動態曲線
阿新 • • 發佈:2018-12-01
首先*.pro檔案中加一句
QT += charts
然後
mainwindow.cpp檔案如下:
#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;
int tem=0,flag=0;
//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);//線上連續類附加座標x&y
}
m_series->setUseOpenGL(true);//openGl 加速
qDebug()<<m_series->useOpenGL();
QValueAxis *axisX = new QValueAxis;//數值軸類
axisX->setRange(0,maxSize);//設定X座標的範圍
axisX->setLabelFormat("%g");//設定標籤格式
axisX->setTitleText("axisX");//設定X座標的標題名稱
QValueAxis *axisY = new QValueAxis;
axisY->setRange(0,2000);//設定Y座標的範圍 可以設定負數
axisY->setTitleText("axisY");//設定Y座標的標題名稱
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(0);//感覺像是重新整理頻率的延時。 定義了timeId整型變數作為重新整理的定時器變數。
}
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()));//替換資料用
}
if(tem < 1000 && flag == 0)
{
tem+=10;
if(tem>=999)
flag=1;
}
if(tem >0 && flag==1)
{
tem-=10;
if(tem<=0)
flag=0;
}
qint64 sizePoints = points.count();
for(int k=0;k<size;++k){
//points.append(QPointF(k+sizePoints,1.2*getData((((double)lastpointtime+k+1)/1000))));
points.append(QPointF(k+sizePoints,tem));
}
m_series->replace(points);//替換以前的點
lastpointtime = eltime;//消逝的時間複製給最後一點的時間。
}
}
}
MainWindow::~MainWindow()
{
delete ui;
}
然後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
在此作者的基礎上做了一些備註與修改:
https://blog.csdn.net/HiccupHiccup/article/details/74996618