#pragma once #include "iGuiPlot.h" #include "iDlgBase.h" #include "ZxSegmentInfo.h" class ZxTableView; class ZxTableModel; class ZxObjCurveBase; class ZxObjCurveFlow; class ZxObjCurvePressure; class ZxObjCurve; class ZxObjBase; class iGuiPlotPFCmdHelper; /// @brief 针对PF上下显示的需求,特创建本类 /// @note 本类基于 iGuiPlotEx 的部分功能 class M_GUI_PLOT_EXPORT iGuiPlotPF : public iDlgBase { Q_OBJECT public: explicit iGuiPlotPF(QString sExt, QWidget *parent = 0); ~iGuiPlotPF(); // 初始化UI virtual void initUI(QString sTitle, \ QSize szDefault = QSize(265, 203)); // 辅助表格设置 void setTableHelperVisible(bool b); bool isTableHelperVisible(); int getPosMode(); /// @brief 设置位置信息,只在显示table时有效 /// @param n 0:表左图右 1:表右图左 2:表上图下 3:表下图上 void setPosMode(int n); // 为确保一致性,updatePlots中调用updateBrotherTables virtual void runUpdate(); void reBindTwo(); bool freshDataOfPF(QVector& vecObjs); // 设置图上数据、线的类型(点或者线) // 这是一次性设置数据,需要外界显示调用runUpdate刷新 void setCurveData(QVector vecCurveDesc); void changeCurveData(QString sKey, iCurveDesc o); // 分配 void allocateData(); // 获取两条线的数据点(绘图对象) bool getChartDataXYOfPF(QVector& vec, bool bPressure, \ QString* pStrCodeF = NULL); // 获取两条线的绘图对象 bool getChartDataObjOfPF(ZxObjCurveBase*& p, bool bPressure); // 获取两条线的数据对象 bool getDataObjOfPF(ZxDataGaugeBase*& p, bool bPressure); // 模拟右键双击 bool runClickBySimulation(); // 信号关联 void bindTwoPlots(); // 建议流动段上下对比调整过程时,随时保存入库 // 建议采取折中方案,每次流动段弹窗前保存一下 // 20211216 Added 数据 编辑 也用该函数 void runPossibleSave(); bool isPossibleModified(); private: // 选定的流动段在当前压力曲线 // 数据的位置索引(第几个点,从0开始) bool prepareSegInfo(ZxSegmentInfo* p); bool checkCurrentPF(ZxObjCurvePressure*& pCurveP, \ ZxObjCurveFlow*& pCurveF); private: // 初始化 void initUI_MainLayout(); void initUI_P(QString sTitle, QSize sz); void initUI_F(QString sTitle, QSize sz); void initUI_SplitterPF(); void initUI_Table(); void initUI_ToolBar(); void initUI_SumUp(); // 基础Signal void buildBaseSignals(bool bP); // Table改变时,刷新曲线 void refreshCurveBy(ZxTableModel* p, bool bRightColOnly = false); QVector getVecPtFrom(VVecVariant& vvecData); ZxObjCurve* checkObjCurveFrom(ZxTableModel* pTableModel, \ QString& sTag); iGuiPlot* checkPlotWxFrom(ZxTableModel* pTableModel, \ QString& sTag); protected: virtual void paintEvent(QPaintEvent *); virtual void updateBrotherTables(); // 信号关联 void bindPlotWithTable(ZxPlot *pPlot, ZxObjCurveBase* pCurve, ZxTableView* pTableView); // 获取当前显示的视图中的曲线 bool getAllVisibleCurves(QVector& vec); bool getAllVisibleCurvesOf(iGuiPlot* p, QVector& vec); bool getCurveDescByName(QString s, iCurveDesc& o); public slots: // 表格 void slotTableCellChanged(const QModelIndex& Index, const QModelIndex& nIndex); void slotTableRowChanged(QModelIndexList listOlds, QModelIndexList listNews, QModelIndex index); // 表格选中 void slotSubTableSelChanged(); // Curve void slotCurveSelChanged(bool bSelect); void slotCurvePtsChanged(); // 压力数据,PointState改变 void slotPressPsChanged(int nIndex, PointState psOld, PointState psNew); void slotNewRectSelection(); // flow void slotFlowVerPtsChanged(int nIndex, double fOld, double fNew); void slotFlowSegCurIndexChanged(); // plot void slotObjDeleted(ZxObjBase* p); // 水平滚动条的同步 void slotHSrollBarValueChanged(int); // splitter的响应 void slotSplitterMoved(int pos, int index); // 双击处理(弹出右键流动段,或者 属性页) void slotLeftDoubleClicked(const QPointF& pt); // 重新调整ToolBar,此处只是接口传递一下 void slotToolbarBuilt(QToolBar*); // 为了统一,把流动段方面的绘制提取出来了,而没有放在CurveFlow的类里 void slotGetBrotherObj(ZxObjBase*&); void slotUpdateWhenFlowChanged(); // 在iGuiPlotTableHelper保存时,通过该信号获取对应的DataObj void slotGetDataObjOfView(ZxTableView* pView, ZxDataGaugeBase*& p); // 是否允许拖拽的响应处理 void slotCheckDropCurve(ZxDataGaugeBase* pObj, bool& bEnabled); // 拖拽曲线的处理 void slotDealwithDropCurve(ZxDataGaugeBase* pObj, bool& b); signals: // 一旦压力或流量保存之后,则触发其他窗口的刷新 void sigDataSavedPF(QString sCode); // 当前选泽的流动段改变 void sigSegmentChanged(ZxSegmentInfo& o, bool bShowOptionWx); // 当前流动段的参数改变,如移动水平线,此时仅仅刷新相应的结果视图 void sigSegmentParamsChanged(ZxSegmentInfo& o); // 当GuiPlot的toolbar建立后触发,调用方可以做调整, // 如增加一些按钮或控件 void sigToolbarBuilt(QToolBar*); // 对整体布局允许用户进行调整 void sigAdjustUis(QSplitter* pSplitter); // 弹出属性页(如果当前未显示) void sigSetPtyVisible(bool); // 仅仅触发双击事件 void sigDoubleClicked(ZxPlot* pPlotHit, \ bool bShowOptionWx, bool& bProcessed); public: // 布局 QVBoxLayout* m_pMainLayout; QSplitter* m_pSplitter; QWidget* m_pWxChartM; // 图形 iGuiPlot* m_pWxPlotP; iGuiPlot* m_pWxPlotF; // 曲线对应的描述信息map QVector m_vecCurveDesc; // 辅助表格 iGuiPlotTableHelper* m_pTableHelper; bool m_bShowTableHelper; //是否显示 int m_nPosMode; //在显示辅助表格时,表图的位置关系 //0:表左图右 1:表右图左 //2:表上图下 3:表下图上 // 图形统一的工具栏 iGuiPlotPFCmdHelper* m_pCmdHelper; QWidget* m_pWxToolBar; // 辅助信息 区分是 压力编辑、流量编辑还是 压力流量流动段选择 QString m_sExt; };