67 lines
1.7 KiB
C++
67 lines
1.7 KiB
C++
#ifndef CURVEPLOTWIDGET_H
|
||
#define CURVEPLOTWIDGET_H
|
||
|
||
#include <QWidget>
|
||
#include <QVector>
|
||
#include <QColor>
|
||
#include <QMap>
|
||
#include <QElapsedTimer>
|
||
|
||
struct CurveCfg
|
||
{
|
||
QString name; // 图例
|
||
double yMax; // y 满量程
|
||
QColor normal; // 绿色(正常)
|
||
QColor warning; // 橙色(警告)
|
||
QColor fault; // 红色(故障)
|
||
double thWarning; // 警告阈值
|
||
double thFault; // 故障阈值
|
||
};
|
||
|
||
class CurvePlotWidget : public QWidget
|
||
{
|
||
Q_OBJECT
|
||
public:
|
||
explicit CurvePlotWidget(QWidget *parent = nullptr);
|
||
|
||
/* x 轴总时长(秒) */
|
||
void setTimeRange(double secs);
|
||
|
||
/* 添加一条曲线 */
|
||
void initCurve(int id, const CurveCfg &cfg);
|
||
|
||
/* 清空所有曲线 */
|
||
void clearAllCurves();
|
||
|
||
/* 追加数据,yValue 为物理量,timeStamp 为 QDateTime::toMSecsSinceEpoch()/1000.0 */
|
||
void appendPoint(int curveId, double timeStamp, double yValue);
|
||
|
||
protected:
|
||
void paintEvent(QPaintEvent *event) override;
|
||
void resizeEvent(QResizeEvent *event) override;
|
||
|
||
private:
|
||
struct Curve
|
||
{
|
||
CurveCfg cfg;
|
||
QVector<double> tBuf;
|
||
QVector<double> yBuf;
|
||
int head = 0;
|
||
};
|
||
|
||
double m_tRange = 10.0; // 总时长(秒)
|
||
int m_xMax = 72000; // 内部缓冲区点数
|
||
int m_topMargin = 40; // 顶部留图例
|
||
int m_bottomMargin = 25; // X 轴
|
||
int m_leftMargin = 35; // Y 轴
|
||
int m_rightMargin = 10;
|
||
|
||
QMap<int, Curve> m_curves;
|
||
double m_t0 = 0; // 第一条数据的时间基准
|
||
bool m_t0set = false;
|
||
|
||
QPointF mapToWidget(double t, double y, const Curve &c) const;
|
||
};
|
||
|
||
#endif // CURVEPLOTWIDGET_H
|