#ifndef CUSTOMQWTPLOT_H #define CUSTOMQWTPLOT_H #include #include #include #include #include class QwtPlotCurve; class QwtPlotMarker; class QwtPlotZoneItem; class QwtPlotShapeItem; class CustomQwtPlot : public QwtPlot { public: explicit CustomQwtPlot(QWidget* parent = nullptr); virtual ~CustomQwtPlot(); void SetEventFilterFunc(std::function event_filter_func); void SetXaxisDragScale(bool enable); void ResetPlot(); QwtPlotCurve* GetCurve(const QString& curve_name); QList GetCurveList() const; void AddCurve(QwtPlotCurve* curve); QwtPlotMarker* GetMarker(const QString& marker_name, const QString& postion); QList 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 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 _event_filter_func = nullptr; private: QMap _curves; QMap > _markers; QMap _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