#pragma once #include "IxSerDes.h" #include "IxPtyPano.h" #include "ZxXpf.h" #include "ZxSerializer.h" #include "ZxBaseUtil.h" #include "mModuleDefines.h" #include "mSubWnd_global.h" class ZxMainWindow; class ZxMdiSubWindow; class ZxTabWidget; class ZxPtyDock; class iDockBaseWx; class ZxDataWell; class ZxDataGaugeBase; class ZxPlot; class iGuiPlot; class ZxRenderItem; class ZxRstWnd; // 各类型窗体MDI类型 // 数据管理 #define s_MdiType_DataManager "DataManager" // 数据编辑 #define s_MdiType_DataEdit "DataEdit" // 处理解释分析,这是用的最多的一类,包括Anal、Fitting、Design、Nm等 #define s_MdiType_DataAnal "DataAnal" // 井位图,单独一类 #define s_MdiType_DataMap "DataMap" // IPR:IPR准备和IPR分析两类 #define s_MdiType_DataIPR "DataIPR" // WDT:所有与产能相关 #define s_MdiType_DataWDT "DataWDT" // 小型压裂相关,目前包括四类 #define s_MdiType_DataMiniFr "DataMiniFr" // Config类 #define s_MdiType_DataConfig "DataConfig" // 成果对比类 #define s_MdiType_ResCompare "ResCompare" // 数值类,有待数值类启用 #define s_MdiType_DataNum "DataNum" // 注入/耦合 #define s_MdiType_DataInject "DataInject" #define s_MdiType_DataCoupling "DataCoupling" #define s_MdiType_DataDistrib "DataDistrib" // 其它 #define s_MdiType_Free "Free" //#define s_MdiType_DataAnalDn "DataDesign" //#define s_MdiType_DataFit "DataFit" // 子窗体基类 class M_SUB_WND_EXPORT iSubWnd : public QMainWindow, virtual public IxSerDes { Q_OBJECT public: /// @brief 子窗体基类构造 /// @param parent:父 /// @param sExt指的是辅助信息,如操作的表名等等 explicit iSubWnd(QWidget *parent = 0, QString sExt = ""); ~iSubWnd(); void setMainWindow(ZxMainWindow* p); //set/get 主窗体 ZxMainWindow* getMainWindow(); virtual void initUI(); //初始化入口 virtual void configWnd(QString sPrevInfo); //配置窗体 virtual void loadData(QString sWell = ""); //加载数据 virtual void runUpdate(); //刷新 virtual void firstLoadAndUpdate(); //窗体初始后允许数据加载及刷新 virtual bool onConfirmClosing(); //窗体关闭之前的确认 virtual void onActivated(); //当前窗体激活时被调用 virtual void finalDeals(); //窗体完成并且在显示之前,允许再做些调整 void setProgressBar(QProgressBar* p); //进度条传递 virtual void setDataWell(ZxDataWell* p); //操作对象井传递 ZxDataWell* getDataWell(); void setWndID(QString sID); //窗体ID QString getWndID(); // 为了触发消息,新增标题修改函数,触发 void setWndTag(QString s); // 是否强制创建MDI bool isForcedMdiWnd(); void setMdiWndType(QString sType); //窗体MdiWndType QString getMdiWndType(); void setMdiChild(ZxMdiSubWindow *p); ZxMdiSubWindow* getMdiChild(); ZxTabWidget* getTabWx(); // 临时变量,对应的窗体Obj virtual void setRstWnd(ZxRstWnd* p); ZxRstWnd* getRstUtilWnd(); // 执行命令:通常来自Ribbon virtual bool runCmdBy(QString sName, QString sID); /// @brief 命令是否Enabled的状态判断,通常来自Ribbon /// @param b (out),true:Enabled false:disabled /// @param sName (in),Cmd Name /// @param nID (in),Cmd ID /// @param bLicensed (in),当前是否有授权 /// @return 本窗体是否已经进行状态判断(即属于本窗体可执行的命令) virtual bool checkCmdEnable(bool &b, \ QString sName, int nID, \ bool bLicensed); // 辅助信息 // void setExt(QString s);// 因为构造时传入,而且要进行判断 QString getExt(); // readonly void setReadonly(bool b); bool isReadonly(); //是否加载成果模式,临时设置 void setRstLoading(bool b); bool isRstLoading(); // 对于缓存已经保存的压力流量进行刷新处理 void addTempSavedPFs(QString sCode); virtual void freshByTempSavedPFs(); // 当井相关的内容更改时进行相关的处理,比如更新一下井位图 virtual void dealwithWellChange(ZxDataWell* pDataWell, TreeNodeCmd o); public: void keyPressEvent(QKeyEvent* e); // 序列化 virtual void onSerialize(ZxSerializer* ser); virtual void onDeserialize(ZxSerializer* ser); virtual void onDeserialized(); // 保存加载 virtual bool loadRsts(); virtual bool saveRsts(); virtual bool _runSaveRsts(ZxRstWnd* pRstWnd); virtual bool _runLoadRsts(ZxRstWnd* pRstWnd); // 20260518 权宜之计,各个窗体提供,各自前置的需保存的信息 // 比如:SubFitting中的 使用 分析 的ID // 该信息在加载时,非常关键,在创建窗体时,就需要知晓 virtual QString _getPrevInfos4Save(); public: // 相对通用的函数:某个数据对象(序列化对象) virtual bool saveSerObjToBa(QByteArray& v, IxSerDes*& pSerObj); virtual bool loadSerObjFromBa(QByteArray& v, IxSerDes*& pSerObj); // 相对通用的函数:某个Plot virtual bool saveOnePlotToBa(ZxPlot* p, QByteArray& v); virtual bool loadOnePlotFromBa(ZxPlot*& p, QByteArray& v); public: // 状态 virtual void setModified(bool b); virtual bool isModified(); // 模型和参数窗口 virtual void showOrHideModels(); virtual void showOrHideParameters(); protected: // 初始化参数 virtual void initStyleSheets(); //Sheet // 初始化UI virtual void initUiMain(); virtual QWidget* initUiMainWx(); virtual void initUiDockPtys(); virtual void initUiDockToolBar(); virtual void initUiDockWxs(); // 绑定属性载体 virtual void bindDockPty(IxPtySource* pPtyObj); // 绑定图形信号 virtual void bindChartSignals(iGuiPlot* pWxPlot); // 执行命令:通常来自图形右侧/左侧的工具栏 virtual bool runActionOf(QString sAction); // 权限验证 bool checkLicensed(bool bPromptLicenseDlg = false); public: signals: // 当通过外界创建了一个PF数据后,刷新到TreeCtrl void sigPfObjFinished(ZxDataGaugeBase* p); // 窗体的大小,附带需要所在的MDI进行变化 // 0: Normal 1 Max 2 Min void sigMdiChildShow(int); // m_pRstWnd为空时,提醒父窗体进行创建指定 void sigNeedCreateRstWnd(bool& ); // 进度条 void sigShowProgressAbout(bool); // 触发信号刷新Ribbon按钮状态 // list可以为id也可以为name // 如果list为空则指的是Ribbon全部,否则仅仅刷新指定的Btn void sigFreshRnStates(QStringList list); // 触发信息,关闭或者显示左侧工区数据树 void sigLeftTreeDocksVisible(bool); /// @brief 在SubWnd中创建Dock并且显示至主窗体之中,该Dock由SubWnd进行管理 /// @param pDockWx (in) Dock指针 /// @param areaDefault(in) 默认布局区域 void sigAppendDock2Main(iDockBaseWx* pDockWx, \ Qt::DockWidgetArea areaDefault = Qt::LeftDockWidgetArea); public slots: // 进度条 virtual void slotPrsRangeSet(int nMin, int nMax); virtual void slotPrsValueSet(int nPos); virtual void slotPrsFormatSet(QString s); // Toolbar按钮消息响应 virtual void slotBtnTriggered(); virtual void slotGraphItemPoliciesInstalled(ZxRenderItem*); // 当前窗体所有信息的保存,比如关闭时提问的保存 virtual bool slotSaveAll(); virtual void slotDblClickShowProperty(bool b); //双击弹出 virtual void slotShowProperty(); virtual void updateView(); // 获取当前主窗口有多少Fit窗口(即;Anal对应的Fitting窗口,也可以扩展为其他同类) virtual void slotGetBrotherFitWnds(QMap& map); // 属性模板 virtual void slotItemPropertyTempl(IxPtySource* p, bool bLoad, bool bSelf); // 外部传递已修改信号 virtual void slotGuiPlotModified(bool b); // 从子控件触发Action virtual void slotChildActioned(QString sAction, bool& b); // 关闭某个字窗体的Confirm virtual void slotConfirmCloseSubWxs(bool& bClosable); // 关闭某个子窗体后触发的响应,刷新布局 virtual void slotSubWxClosed(); // 数据加载信号相应 virtual void slotPfObjSaved(ZxDataGaugeBase* p); protected: /// @brief 绑定子窗体信号(通用的信号部分) /// @param pSubWx 子窗体 说明:pSubWx可能为iGuiPlot,也可能为ZxMdiSubWindow,也可能为其他 /// @param bAttached 该子窗体是否从属于另外的一个窗体,比如双对数窗体,隶属于ZxMdiSubWindowChild /// @note bAttached标识,主要为了避免多重的Close,比如iGuiPlot由destroy信号,而ZxMdiSubWindowChild有close信号 virtual void bindSubWxSignals(QWidget* pSubWx, bool bAttached = false); /// @brief 为了方便,把数据加载对话框,统一整合了一下 /// @param sAction,区分是压力还是流量,通常为 "LoadP"或"LoadF" /// @param bFixWellName 井名是否固定,固定的话,就不允许下拉 /// @param pTargetDataWell 保存到哪口井,如果不设置,则保存至当前井 virtual bool promptDataLoader(QString sAction, \ bool bFixWellName = false, \ ZxDataWell* pTargetDataWell = nullptr); protected: virtual void paintEvent(QPaintEvent *); // /// @brief 拖拽支持 // void dragEnterEvent(QDragEnterEvent *event); // void dropEvent(QDropEvent* event); protected: // 主窗体 ZxMainWindow* m_pMainWindow; // toolbar、属性等成员变量 QToolBar* m_pToolBar; ZxPtyDock* m_pDockPty; QList m_listProps; // 辅助信息,如操作的表名等等 QString m_sExt; // MdiSubWnd Type QString m_sMdiWndType; // 该窗体是否显示ToolBar bool m_bShowToolbar; // 与数据库对应的真实数据(外界传入,本类不进行创建释放维护) ZxDataWell* m_pDataWell; // ID QString m_sWndID; // 从属的Mdi窗口,内含TabWx,主窗口传递过来 ZxMdiSubWindow* m_pMdiChild; // // 按钮类别,如需增加工具栏,只需在构造中对该变量赋值 QString m_sCmdType; // 临时变量,对应的窗体Obj bool m_bDeserialzing; ZxRstWnd* m_pRstWnd; // 临时变量 bool m_bModified; // 进度条 QProgressBar* m_pProgressBar; // 进度条刷新间隔 int m_nProgressLoop; // 临时 bool m_bReadonly; // 临时,当前涉及到的,可能得已经发生保存的压力/流量code,只需要刷新本视窗 QStringList m_listTempSavedPFs; bool m_bUnableSP; //临时变量不参与序列化 // 是否启用新的样式表,ZXF202407,不参与序列化 bool m_bNovelQss; // 该窗口是否强制创建MDI,比如流动段选择+试井设计+IPR+小型压裂准备 需要强制创建Mdi bool m_bForcedMdiWnd; bool m_bRstLoading;//是否加载成果模式,不涉及序列,临时变量 };