#pragma once #include "ZxPlotBase.h" class ZxObjBase; // 绘图载体再次封装,其实大部分绘图都是基于本类来实现 class I_PLOTCURVE_T_EXPORT ZxPlot : public ZxPlotBase { Q_OBJECT ZX_DECLARE_DYNAMIC public: ZxPlot(); ZxPlot(ZxRenderView* pView); ~ZxPlot(); public: virtual void paintBack(QPainter* painter, const ZxPaintParam& param); virtual void paintBounds(QPainter* painter); // 布局 virtual void onLayout(); // 上下文菜单 virtual void onPrepareContextMenu(QMenu *pMenu, const QPointF &pos); public: // 鼠标 virtual bool onLeftDown(const QPointF& pt); virtual bool onLeftUp(const QPointF& pt); virtual bool onMouseMove(const QPointF& pt); virtual void onLeftDoubleClick(const QPointF& pt); // Tips virtual void onShowTips(const QPointF& pt); // 删除(这是响应键盘Delete键) virtual void onDeleteItem(); virtual void deleteCurvePtsWithin(QRectF rt); // 属性填充 virtual void fillPtyPano(IxPtyPano* sheet); // 序列化 virtual void onSerialize(ZxSerializer* ser); virtual void onDeserialize(ZxSerializer* ser); virtual void onDeserialized(); // 模版序列化 virtual void onLoadTempl(ZxSerializer* ser); virtual void onSaveTempl(ZxSerializer* ser); // 重新绑定相互关联的 virtual void onDeserializedReBounds(); public: // 布局 virtual bool checkNeedLayout(); virtual QRectF getNetBounds(); //去除Margin virtual QRectF getInnerChartArea(QRectF rt); //内部绘图区,不包括坐标轴和标题区 float getTitleHeight(); //获取标题的高度 float getNaviBarHeight(); //获取NaviBar高度 virtual float getAxisDisOf(AxisPos oPos); virtual QVector getVisibleAxisOf(AxisPos oPos); protected: // 布局Title,并且返回其Bound virtual QRectF layoutTitle(QRectF rtLast, int nPos); // NaviBar virtual QRectF layoutNaviBar(QRectF rtLast); // 上下左右侧坐标轴 virtual QRectF layoutAxisOf(QRectF rtLast, AxisPos oPos); virtual void _layoutAxisOf(QMap& map, \ QRectF rt, AxisPos oPos); public: // 是否以正方形网格化显示,对于双对数有效 bool isSquareGrid() const; void setSquareGrid(bool b); // 只有m_bSquareGrid为true且xy为双对数 bool checkSquareGridMode(float& w, float& h); // 是否正在执行插入新对象的操作 bool isInserting(); // 特征线斜率 Special line ratio,权宜之计 float getLineSlope() const; void setLineSlope(float f); // 统一的增加接口,调用下面的创建和添加 virtual ZxObjBase* addOneObj(const PlotObjectType& oType, QString& sName, bool bAppend = true, ZxSubAxisX* pAxisX = NULL, ZxSubAxisY* pAxisY = NULL, bool bY2 = false); virtual bool addOneObj(ZxObjBase* pObj, bool bAppend = true, ZxSubAxisX* pAxisX = NULL, ZxSubAxisY* pAxisY = NULL, bool bY2 = false); virtual bool zoomPlot(QRectF rtTracker); protected: virtual ZxObjBase* _createObjOf(const PlotObjectType& oType, \ QString& sName); // 添加 virtual void _appendObjOf(ZxObjBase* pObj); public: // 响应从ZxCmdTool过来的鼠标处理 virtual bool runCmdSelect(PlotOperationMode o, \ const QPointF& ptStart, \ const QPointF& ptEnd); virtual bool runCmdHitPoint(PlotOperationMode o, \ const QPointF& pt); public slots: virtual void slotShowCurveData(); virtual void slotClearPointsSelection(); signals: // 触发信号,允许外界处理鼠标HitPoint void sigCmdHitPoint(PlotOperationMode o, \ const QPointF& pt, \ bool& b); void sigUpdate(); void sigShowCurveData(ZxObjCurveBase*); protected: // 是否以正方形网格化显示,对于双对数有效 bool m_bSquareGrid; // 临时标示,左键按下 bool m_bLButtonDown; // 权宜之计 QPainter* m_pPainter; // 权宜之计,其实不应该这么处理,不涉及序列化 // 这是针对特征线时后的斜率值 float m_fLineSlope; };