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

使用QT的QChart写自己的示波器
我几个月前最开始学习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. 设置缩放比例
    使用QT的QChart写自己的示波器
    波形的数据控制:
  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波形”,获取源码。
使用QT的QChart写自己的示波器

上一篇:pyaudio与优美的声音


下一篇:css实现相框效果