• 52.Qt-Charts动态显示多条折线电压值(实现示波器效果)


    Qt 5.7过后Qt添加了官方的Chart库,之前就用的比较习惯,这次把源码发出来,给入门的同学们参考参考.

    效果如下所示:

     

    1.chartsView.h如下所示:

    #ifndef VIEW_H
    #define VIEW_H
    #include <QtWidgets/QGraphicsView>
    #include <QtCharts/QChartGlobal>
    #include <QLineSeries>
    #include <QValueAxis>
    #include <QDateTime>
    #include <QSplineSeries>
    QT_BEGIN_NAMESPACE
    class QGraphicsScene;
    class QMouseEvent;
    class QResizeEvent;
    QT_END_NAMESPACE
    
    QT_CHARTS_BEGIN_NAMESPACE
    class QChart;
    QT_CHARTS_END_NAMESPACE
    class Callout;
    QT_CHARTS_USE_NAMESPACE
    
    class ChartsView: public QGraphicsView
    {
        Q_OBJECT
        qint64    MSecBase;
    
     
    public:
        ChartsView(int YRange, QWidget *parent = 0);
        QLineSeries series[3];
        void initLineSeries(int YRange);
        void initMSecBase(int YRange);            //初始化MSecBase,以MSecBase为开头
        void clearMSecBase();                    //清0,从头开始
        void addLineSeries(int i,float value);              //添加value值到第几个线上面
        void addLineSeries(int i,float s,float value);       //添加s时间和value值到第几个线上面
        void setShowLine(int flag);           //0~2:显示某个曲线  否则的话显示所有曲线
    
    
    protected:
        void resizeEvent(QResizeEvent *event);
        void mouseMoveEvent(QMouseEvent *event);
    
    public slots:
    
    private:
        QGraphicsSimpleTextItem *m_Line[3];
        QGraphicsSimpleTextItem *m_coordX;
        QGraphicsSimpleTextItem *m_coordY;
        QChart *m_chart;
        QValueAxis *axisX;
        QValueAxis *axisY;
    
    signals:
         void mouseMoveisChange(QPointF point);
    };
    
    #endif

    2.chartsView.cpp如下所示:

    #include <QDebug>
    #include "ChartsView.h"
    #include <QtGui/QResizeEvent>
    #include <QtWidgets/QGraphicsScene>
    #include <QtCharts/QChart>
    #include <QtCharts/QLineSeries>
    #include <QtCharts/QSplineSeries>
    #include <QtWidgets/QGraphicsTextItem>
    #include <QtGui/QMouseEvent>
    #include <QValueAxis>
     
    #define X_Width     5           //宽度5S
     
    ChartsView::ChartsView(int YRange, QWidget *parent)
        : QGraphicsView(new QGraphicsScene, parent),
          m_coordX(0),
          m_coordY(0),
          m_chart(0)
    {
     
        setDragMode(QGraphicsView::NoDrag);
        setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
        setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
     
        m_chart = new QChart;
     
        initLineSeries( YRange);
     
     
        m_chart->setAcceptHoverEvents(true);
     
        setRenderHint(QPainter::Antialiasing);
        scene()->addItem(m_chart);
     
     
        m_coordX = new QGraphicsSimpleTextItem(m_chart);
        m_coordX->setPos(m_chart->size().width()/2 + 100, m_chart->size().height());
        m_coordX->setText("");
        m_coordX->setPen(QColor(20,164,226));
        m_coordY = new QGraphicsSimpleTextItem(m_chart);
        m_coordY->setPos(m_chart->size().width()/2 - 50, m_chart->size().height());
        m_coordY->setText("");
        m_coordY->setPen(QColor(226,20,216));
     
     
        this->setMouseTracking(true);
     
     
        MSecBase = QDateTime::currentDateTime().toMSecsSinceEpoch();
    }
     
    void ChartsView::initLineSeries(int YRange)
    {
        QColor colors[3] = {QColor(20,164,226),QColor(36,20,226),QColor(226,20,216)};
     
        //创建X轴和Y轴
        axisX = new QValueAxis;
        axisX->setLabelFormat("%ds");
        axisX->setTickCount(X_Width);     //定义X有多少个表格
        axisX->setRange(0,X_Width);
     
        axisY = new QValueAxis;
        axisY->setRange(-YRange,YRange);
        axisY->setTitleText("纹波值");
        axisY->setTickCount(9);     //定义Y有多少个表格
     
        for(int i =0; i<3;i++)
        {
            series[i].setColor(colors[i]);
            series[i].setName(QString("测值%1").arg(i));
     
            series[i].setVisible(true);
     
            m_chart->addSeries(&series[i]);
            m_chart->setAxisX(axisX,&series[i]);
            m_chart->setAxisY(axisY,&series[i]);
     
            m_Line[i] = new QGraphicsSimpleTextItem(m_chart);
            m_Line[i]->setPos(34+i*40, m_chart->size().height()- 20);
            m_Line[i]->setText(QString("测值%1").arg(i));
            m_Line[i]->setPen(colors[i]);
        }
     
        //设置底部
        m_chart->legend()->setVisible(false);
     
    }
    void ChartsView::initMSecBase(int YRange)           //初始化MSecBase,以MSecBase为开头
    {
        axisX->setMin(0);
        axisX->setMax(X_Width);
     
        axisY->setMin(-YRange);
        axisY->setMax(YRange);
     
        for(int i=0;i<3;i++)
        {
            series[i].clear();
            series[i].clear();
            series[i].append(QPointF(0,0));
        }
     
        MSecBase = QDateTime::currentDateTime().toMSecsSinceEpoch();
    }
     
    void ChartsView::clearMSecBase()
    {
        MSecBase = QDateTime::currentDateTime().toMSecsSinceEpoch();
    }
     
    void ChartsView::setShowLine(int flag)           //0~2:显示某个曲线  否则的话显示所有曲线
    {
        for(int i=0;i<3;i++)
        {
            if(flag>=0&&flag<=2)
            {
                if(flag==i)
                     series[i].show();
                else
                     series[i].hide();
            }
            else
                series[i].show();
        }
     
    }
     
    void ChartsView::addLineSeries(int i,float value)
    {
       float currentS =(QDateTime::currentDateTime().toMSecsSinceEpoch() - MSecBase)/1000.0;   //1s=1000MS
       if(i>=3)    return;
     
       if(currentS>=axisX->max())
       {
            axisX->setMin(currentS-X_Width);
            axisX->setMax(currentS);
     
       }
       if(value>=qMax(qAbs(axisY->max()),qAbs(axisY->min())))
       {
            axisY->setMin(-value*1.1);
            axisY->setMax(value*1.1);
       }
     
       //定时清除以前不要的曲线数据
       if(series[i].count()>600)
       {
           series[i].removePoints(0,series[i].count()/2);
       }
       series[i].append(QPointF(currentS,value));
    }
     
     
    void ChartsView::addLineSeries(int i,float s,float value)
    {
        if(s>=axisX->max())
        {
             axisX->setMin(s-X_Width);
             axisX->setMax(s);
        }
        if(value>=qMax(qAbs(axisY->max()),qAbs(axisY->min())))
        {
             axisY->setMin(-value*1.1);
             axisY->setMax(value*1.1);
        }
     
        series[i].append(QPointF(s,value)) ;
    }
     
     
    void ChartsView::resizeEvent(QResizeEvent *event)
    {
        if (scene()) {
            scene()->setSceneRect(QRect(QPoint(0, 0), event->size()));
             m_chart->resize(event->size());
             m_coordX->setPos(m_chart->size().width()/2 + 100, m_chart->size().height() - 20);
             m_coordY->setPos(m_chart->size().width()/2 - 50, m_chart->size().height() - 20);
     
             for(int i=0;i<3;i++)
             {
                 m_Line[i]->setPos(34+i*40, m_chart->size().height()- 20);
                 m_Line[i]->setText(QString("测值%1").arg(i));
             }
        }
        QGraphicsView::resizeEvent(event);
    }
     
    void ChartsView::mouseMoveEvent(QMouseEvent *event)
    {
        m_coordX->setText(QString("值:%1mV").arg(QString::asprintf("%.2f",m_chart->mapToValue(event->pos()).y())));
        m_coordY->setText(QString("时间:%1S").arg(QString::asprintf("%.2f",m_chart->mapToValue(event->pos()).x())));
     
     
        emit mouseMoveisChange(QPointF(m_chart->mapToValue(event->pos()).x(),m_chart->mapToValue(event->pos()).y()));
     
        QGraphicsView::mouseMoveEvent(event);
    }

     具体项目下载地址:https://download.csdn.net/download/qq_37997682/12080685

     
     
     
  • 相关阅读:
    HashMap深度解析(二)(转)
    HashMap深度解析(一)(转)
    GeoHash核心原理解析(转)
    spring boot 策略模式实践
    Java中CAS详解(转)
    springMVC请求流程详解(转)
    7 vi 编辑器
    Linux 命令行快捷键
    Java
    3 Eclipse 查看不了源码
  • 原文地址:https://www.cnblogs.com/lifexy/p/12150400.html
Copyright © 2020-2023  润新知