ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用QT的QChart写自己的示波器

2021-07-17 15:01:44  阅读:639  来源: 互联网

标签:ch QT 波形 QChart void WAVE CH 示波器 通道


在这里插入图片描述
我几个月前最开始学习QT,就是从完成波形显示的功能开始的。之前工作的上位机需要有虚拟示波器功能,也就是波形显示。不曾玩过QT的小白,被安排学习完成一下。当时便选用QChart,根据领导需求也更新迭代过2次代码。

第一次参考大佬 ctrl c+v 完成个简单的显示。
https://www.cnblogs.com/lifexy/p/12150400.html

第二次参考大佬思路 ctrl c+v 优化了一次。
https://blog.csdn.net/qq_37700564/article/details/85271907

这周下班后,我把波形显示重构了一遍,基本达到我觉得日常使用的基本功能,也算一个QT 使用Qchart 的波形显示的库。

基本完成的功能和接口

  1. 加载数据波形
    • 1.追加点方式
    • 2.传入波形数据
  2. 支持16个通道
  3. 鼠标滑轮可以缩小放大
  4. 鼠标右键波形设置暂停开始
  5. 鼠标移动显示坐标
  6. 鼠标左键按住可以拖动波形
  7. 设置显示关闭某个通道
  8. 清楚某个通道数据
  9. 设置X轴Y轴范围
  10. 设置缩放比例
    在这里插入图片描述
    波形的数据控制:
  11. 使用map将通道和Line绑定,最终对线段操作的就是map。
  12. 整个波形的视图范围用两个变量
  13. 缩放倍数XY轴应该是相同的,但是也分别控制了。
  14. 通道用枚举定义了
enum  WAVE_CH
{
  WAVE_CH0,WAVE_CH1,WAVE_CH2,
  WAVE_CH3,WAVE_CH4,WAVE_CH5,
  WAVE_CH6,WAVE_CH7,WAVE_CH8,
  WAVE_CH9,WAVE_CH10, WAVE_CH11,
  WAVE_CH12,WAVE_CH13,WAVE_CH14,WAVE_CH15,
};
//  直线:  QLineSeries
//  平滑线  QSplineSeries
typedef  QLineSeries  SeriesType;
struct  Wave
{
  QMap<WAVE_CH,  SeriesType  *>  map_series;  //key:  ch,  value  SeriesType  *
  QChart  *chart;  //  图纸
  QValueAxis  *axisX,  *axisY;  //  xy轴
  double  rangeX,  rangeY;  //  控制XY的可视范围
  double  multipleX,  multipleY;  //  放大倍数,对应缩小倍数为1/multiple.
  double  last_point_x  =  0;
};

事件的控制变量

  1. 按键按下的变量
  2. 移动波形的XY的记录
  3. 波形暂停开始action
struct  Event
{
  bool  rightButtonPressed  =  false;
  bool  leftButtonPressed  =  false;
  QPoint  PressedPos;
  double  moveX,moveY;  //  记录移动
  bool  pauseWave;
  QMenu  *menu;
  QAction*  startAction;
  QAction*  pauseAction;
};

实现的接口

//  设置的通道数量
  #define  SET_GLOBLE_CHANNEL  16
  //  打开某个通道显示
  void  openChannel(WAVE_CH  ch);
  //  关闭某个通道显示
  void  closeChannel(WAVE_CH  ch);
  //  清除某个通道波形数据
  void  clearChannel(WAVE_CH  ch);
  //  追加某个通道的坐标点
  void  addSeriesData(WAVE_CH  ch,  const  QPointF&  point);
  //  传入某个通道的波形
  void  addSeriesData(WAVE_CH  ch,  const  QList<QPointF>&  point_list);
  //  设置X轴范围
  void  setRangeX(int  rangeX);
  //  设置Y轴范围
  void setRangeY(int  rangeY);
  //  设置X轴范围放大倍数,默认1.2,不可为0,对应缩小为1/multiple
  void  setZoomX(double  multiple);
  //  设置Y轴范围放大倍数,默认1.2,不可为0,对应缩小为1/multiple
  void  setZoomY(double  multiple);
  //  X轴范围按比例缩小
  void  ZoomOutX(void);
  //  X轴范围按比例放大
  void  ZoomX(void);
  //  Y轴范围按比例缩小
  void  ZoomOutY(void);
  //  Y轴范围按比例放大
  void  ZoomY(void);
  //  波形开始
  void  startGraph(void);
  //  波形暂停
  void  pauseGraph(void);
public  slots:
  //  波形开始槽函数
  void  slots_startGraph(void);
  //  波形暂停槽函数
  void  slots_pauseGraph(void);
protected:
  //  事件重写
  virtual  void  mouseMoveEvent(QMouseEvent  *pEvent)  override;
  virtual  void  mousePressEvent(QMouseEvent  *pEvent)  override;
  virtual  void  mouseReleaseEvent(QMouseEvent  *pEvent)  override;
  virtual  void  wheelEvent(QWheelEvent  *pEvent)  override;
  virtual  void  contextMenuEvent(QContextMenuEvent  *event)  override;

被抛弃的写随笔公众号改写技术文章了,感兴趣的可以关注公众号:王崇卫

回复“QT波形”,获取源码。
在这里插入图片描述

标签:ch,QT,波形,QChart,void,WAVE,CH,示波器,通道
来源: https://blog.csdn.net/qq_38190041/article/details/118856767

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有