#pragma once #include "iDlgBase.h" #include "iResultInfo.h" #include "iGridRowItemUnt.h" #include "iModelInfo.h" class iBdyInfo; // 参数区统一处理的Utils class X_GUI_GRIDPTY_EXPORT iGridRowUtils : public iDlgBase//QAbstractScrollArea { Q_OBJECT protected: // 右键拷贝内容范围 enum CopyDataMode { CDM_CurItem = 0,//当前项 CDM_CurGroup, //当前组 CDM_AllItems, //所有项 CDM_Unknown }; public: explicit iGridRowUtils(bool bSimple = false, QWidget *parent = 0); ~iGridRowUtils(); public: // 初始化 virtual void initUI(); #ifdef _SCAN_OLD_CODES_ // 对外暴露接口 virtual bool buildRowUtils(QStringList listParas, \ QStringList& listParaTags, \ bool bDnMode, \ QWidget* pWxDlg); virtual bool _buildRowUtils(QStringList listParas, \ QStringList& listParaTags, \ iGridRowItem* pItemParent, \ bool bDnMode, \ bool bProperOrder = true); #else // 对外暴露接口 // 注:20260108,全面去除listParaTags参数接口 virtual bool buildRowUtils(QStringList listParas, \ bool bDnMode, \ QWidget* pWxDlg); virtual bool _buildRowUtils(QStringList listParas, \ iGridRowItem* pItemParent, \ bool bDnMode, \ bool bProperOrder = true); #endif #ifdef _SCAN_OLD_CODES_ virtual bool createParamsUtils(QStringList listParas, \ bool bDnMode); //ZXF20241110 //创建Model项 virtual iGridRowItem* createModelItem(iModelInfo* p, \ iGridRowItem* pGridItemG,\ int& nIndex); #endif virtual void setParaItems(QVector& vec, \ bool bDnMode, \ QWidget* pWxDlg); virtual void setBounds(QRectF& rt); virtual double getUtilHeight(); virtual void connectSignalsOf(iGridRowItem* p); virtual void bkAllItems(); virtual QStringList getAllTags(); //不考虑层级 virtual void resetLayout(); //流动段增减后重置 // 根据名字获取 virtual iGridRowItem* getItemByPara(QString sPara); //virtual iGridRowItem* getGridGroupItem(QString sTag); // 根据名字取数据 virtual QVariant getItemValueByPara(QString sPara); // 查询并处理 UseMdoe == 3 的参数,初始不显示 virtual void dealwithHide(bool bHideMode, bool& bItemChanged); // 查询并处理 多相/单相切换 的参数,初始不显示 virtual void deawithMpMode(bool bMultiPhase, bool& bItemChanged); virtual void dealwithItemOfs(ParaUseMode o, bool bHideMode, bool& bItemChanged); // 清空 virtual void clearAllItems(); // Header virtual void setHeaderVisible(bool b); virtual bool isHeaderVisible(); // 对Items进行检测,正确输入 virtual bool checkItems(); // 刷新 virtual void updateItem(iGridRowItem* p); virtual void insertItem(int nIndex, iGridRowItem* pItem); //得到所有的大节点Group virtual QVector getAllGridGroupItems(); //删除 virtual void removeGridGroupItem(iGridRowItem* pItemG); virtual void removeGridChildItem(iGridRowItem* pItemC); //删除组中的一个节点 virtual void removeGridItemFromGroup(iGridRowItem* pItemG, iGridRowItem* pItemC); virtual void dealwithSegItem(QString sTag, double dNqAll); // 获取属性页中,对应的第几个边界参数,顺序也是按照 m_pParaManager->getBdyRealNameOf(1); //对应 x1 // 把原来的"x1"之类,根据索引传递,查阅真实的,比如 ee,se,we,ne // xIndex 从1开始,即遇到"x1"则传入1 virtual QString getBdyRealNameOf(int xIndex); // 参数来源标识,默认情况下,为 s_Sys_Para_Default void setParaSrcTag(QString s); protected: // 按键 virtual void keyPressEvent(QKeyEvent* e); /// @brief 获取当前激活的Item的索引,在全局m_vecAllItems中 /// @param bStrict 为true:取的item 处于激活同时hasFocus /// 为false 取的item 处于激活同时 本类[iGridRowUtils] hasFocus virtual int getFocusedItemIndex(bool bStrict = true); /// @brief 获取下一个可以激活[获取索引]的Item的索引,在全局m_vecAllItems中 /// @param nFrom 为当前:要从nFrom+1开始算起,若干到头,则从0开始继续 /// @param bStrict 为true:不考虑隐藏、只读等 /// 为false 所有item都考虑 virtual int getNextItemIndexToFocus(int nFrom, bool bStrict = true); protected: // 搭建过程 virtual QStringList getParaTypes(QStringList listParas); virtual bool createAndAddItem(iGridRowItem* pParent, \ iParameter* p, QString sPara); virtual iGridRowItem* createWithSegOlds(iGridRowItem* pParent, \ iParameter* p, QString sPara);//兼容原先,没有配置ParaType // 这是一些特殊处理,就是创建完成所有Item后,相关的关联 // 如 产液段与有效长度 virtual void bindItems(); // 把所有Item从上到下(不考虑层级记录下来) virtual bool getAllItems(QVector& vec); //不考虑层级 // 范围及布局 virtual void setSplitPos(double d); virtual void updateLayout(); virtual void doLayout(); // 右键拷贝数据 virtual void copyDataBy(CopyDataMode o); virtual bool collectsDataBy(CopyDataMode o, QVector& vec); // void showItems(bool bMainItems); // void setHelpBoxVisible(bool bVisible); protected: virtual void mousePressEvent(QMouseEvent *); virtual void mouseDoubleClickEvent(QMouseEvent* e); virtual void mouseReleaseEvent(QMouseEvent *); virtual void mouseMoveEvent(QMouseEvent *); virtual void resizeEvent(QResizeEvent *); protected: virtual void paintEvent(QPaintEvent *); virtual void paintGrid(QPainter* pPainter); virtual void paintHeader(QPainter* pPainter); public slots: virtual void slotActivateItem(iGridRowItem* p); virtual void onActiveItemChanged(iGridRowItem* p); virtual void slotValuePrevChanged(QVariant& o1, QVariant& o2); virtual void slotValueExPrevChanged(QVariant& o1, QVariant& o2); virtual void slotGetValueOf(QString sPara, QVariant& o, bool& bOk); public slots: // 右键 virtual void slotCustomContextMenu(const QPoint &pos); virtual void slotCopyCurrentItem(); virtual void slotCopyCurrentGroup(); virtual void slotCopyAllItems(); // virtual void slotShowAllItems(); // virtual void slotShowMainItems(); // virtual void slotShowHelpBox(); // virtual void slotHideHelpBox(); signals: // // 当前显示的状态 // void sigGetMainItemMode(bool& b); // void sigSetMainItemMode(bool b); // // HelpBox的状态 // void sigGetHelpBoxVisible(bool& b); // void sigSetHelpBoxVisible(bool b); void sigHelpMsg(QString& s); // TODO not use // void sigAppendOtherItems(QVector& vec); /// @brief 触发参数改变,允许外界进行更改 /// @param sName: 参数名称 /// @param o1: 主要数据,m_oRawValue /// @param o2: 辅助数据,如Cbx的下拉填充内容QStringList /// @param bSet:是否已经正确设置 void sigItemPrevChanged(QString sName, \ QVariant& o1, QVariant& o2, \ bool& bSet); /// @brief 触发参数(其它,比如边界,下拉选项)改变,允许外界进行更改 /// @param sName: 参数名称 /// @param o1: 当前选择的数据Index,currentindex在列表o2中的索引 /// @param o2: 辅助数据,如Cbx的下拉填充内容QStringList /// 比如有的边界,可以下拉包括 无限大,有的不需要 /// @param bSet:是否已经正确设置 /// @note 通常 在 setParameter 函数中触发 void sigItemExPrevChanged(QString sName, \ QVariant& o1, QVariant& o2, \ bool& bSet); // 由外界调整右键菜单 void sigAdjustContextMenu(QMenu*& pMenu, iGridRowItem*); // /// @brief 触发参数改变 // /// @param sPara: 参数名称 // /// @param o 更改后的数据 // void sigItemValueChanged(QString sPara, QVariant o); // 是否启用正则验证,比如,直角边界,第一个边界要大于井长/2,只有点源才支持 void sigOuterValidate(QString sPara, QVariant o, bool& bValid, bool& bSet); /// @brief 触发子参数列表改变,比如调用水平井段数编辑功能,目前只限于 iGridRowItemSubSegEx 类型的信号传递 /// @param sSegName: (in) 基准参数,为英文标识,如流动段数:"Nq" /// @param vvec: (in & out) 子参数数据,注意:key为英文,如"NqX","NqL","NqQ"之类,与xml配置文件严格对应 /// @param dWellLen: (in) 水平井长度 /// @param bModified: (out) 是否正确触发且vvec发生改变 void sigSegMore(const QString sSegName, \ QVector< QMap >& vvec, \ const double dWellLen, \ bool& bModified); /// @brief 触发边界信息改变,比如修改平行边界,由上下改为左右 /// @param pItem: (in) 当前的GroupItem,其实即是本类iGridRowGroupBdy /// @param vvec: (in & out) 边界信息数据 /// @param bModified: (out) 是否正确触发且vvec发生改变 void sigBdyDetails(iGridRowItem* pItem, \ QVector< iBdyInfo* >& vvec, \ bool& bModified); /// @brief 触发按钮,允许外部进行按钮操作,比如弹出对话框之类 /// @param sName: (in) 参数标识,为英文标识 /// @param vCustom: (in & out) 外部弹出后,可以把数据传递回来,并且缓存,以支持序列化 /// @param bModified: (out) 是否正确触发且vCustom发生改变 void sigBtnClicked(const QString sSegName, \ QVariant& vCustom, \ bool& bModified); protected: // 节点操作及属性更改 virtual GridTickPos hitTest(QPoint pt); virtual void expand(iGridRowItem* p); virtual void collapse(iGridRowItem* p); virtual iGridRowItem* getLastActive(); // 位置记录 virtual int getPreferedSplitX(); virtual void saveSplitX(); virtual void loadSplitX(); public: // 组织数据 // 序列化 virtual void onSerialize(ZxSerializer* ser); virtual void onDeserialize(ZxSerializer* ser); // 组织结果数据,注:vec不进行clear,由调用方自行clear virtual bool organizeResults(QVector& vec, QString sType, bool bMultiPhase); // 从各个Wx(m_vecWxDatas)中遍历查找 virtual bool setParaValue(QString sPara, QVariant o); virtual bool getParaValue(QString sPara, QVariant& o); // 返回所有参数,Key为英文ID virtual bool getAllParaValues(QMap& map, bool bOnlyFitted = false, bool bClearMap = true); virtual bool getAllParaUnits(QMap& map, bool bOnlyFitted = false, bool bClearMap = true); // 返回所有的跟模型相关的边界参数的类型,封闭或定压 // 封闭:0 // 定压:1 virtual bool getBdyInfos(QMap& map); public: // 20260107开始扩充,与层有关的内容 // 获取当前所在的父级层的标识,可能为空 virtual QString getUpperLayerTagOf(iGridRowItem* pItem); // 获取当前所在的父级层的Index(第几层),从0开始,如果没找到,则为-1 virtual int getUpperLayerIndexOf(iGridRowItem* pItem); // 是否层内节点(不考虑层内本身的层级) virtual bool isUpperLayerInnerOf(iGridRowItem* pItem); protected: // 窗体载体 QWidget* m_pWxDlg; // 子项 QVector m_vecGridItems; QVector m_vecAllItems;// 从上到下不考虑层级,所有 iGridRowItem* m_pItemSel; // 位置及布局 QRectF m_rtBounds; bool m_bNeedLayout; // 分割线 bool m_bHitSplit; double m_dSplitPos; // Header bool m_bHeaderVisible; double m_dRowHeight; QMenu* m_pContextMenu; bool m_bSimpleMode; //不涉及序列化,默认为false,但比如相渗里面的,可以设为true bool m_bUnableSP; protected: // 参数来源标识,默认情况下,为 s_Sys_Para_Default // 不涉及序列化 QString m_sParaSrcTag; };