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

  •  若沒有積分,可以加入 Qt | QML | C++技術交流群(779866667) 免費獲取所有文章的demo資源哦~,並且還有許多入門資料

 

 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM