1. 程式人生 > >Qt第二十四天

Qt第二十四天

繪製動態曲線

#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




}