EnergySpectrumAnalyer/src/CustomQwtPlot.h

103 lines
2.8 KiB
C++

#ifndef CUSTOMQWTPLOT_H
#define CUSTOMQWTPLOT_H
#include <QMap>
#include <QwtPlot>
#include <QwtPlotPanner>
#include <QwtPlotMagnifier>
#include <QwtPlotPicker>
class QwtPlotCurve;
class QwtPlotMarker;
class QwtPlotZoneItem;
class QwtPlotShapeItem;
class CustomQwtPlot : public QwtPlot
{
public:
explicit CustomQwtPlot(QWidget* parent = nullptr);
virtual ~CustomQwtPlot();
void SetEventFilterFunc(std::function<bool(QObject*, QEvent*)> event_filter_func);
void SetXaxisDragScale(bool enable);
void ResetPlot();
QwtPlotCurve* GetCurve(const QString& curve_name);
QList<QwtPlotCurve*> GetCurveList() const;
void AddCurve(QwtPlotCurve* curve);
QwtPlotMarker* GetMarker(const QString& marker_name, const QString& postion);
QList<QwtPlotMarker*> GetMarkerList() const;
void AddMarker(QwtPlotMarker *marker, const QString &marker_name, const QString &postion);
void RemoveMarker(const QString& marker_name, const QString& postion);
void CleanMarkers();
QwtPlotZoneItem* GetZoneItem(const QString& zone_item_name);
QList<QwtPlotZoneItem*> GetZoneItemList() const;
void AddZoneItem(QwtPlotZoneItem *zone_item, const QString &zone_item_name);
void RemoveZoneItem(const QString& zone_item_name);
void CleanZoneItems();
protected:
bool eventFilter(QObject *obj, QEvent *event) override;
virtual void showEvent(QShowEvent *event) override;
private:
double _init_x_min = 0, _init_x_max = 10;
double _init_y_min = 0, _init_y_max = 10;
bool _is_dragging = false;
QPoint _last_pos;
std::function<bool(QObject*, QEvent*)> _event_filter_func = nullptr;
private:
QMap<QString, QwtPlotCurve*> _curves;
QMap<QString, QMap<QString, QwtPlotMarker*> > _markers;
QMap<QString, QwtPlotZoneItem*> _zone_items;
};
class CustomQwtPlotXaxisPanner : public QwtPlotPanner
{
public:
CustomQwtPlotXaxisPanner(QWidget *canvas);
virtual ~CustomQwtPlotXaxisPanner();
protected:
virtual void moveCanvas(int dx, int dy) override;
};
class CustomQwtPlotXaxisMagnifier : public QwtPlotMagnifier
{
public:
CustomQwtPlotXaxisMagnifier(QWidget *canvas);
virtual ~CustomQwtPlotXaxisMagnifier();
protected:
virtual void rescale(double factor) override;
};
class CustomQwtPlotXaxisSelector : public QwtPlotPicker
{
Q_OBJECT
public:
explicit CustomQwtPlotXaxisSelector(QWidget* canvas);
virtual ~CustomQwtPlotXaxisSelector();
double selectedMinX() const;
double selectedMaxX() const;
void clearSelection();
signals:
void selectionFinished(double minX, double maxX);
protected:
virtual void move(const QPoint& pos) override;
virtual bool end(bool ok) override;
private:
QwtPlotShapeItem* _overlay = nullptr;
double _min_x;
double _max_x;
};
QColor getDistinctColorForManyCurves(int curve_index);
#endif // CUSTOMQWTPLOT_H