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. 跟着尚硅谷系统学习Docker-【day08】

    day08-20200723   p32.docker 安装redis   [ docker pull redis] [docker run -p 6397:6397 -v /tmp/mydocker ...

  2. 两表连接各种Join图示,SQL及查询结果

    按:SQL术语Join在中文对应的翻译是“连接”还是“联结”说法不一,下文将统一采用“连接”的译法. 开局一张图: 前奏/准备工作: Emp表结构: create table emp( empid n ...

  3. 如何使用JSTL获取并显示数据

    首先在×××controller里查询数据,并绑定,代码如下: /** * 显示所有租借信息 默认进入这个方法 * * @param resp * @param req * @param manage ...

  4. A Funny Game(POJ 2484)

    原题如下: A Funny Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7108   Accepted: 446 ...

  5. [LeetCode] 139. 单词拆分(DP)

    题目 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可以重复使用字典中的单词. 你可以假设字典中没 ...

  6. NodeJS沙箱逃逸&&vm

    NodeJS沙箱逃逸 关于nodejs的沙箱 使用场景 在线代码编辑器 第三方js代码 jsonp,like百度搜索框 https://www.baidu.com/s?wd=nodejs&mi ...

  7. gRPC-Protocol基础知识-C#篇

    本文使用协议缓冲区语言的proto3版本,为C#程序员提供了使用协议缓冲区的基本介绍. 通过创建一个简单的示例应用程序,展示了如何 在.proto文件中定义消息格式. 使用协议缓冲区编译器. 使用C# ...

  8. 如何设置一个生产级别的高可用etcd集群

    在之前的文章中,我们详细介绍了K3s的架构以及部署场景,给尚未了解K3s的朋友提供了一个很好的入门方向.那么,在本文中我们将探索如何配置一个3节点的etcd集群,它将会被用于高可用.多节点的K3s集群 ...

  9. EasyUI 日期控件赋值

    $("#BillDateE").datebox("setValue", '2020/9/28'); $("#BillDateB").date ...

  10. eureka源码--服务的注册、服务续约、服务发现、服务下线、服务剔除、定时任务以及自定义注册中心的思路

    微服务注册后,在注册中心的注册表结构是一个map: ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>& ...