Qt第二十四天
阿新 • • 發佈:2018-12-30
繪製動態曲線
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QTimer> #include <QTime> #include <qwt_plot.h> #include <qwt_plot_curve.h> #include <qwt_legend.h> #include <math.h> #include <qwt_plot_zoomer.h> #include <qwt_plot_panner.h> #include <qwt_plot_magnifier.h> #include <qwt_plot_grid.h> #include <qwt_scale_draw.h> #include <qwt_plot_layout.h> #include <qwt_plot_canvas.h> #include <qwt_plot_renderer.h> #include <qwt_legend.h> #include <qwt_legend_label.h> #include <qwt_plot_grid.h> #include <qwt_plot_histogram.h> #include <qwt_column_symbol.h> #include <qwt_series_data.h> #include <qwt_plot_dict.h> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); void setupRealtimeDataDemo(QwtPlot *qwtplot);//設定動態圖 QVector<double> xdata;//提供動態陣列 QVector<double> ydata;//提供動態陣列 QTimer updateTimer;//時鐘,用於刷新曲線 QString demoName;//演示標題 QwtPlotCurve *curve ;//曲線 double getData(double inteval);//資料獲取函式 double getData1(double inteval); QVector<double> xdata2;//提供動態陣列 QVector<double> ydata2; QwtPlotCurve *curve2;//曲線2 private: Ui::MainWindow *ui; private slots: void updatedataSlot();//更新資料並顯示 void showItem( const QVariant &itemInfo, bool on ); }; #endif // MAINWINDOW_H
#include "mainwindow.h" #include "ui_mainwindow.h" #include <qwt_plot_item.h> #include <qwt_plot_dict.h> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); setupRealtimeDataDemo(ui->qwtPlot); } MainWindow::~MainWindow() { delete ui; } void MainWindow::setupRealtimeDataDemo(QwtPlot *qwtplot) { //初始化xdata,x對應長度為5的座標,y初始全為0 for(int i=1;i<5001;i++)//計算曲線資料 { xdata.append(double(i)/1000-5);//xdata新增元素 xdata2=xdata; ydata.append(0); ydata2=ydata; } demoName = "實時資料演示"; qwtplot->setTitle(demoName);//設定標題 qwtplot->setCanvasBackground(Qt::gray);//背景灰色 // qwtplot->insertLegend(legend1,QwtPlot::RightLegend);//新增圖例(標註) curve = new QwtPlotCurve();//new一個曲線 curve->setTitle("肌電訊號");//曲線名字 curve->setPen( Qt::yellow, 1 );//曲線的顏色黃色 寬度1; // curve->setLegendAttribute(curve->LegendShowLine);//指定一個屬性如何繪製圖例圖示,顯示圖例的標誌,這裡顯示線的顏色。 curve2 = new QwtPlotCurve();//new一個曲線 curve2->setTitle("另一個訊號");//曲線名字 curve2->setPen( Qt::green, 1 );//曲線的顏色綠色 寬度1; QTime curtime; curtime=curtime.currentTime(); qwtplot->setAxisTitle(QwtPlot::xBottom, " 系統執行時間");//設定軸標題 qwtplot->setAxisTitle(QwtPlot::yLeft,"肌電圖");//設定軸標題 qwtplot->setAxisScale(QwtPlot::yLeft,-5,5,0);//禁用自動縮放比例尺,為某個座標軸指定一個修改的比例尺 qwtplot->setAxisScale(QwtPlot::xBottom,-5,0,0);//禁用自動縮放比例尺,為某個座標軸指定一個修改的比例尺 QwtPlotZoomer *zoomer = new QwtPlotZoomer( qwtplot->canvas() );//可變焦距鏡頭 zoomer->setRubberBandPen( QColor( Qt::blue ) ); zoomer->setTrackerPen( QColor( Qt::black ) ); zoomer->setMousePattern(QwtEventPattern::MouseSelect2,Qt::RightButton, Qt::ControlModifier ); zoomer->setMousePattern(QwtEventPattern::MouseSelect3,Qt::RightButton ); QwtPlotMagnifier *magnifier = new QwtPlotMagnifier( qwtplot->canvas() );//使用滾輪放大/縮小 //預設的滑輪及右鍵縮放功能 圖形的整體縮放 //magnifier->setMouseButton(Qt::LeftButton); //設定哪個按鈕與滑輪為縮放畫布 如果不設定(註冊掉當前行)按鈕預設為滑輪以及右鍵為縮放 QwtPlotGrid *grid = new QwtPlotGrid();//new網格線 grid->enableX( true );//設定X網格線 grid->enableY( true ); grid->setMajorPen( Qt::black, 0, Qt::DotLine );//設定網格線性和顏色 grid->attach(qwtplot);//把曲線附加到QwlPlot上 connect(&updateTimer,SIGNAL(timeout()),this,SLOT(updatedataSlot()));//訊號和槽 updateTimer.start(0);//設定重新整理時間 QwtLegend *legend = new QwtLegend; legend->setDefaultItemMode( QwtLegendData::Checkable );//圖例可被點選 qwtplot->insertLegend( legend, QwtPlot::RightLegend );//圖例位置設計 connect( legend, &QwtLegend::checked,this,&MainWindow::showItem);//點選圖例顯示曲線 ui->qwtPlot->replot(); } void MainWindow::showItem( const QVariant &itemInfo, bool on )//顯示曲線 { QwtPlotItem *plotItem =ui->qwtPlot->infoToItem( itemInfo ); if ( plotItem ) plotItem->setVisible( on ); } /** * @brief getData * @param inteval * @return * 獲取一個值 模擬串列埠接收到的值 */ double MainWindow::getData(double time){ double s = qSin( time * M_PI * 2 )*3 ; return s; } double MainWindow::getData1(double inteval) { double s=qTan(inteval*M_PI*2); return s; } //用於更新ydata void MainWindow::updatedataSlot() { static QTime dataTime(QTime::currentTime()); long int eltime = dataTime.elapsed(); static int lastpointtime = 0; int size = (eltime - lastpointtime); if(size>0){//有資料傳入 ydata.erase(ydata.begin(),ydata.begin()+size);//擦除多餘的資料 ydata2.erase(ydata2.begin(),ydata2.begin()+size);//擦除多餘的資料 for(int i=1;i<size+1;i++){ ydata.append(getData((((double)lastpointtime+i)/1000))); ydata2.append(getData1((((double)lastpointtime+i)/1000))); } lastpointtime = eltime; } curve->setSamples(xdata,ydata);//設定曲線資料 curve2->setSamples(xdata2,ydata2); curve->attach(ui->qwtPlot);//把曲線附加到QwlPlot上 curve2->attach(ui->qwtPlot); ui->qwtPlot->replot();//重新整理qwt }