使用QT的QChart写自己的示波器_QChart波形显示
我几个月前最开始学习QT,就是从完成波形显示的功能开始的。之前工作的上位机需要有虚拟示波器功能,也就是波形显示。不曾玩过QT的小白,被安排学习完成一下。当时便选用QChart,根据领导需求也更新迭代过2次代码。 第一次参考大佬 ctrl c+v 完成个简单的显示。
第二次参考大佬思路 ctrl c+v 优化了一次。
这周下班后,我把波形显示重构了一遍,基本达到我觉得日常使用的基本功能,也算一个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;
