#ifndef TRANSPARENTDRAGGABLECRACKOBJECT_H #define TRANSPARENTDRAGGABLECRACKOBJECT_H #include #include #include #include "qcustomplot.h" #pragma execution_character_set("utf-8") class TransparentDraggableCrackObject : public QObject { Q_OBJECT public: enum CurveType { TYPE_A, TYPE_B, TYPE_C }; explicit TransparentDraggableCrackObject(QCustomPlot *parentPlot, const QString &strUuid, double depth, QString type, QString showNames); ~TransparentDraggableCrackObject(); bool m_isShow = false; QString m_typeName; void isShow(bool is); protected: bool eventFilter(QObject *obj, QEvent *event) override; private: QCustomPlot *mPlot; CurveType m_type; QString m_uuid; double m_depth; double m_endX; QColor m_lineColor; static QPointer s_activeObject; QCPItemText *m_itemText; // 模式A QCPItemCurve *mCurve; double m_orig_x1, m_orig_x2; double m_orig_y1, m_orig_y2; double m_orig_startX, m_orig_endX; double m_orig_startDirX, m_orig_startDirY; double m_orig_endDirX, m_orig_endDirY; double m_offsetXA, m_offsetYA; QCPItemTracer *m_tracer1, *m_tracer2; enum DragStateA { IdleA, DraggingPoint1, DraggingPoint2, DraggingCurveA }; DragStateA m_dragStateA; QPointF m_lastDragPixelA; // 模式B struct LineItem { QPointF startOrig; QPointF endOrig; QCPItemLine *line; QCPItemTracer *startTracer; QCPItemTracer *endTracer; }; QVector m_lines; bool m_isAddingLine; QPointF m_tempPoint; double m_offsetXB, m_offsetYB; enum DragStateB { IdleB, DraggingLineOverall, DraggingStartPoint, DraggingEndPoint }; DragStateB m_dragStateB; QPointF m_bDragStart; int m_draggedLineIndex; // 模式C QCPCurve *m_curveC; QVector m_pointsC; // 原始点(无偏移) QVector m_labelsC; // 序号标签 double m_offsetXC, m_offsetYC; // 整体偏移 bool m_cFinished; // 是否已完成选点 bool m_cDragging; // 是否正在拖拽整体 bool m_draggingPoint; // 是否正在拖拽点 int m_draggedPointIndex; // 拖拽的点的索引 QPointF m_cDragStart; // 拖拽起始像素 void updateCurveFromTargets(); void updateCurvePosition(); void updateTracers(); void setTracerHighlight(QCPItemTracer *tracer, bool highlight); void updateLinesPosition(); void clearLines(); void updateLineEndpoints(LineItem &item); void updatePolylineC(bool closed); void clearPolylineC(); void deactivate(); }; #endif