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
52.Qt-Charts动态显示多条折线电压值(实现示波器效果)的更多相关文章
- 采用Qt快速绘制多条曲线(折线),跟随鼠标动态显示线上点的值(基于Qt的开源绘图控件QCustomPlot进行二次开发)
QCustomPlot是一个开源的基于Qt的第三方绘图库,能够绘制漂亮的2D图形. QCustomPlot的官方网址:https://www.qcustomplot.com/ 从官网下载QCustom ...
- Qt 绘制图表 - Qt Charts版
一.前言 自从 Qt 发布以来,给广大跨平台界面研发人员带来了无数的福利.但是Qt自己却一直没有提供自带的图表库,这就使得 QWT.QCustomPlot 等第三方图表库有了巨大的生存空间,为了降低开 ...
- Qt Charts
简述 Qt Charts模块提供了一套易于使用的图表组件.它采用了Qt Graphics View框架,因此图表可以很容易地集成到现代的用户界面. Qt Charts可以被用作QWidgets.QGr ...
- Qt Charts示例
Qt 5.7 有一些变化,把原来商业版的几个模块用GPLv3协议放到了社区版本里: Qt Charts (GPLv3) Qt Data Visualization (GPLv3) Qt Virtual ...
- [Swift通天遁地]三、手势与图表-(6)创建包含三条折线的线性图表
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 详细介绍如何计算两条折线的交点并使用Echarts展示以及图表优化
1.背景 前段时间公司有个需求,需要在一个图表中展示两条折线,并且绘制出两条线的交点.为了满足需求大哥的需求,我也是着实想了有一会.下面我就把具体的实现过程给大家展示一下. 1.1.ECharts 简 ...
- 学习Qt Charts - Qt Charts的坐标轴
这次来学学Qt chart 的坐标轴 有这么一组数据: 这是深圳市2019年6月份的天气预报(来自中国天气网:深圳),里面有每天的最高温度,把这最高温度做成个数组,如下: int daily_temp ...
- Qt Charts的简单安装与使用
http://blog.qt.io/blog/2016/01/18/qt-charts-2-1-0-release/ 下载地址: https://codereview.qt-project.org/# ...
- 关于C#chart图表实现多条折线动态绑定数据的问题
之前就已经实现了多条折线绑定数据并显示,但不是动态绑定,而是每一条数据都要进行一次绑定,个人觉得在解决实际问题时,这样的解决方法过于笨重且缺乏扩展性,这次主要是对代码进行优化,实现写一遍代码,无论数据 ...
随机推荐
- Johnson全源最短路
例题:P5905 [模板]Johnson 全源最短路 首先考虑求全源最短路的几种方法: Floyd:时间复杂度\(O(n^3)\),可以处理负权边,但不能处理负环,而且速度很慢. Bellman-Fo ...
- FastJSON解析JSON的时候保证深堆的顺序
普通的JSONObject.parseObject(),解析的时候,底层采用HashMap解析所以是无序的, JSONObject params = JSONObject.parseObject(ex ...
- 你会Spring Cloud吗?
如果有人问你这句话,你不要急着回答,因为答语和问者的关系莫大. 如果问你的是个老板或管理者,那么他多半不了解这项技术,很有可能只是知道这个技术名词而已,你知道的一定比他们深,你大可夸夸其谈的.在口若悬 ...
- Vue 侦听器 watch
1. 侦听器 watch Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性 当属性发生改变时,自动触发属性对应的侦听器. 当需要在数据变化时执行异步或开销较大的操作时,这 ...
- 2018.12.08【NOIP提高组】模拟B组总结(未完成)
2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...
- ctfhub sql注入字符型
手工注入 1, 检查是否存在注入 2.猜字段数.列数 3.获得注入点,数据库名称,数据库版本 4.获得表名 5.获得字段名 6.获得flag sqlmap方法 1.查数据库库名 2.查表名 3.查字段 ...
- 解决IDEA打包出现中文乱码的问题
这主要是maven编译时编码问题导致的. 解决办法: 1.在IDEA的File里面打开Settings. 2.找到Runner,在VM Options输入-DarchetypeCatalog=inte ...
- SpringBoot中使用切面的每次传的参数,进行解析,验签,并返回解码后的参数
目的,在每次请求的时候,对每次传的参数,进行解析,验签,并返回解码后的参数, 以json传递: 例子背景: IOT平台提供对外可访问的接口, 需要对所有参数的传递做到 不泄露.认证的目的:所以需要在每 ...
- 将HBase中的表加载到hive中
两种方式加载hbase中的表到hive中,一是hive创建外部表关联hbase表数据,二是hive创建普通表将hbase的数据加载到本地 1. 创建外部表 hbase中已经有了一个test表,内容如下 ...
- 智慧出行--maas
未来智慧出行新生态——MaaS系统的解读与畅想 -城市交通:观察与思考 - 未来智慧出行新生态——MaaS系统的解读与畅想 在货运领域,有一种承运方式叫“多式联运”,它是由承运人与货主签订一份货运合同 ...