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

 
 
 

52.Qt-Charts动态显示多条折线电压值(实现示波器效果)的更多相关文章

  1. 采用Qt快速绘制多条曲线(折线),跟随鼠标动态显示线上点的值(基于Qt的开源绘图控件QCustomPlot进行二次开发)

    QCustomPlot是一个开源的基于Qt的第三方绘图库,能够绘制漂亮的2D图形. QCustomPlot的官方网址:https://www.qcustomplot.com/ 从官网下载QCustom ...

  2. Qt 绘制图表 - Qt Charts版

    一.前言 自从 Qt 发布以来,给广大跨平台界面研发人员带来了无数的福利.但是Qt自己却一直没有提供自带的图表库,这就使得 QWT.QCustomPlot 等第三方图表库有了巨大的生存空间,为了降低开 ...

  3. Qt Charts

    简述 Qt Charts模块提供了一套易于使用的图表组件.它采用了Qt Graphics View框架,因此图表可以很容易地集成到现代的用户界面. Qt Charts可以被用作QWidgets.QGr ...

  4. Qt Charts示例

    Qt 5.7 有一些变化,把原来商业版的几个模块用GPLv3协议放到了社区版本里: Qt Charts (GPLv3) Qt Data Visualization (GPLv3) Qt Virtual ...

  5. [Swift通天遁地]三、手势与图表-(6)创建包含三条折线的线性图表

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. 详细介绍如何计算两条折线的交点并使用Echarts展示以及图表优化

    1.背景 前段时间公司有个需求,需要在一个图表中展示两条折线,并且绘制出两条线的交点.为了满足需求大哥的需求,我也是着实想了有一会.下面我就把具体的实现过程给大家展示一下. 1.1.ECharts 简 ...

  7. 学习Qt Charts - Qt Charts的坐标轴

    这次来学学Qt chart 的坐标轴 有这么一组数据: 这是深圳市2019年6月份的天气预报(来自中国天气网:深圳),里面有每天的最高温度,把这最高温度做成个数组,如下: int daily_temp ...

  8. Qt Charts的简单安装与使用

    http://blog.qt.io/blog/2016/01/18/qt-charts-2-1-0-release/ 下载地址: https://codereview.qt-project.org/# ...

  9. 关于C#chart图表实现多条折线动态绑定数据的问题

    之前就已经实现了多条折线绑定数据并显示,但不是动态绑定,而是每一条数据都要进行一次绑定,个人觉得在解决实际问题时,这样的解决方法过于笨重且缺乏扩展性,这次主要是对代码进行优化,实现写一遍代码,无论数据 ...

随机推荐

  1. Zabbix housekeeper processes more than 75% busy

    原因分析 为了防止数据库持续增大,Zabbix有自动删除历史数据的机制,即housekeeper,而在频繁清理历史数据的时候,MySQL数据库可能出现性能降低的情况,此时就会告警. 一般来说,Zabb ...

  2. 非构造函数方式创建DbContext实例的方法

    using Microsoft.EntityFrameworkCore;using Microsoft.EntityFrameworkCore.Design;using Microsoft.Entit ...

  3. 使用java.io.RandomAccessFile更改文本文件的内容

    原文本内容: 2020-01-21 08:31:08.520 [main] INFO logbackCfg.App -秦时明月汉时关 2020-01-21 08:31:08.521 [main] ER ...

  4. 转载:51cto 2019好文精选

    转载地址:https://news.51cto.com/art/202001/609544.htm 01.知识科普 傻瓜都能看懂,30张图彻底理解红黑树! TCP三次握手,四次挥手,你真的懂吗? 面试 ...

  5. Linux:nginx基础

    一..简单介绍 nginx时开源的www服务器,只能解析静态的网页(html,js,css等),具有静态小文件高并发特性. 可做web服务器.负载均衡.web cache(web缓存) 优点: 1.高 ...

  6. centos7安装PHP7的redis扩展

    前言: 在本篇博客中,我将给大家介绍如何在Centos7上安装PHP-Redis扩展,关于如何在Centos上安装redis的,可以参考另外一篇博客:Centos7安装redis 想要在php中操作r ...

  7. 将HBase中的表加载到hive中

    两种方式加载hbase中的表到hive中,一是hive创建外部表关联hbase表数据,二是hive创建普通表将hbase的数据加载到本地 1. 创建外部表 hbase中已经有了一个test表,内容如下 ...

  8. ES6重度学习 demo实例

    let 与 const // 并非真正的常量 // const 的本质: const 定义的变量并非常量,并非不可变, // 它定义了一个常量引用一个值.使用 const 定义的对象或者数组,其实是可 ...

  9. Android开发中导入第三方库所遇问题记录

    1.重复循环依赖的问题 (1)需求 如下图所示: 在Android 项目中,采用模块化开发,一个是主跑application--Mudule A,另外一个是library--Library B 1)M ...

  10. 浅析Kubernrtes服务类型(Service Types)

    先上图 在Kubernetes集群中,service通过标签选择器选着对应的pod,然后对请求进行转发,看个动画,能直接了当体会到便签选择器 pod,endpoints,service三者关系 1.举 ...