我几个月前最开始学习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.追加点方式
- 2.传入波形数据
- 支持16个通道
- 鼠标滑轮可以缩小放大
- 鼠标右键波形设置暂停开始
- 鼠标移动显示坐标
- 鼠标左键按住可以拖动波形
- 设置显示关闭某个通道
- 清楚某个通道数据
- 设置X轴Y轴范围
- 设置缩放比例
波形的数据控制: - 使用map将通道和Line绑定,最终对线段操作的就是map。
- 整个波形的视图范围用两个变量
- 缩放倍数XY轴应该是相同的,但是也分别控制了。
- 通道用枚举定义了
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;
};
事件的控制变量
- 按键按下的变量
- 移动波形的XY的记录
- 波形暂停开始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波形”,获取源码。