From 3460b4680e39175e2359c7a24b163dbc5b1811a1 Mon Sep 17 00:00:00 2001 From: lh <2334563547@qq.com> Date: Fri, 21 Aug 2026 17:00:49 +0800 Subject: [PATCH] =?UTF-8?q?refactor(nmNum):=20=E8=B0=83=E6=95=B4=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E4=BA=95=E8=BA=AB=E4=BB=BD=E4=BF=A1=E6=81=AF=E5=B8=83?= =?UTF-8?q?=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将井号、井名和井型从基础参数分组中独立出来 - 在左侧参数区顶部固定显示井信息 - 只读展示项目级井号,保留井名编辑和同步逻辑 - 简化 nmWellParameterPanel 的控件管理职责 - 移除参数目录中不再使用的基础分组标记 - 更新中文翻译及 QM 资源 --- Bin/Config/Lang/cn/nmNum_cn.qm | Bin 109177 -> 109383 bytes Bin/Config/Lang/cn/nmNum_cn.ts | 7 +- .../nmNum/nmSubWxs/nmWellParameterCatalog.h | 1 - Include/nmNum/nmSubWxs/nmWellParameterPanel.h | 12 --- Include/nmNum/nmSubWxs/nmWxWellEditor.h | 4 + Src/nmNum/nmSubWxs/nmWellParameterCatalog.cpp | 4 +- Src/nmNum/nmSubWxs/nmWellParameterPanel.cpp | 70 +----------------- Src/nmNum/nmSubWxs/nmWxWellEditor.cpp | 61 ++++++++++++++- 8 files changed, 69 insertions(+), 90 deletions(-) diff --git a/Bin/Config/Lang/cn/nmNum_cn.qm b/Bin/Config/Lang/cn/nmNum_cn.qm index c8e1a961b32bd9612b79b84e55399ee7b772019e..fb48122b6417ef9a6f0f890d539f946cd18fb6d6 100644 GIT binary patch delta 7144 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 K?v#>E>i+|zvQd!$ delta 7063 zcmXY$c|c9u7suB=_nvd_xuZ(bcolU`l}71RRH8W*FQTXnDH%#Khj@f|Ig-d29wN^W zkM|@hGE_(inUXnk&+w$*a`*4A&)uiGXYVz9*IK&^H@UAjI75%W#&^B+wlJ^8((KH* z9jBXo0D3*oHPrHl0bnGMVDnr*O|MtD7=?>)WHi78DKZ71;SlA!HXX^V$GJHcOq_M@ z!GU}QfOrGI&FtJZ`^;~+*oBL7TKdLTUb#(#er>KpthJ8D;O$|I!c1mXy=!7m{=vy3S~%oEI0pL{wK!iTPA0LsphrJ<`)dP{s(R66?h_wL1Wkzqnbb!be0M*Hq zw@xB|;Cc(?Ep*$6^8gpo+#|jN6nE8;Sk?)KA{(aGN$?aIIqXE2jsj@JjYg*e{P0CK z0wg`6JccIvxvsqjFnSyi^)z9bXo$?*8h_;kTBBNM5ZN1}1JewE%=be6z^AzTIY)u? zw-C(5uI_Umg7_-_!8>yh*H1!&22dvb4dUBrK$KfS{JI~I=xkucbpYSS0_%cKcoih% zh`nU0Fkt;%fEc|L8pL*vYALWAtAOYorZhfIsX0w)Pyqq1W%dmnN%&dH6hB~(qOr${DNBoitrBAnu#|Vk=txZN zQ#v#OTXz9S<|$zB^+ku(vt50r8UWYD4~YCBa4QxAoE!pNK`s#UNx&7M*OQk~o=gMo zLLQJouR+3P0Gv7k616LkNlt<-ry(gq2xr7E0ts%Mcoz#PoYAN+AhlHiEb{{8d21k@ zhlA=n=I~#?fjSD~v|k|@ZnzJyE)$F=9sn4(70e27d-{JE_-B6vGTZi6Mz=qyT)Q-X_Bo7o7_%r_u`9S}VU-}yryMo)A?&w0X_VRJF!x51dK zQXro4}VftF>NXQ<_L5C=ZU7;NJ8e;z2izzspa;gWVa97&N zu{B7yAZ9Zlwm<+fG8-o476O^(3yHI)0+icA;vOwP))Sble+*AJR50g_$W_6Gx7V8j z^M7uz+bzm)OCg=NF&W?mYf=gTx{QGQ^%$u`qo9Z{$8%Z>rMzZ93KS2Sf-g7<$DMqE z%r=Fx-CjWai=m?b2=wS=xVSC~po*is*;z-@eXF39X}y!7Zb<{C7pUi!TLFg^_V8;}+Zo zaLbKx3q`J)$P6s71NiVoNKsh$JWXVVH?098eayty;A88z%#3UGKw|2d)H}5R0oBaR zPnH0!pPBSF-1yq{%%Z0Y0XmIjvfh3GccmUgY=IWC1_(y)s&2Cspluw!4olgO={K`CDd=a3zGxMZ^2gsRB zdC-~i%3;de)jEwU?k&TR8U8ikudu0`y!d@@R1caJnq=T8+k-w_P-7wit+EtH|38jignH ze7Ww(NFhdTA6F^z|7q}V-9-W0?0~p*hyqumHM;Z{g}p<^KqO`MB+)P*R5wQ-QG~ZK zknsydk^6BC`J&{AKuV zyGGHD%@|`LLqt2nc4IfSUbMHV2uSY=Q89;^tvw?;T!FTGbVPLQI>sb-O!U`*1}xBm zj@ajjPRjNJ>2*d(>14#e5S`sGU{=@)Ih~9~rHkrsYz4TKCi)rkkP#_*<@E;0uiHg! zVeY8kT__u$Q9hd>Cf7~^{B}VsxrQeTxG3g(4FDLFBUX$E1~Pgb<+L`Ty_1pgQ?bL0 zBN%!)VwYq1mNPTO-gBxjN@4|DJxykjI69;e18=@K<|1m!tT6G|1Pu30bHoWpeqU!LI@`q(oey>V~~RwYa+CC_tFIjs*Hqjs$V_g_+pv){AR0 zG4NVq#kIvNK@OLDiR)&q#~;KBAqGZ#k@!{nCm?gT3MmHK0eP%wK?QzUk&XmzuwqpY zfbQ>Ews1Xex|MQXH&${*0AQA|itXtDUm}GXgD|}+*5bbx0QT9eCJ?8BHcP>_v&Nx= zwV!DP;K;E~464!n`K)X3V9dwctlQ}Mm>D^glQUSqVyygrDZ+xz7MTkI*>UlU0bJE= zVmq4mbuc^S1e�Gq}bpgdn^GgkYfI7PC*ZT19^eqopYiCdrkk@Aqej>OoMT@ixq zMu0n;?fDQOhNnE7%&s0%1;ibRfId*Bb;ALu1(`J9cC7R7_SQ!PC&y zv8R+Re)cDj1atQ2!Wtl*`mrZ^Z^0N>u&3|!Mwj$q&rCZ2#K4;^A6bi$@K)Gus4;G0 z@1%AISa6lSyXZ6K)fe{ePm9mV6`Bl<`19;*AJmI4RYJR=QDzSNJz*g#tVl;PBZ7km zX+Wl2;fNM9`1?6dI_@!m{vb}jFagWQKF;jwP9Wl2oTUm6)7O^MPMHdz{+H8U%D^H$ zo3k^+9VhPP942CpZ))M3UD0?i+&R}SsBzECIG>PEfOAotuP?qgzS|QndKZ?^+4(vW zrIw36xD;SsZ^}Q8BX?nxnsZ~P-vF{`05`TBWiEOk7ayC4Rqi1dUsVe*gyE)KiN*%z z8#luhC#j*AxETXK0_pj?(ALGqow#wU3TFbb9>J|?M5BikaO;-e$407y6RLUuVJszQ9hU}j4;v!lyMt&U&QG_MESaq+cFMIuYri$cG>_)6mYvQ4a3yv;P&(u z1M&UH?TIb}BGcpkc=#)pXiKi-B5KulYvHt!#&``^Ha-%)IEgE_!4Bn@67DST24q6E z&}O9Je{fBusMo_b2I>G?(S%Un-vZtEojot=R6F&1jN zI@(NK17zwq$;hQ;*t49LOse~gL)`+&WNj}T4K7F~_Zf=@KOoo|+mnStjInEUV6r50 z7yeP-S&~H%h($?C>8vkV?2d*R+#p$g2;F?TRq``eNW=)q^5?kjbWXBzKJM<>`Z=}@JYBCG3W)^|INz!6K+lieiolB*E4(*5S#5L(rlS+VWJLzAs*hWj&NdJj8 zyR-b1o%r+VY5X+9BK*CLl*yO)X~Afzsq6T3@B7$E+4FNAF#!FB^NVlp#u2+Gzxoit ztnS7ah6bR9{lV|bU4~)vfZyZRfD_vG(kh+x_I&WXc(@ zg&IqXOqHH|aQ=FnZSv$n$rS)2XH#ywE)UK{%j^44x{sDe{DRKpFUupIKgJ8(f$~xF zn}LY_l#d&mgi$n09)IyQz(Nno6Q1&fb0`SiCsQWAkteOi6m;q*pJq4%K<}wM{g?aD z2Wr}MAE41)zTnFmfWYPQC3Cw0XtU%?@C%7)qkLH!PPLwcg*+?!0j=_UQ9a)2ypwNS zR)Il3R=(K=gVotdzEyh;#Wq8}9SQThQXZTp-{-O4C)rTniCWmw+w<)@R} zu?e-6SBIdjtS-o#S)2`C{ULv=MF}rEEdRLf5kTia`IkQfa3YD4x5pDy$Jg>7a~5IM z43T$Oe8pI3Rxn%E0rakU8*> zqUW4X*dSOa978Q}q^(u-*J2Jg9ap&R3&e54U*TaR!#k!W3P0zm_=TGkL)T#r56x8s zuTID2wwUsRpN_=Fm~wJ}BJ{vRtVO*Qp@&d!EgmYu?jFM=xS@!AJ`N?!M=^Z;N-!XO z|5n8NMxnr#C=%-MWTV;z>mC~8?}~Y1JFGdg6^mlY+uFu6VX7@_X-QFHRQUm#o9izRB8Lp5^q0uDThR2hy=wegGDi@enHBJ z1r9i@J1P?@?%Z(v__ftRS|3!UaekGMGcL_gixts9IzuB1gcmC)}jw5RAcY#$AB?V zCFf)LpTMhTl@$RP>Zx)@`(pCGROKGR9hn8GHb-p2tJ_7YExQZ>E__rSDYF1FG(>ge z>Q?Nn(pCT9KU9dt@2c8`_*^esReKU6PCss>s`gsq<9Z;pX|;GYY2MSG z92Y`*#=3uXP<#EGj>$Gc?U!$j$vjOxbyug^RUUVCa+Z-45Vhb7m-ablK zPxa!tUI6B0>ZRAu;7sKwg!Jkkep$V(0QJu0&M0ac^`3p%cxB8b9R7zZ$rQ+KSu zcb0{rX%=N1HR+vLnV(QdOa-r3Ci!!>5VM~jjxK(abs&HAW>TBKu8^F_U$l{QJyEfR HELHvwJ=H~& diff --git a/Bin/Config/Lang/cn/nmNum_cn.ts b/Bin/Config/Lang/cn/nmNum_cn.ts index d03690b..da78834 100644 --- a/Bin/Config/Lang/cn/nmNum_cn.ts +++ b/Bin/Config/Lang/cn/nmNum_cn.ts @@ -6542,8 +6542,6 @@ Average pressure in contour: %2 MPa nmWellParameterPanel The well working copy is unavailable.井工作副本不可用。 - Well name井名 - Well type井型 Perforation射孔段 Perforation %1射孔段 %1 No perforations无射孔段 @@ -6559,6 +6557,11 @@ Average pressure in contour: %2 MPa nmWxWellEditor Edit well编辑井 The well working copy is unavailable.井工作副本不可用。 + Well information井信息 + Well number井号 + Well name井名 + Well type井型 + Project-level unique well identifier项目级唯一井标识 Vertical well直井 Fractured vertical well压裂直井 Multistage fractured horizontal well多段压裂水平井 diff --git a/Include/nmNum/nmSubWxs/nmWellParameterCatalog.h b/Include/nmNum/nmSubWxs/nmWellParameterCatalog.h index 4ed1b8b..52b5784 100644 --- a/Include/nmNum/nmSubWxs/nmWellParameterCatalog.h +++ b/Include/nmNum/nmSubWxs/nmWellParameterCatalog.h @@ -41,7 +41,6 @@ struct NM_SUB_WXS_EXPORT nmWellParameterGroupInfo QString m_sTitle; ///< 当前语言下的分组标题。 QList m_listFields; ///< 分组字段。 - bool m_bBasicGroup; ///< 是否承载井名和井型控件。 bool m_bPerforationGroup; ///< 是否创建射孔选择器。 }; diff --git a/Include/nmNum/nmSubWxs/nmWellParameterPanel.h b/Include/nmNum/nmSubWxs/nmWellParameterPanel.h index 9d462eb..948b4c0 100644 --- a/Include/nmNum/nmSubWxs/nmWellParameterPanel.h +++ b/Include/nmNum/nmSubWxs/nmWellParameterPanel.h @@ -14,7 +14,6 @@ class nmIParameterUnitService; class nmParameterField; struct nmWellParameterGroupInfo; class QComboBox; -class QLineEdit; class QVBoxLayout; /** @@ -43,12 +42,6 @@ public: /** @brief 返回全部可见输入是否有效。 */ bool isInputValid(); - /** @brief 返回基础参数分组中的井名输入框,不转移所有权。 */ - QLineEdit* wellNameEditor() const; - - /** @brief 返回基础参数分组中的井型选择器,不转移所有权。 */ - QComboBox* wellTypeEditor() const; - /** @brief 将焦点移动到第一个无效字段。 */ void focusFirstInvalid(); @@ -93,9 +86,6 @@ private: /** @brief 仅同步当前射孔名称,不改变选择器结构和当前选中项。 */ void updateCurrentPerforationItem(); - /** @brief 将井信息控件移回面板,避免分组重建时被一并销毁。 */ - void detachWellInformationEditors(); - /** @brief 收集基准单位值并执行字段及关联规则校验。 */ bool collectValues(QMap& mapValues, QString& sError, @@ -121,8 +111,6 @@ private: nmIParameterUnitService* m_pUnitService; ///< 单位服务,不拥有所有权。 nmDataWellBase* m_pWell; ///< 当前工作副本,不拥有所有权。 QVBoxLayout* m_pMainLayout; ///< 单列分组布局。 - QLineEdit* m_pWellNameLineEdit; ///< 基础分组中的井名输入框。 - QComboBox* m_pWellTypeComboBox; ///< 基础分组中的井型选择器。 QComboBox* m_pPerforationComboBox; ///< 当前射孔选择器。 QList m_listFields; ///< 当前井型字段。 QMap m_mapFields; ///< 稳定ID字段映射。 diff --git a/Include/nmNum/nmSubWxs/nmWxWellEditor.h b/Include/nmNum/nmSubWxs/nmWxWellEditor.h index 3dc7084..55af736 100644 --- a/Include/nmNum/nmSubWxs/nmWxWellEditor.h +++ b/Include/nmNum/nmSubWxs/nmWxWellEditor.h @@ -98,6 +98,9 @@ private: /** @brief 创建左侧参数区、右侧轨迹区和底部命令区。 */ void createUi(); + /** @brief 创建固定显示的井号、井名和井型信息区。 */ + QWidget* createWellInformationWidget(QWidget* pParent); + /** @brief 创建时间变表皮入口、校验提示和确认按钮区。 */ QWidget* createFooter(); @@ -124,6 +127,7 @@ private: nmWellParameterPanel* m_pParameterPanel; ///< 左侧单列参数分组。 nmWxWellboreTrajectoryDisplay* m_pTrajectoryDisplay; ///< 右侧轨迹视图。 nmWellEditorController* m_pWellEditorController; ///< 轨迹交互控制器。 + QLineEdit* m_pWellCodeLineEdit; ///< 只读项目级井号。 QLineEdit* m_pWellNameLineEdit; ///< 井名输入框。 QComboBox* m_pWellTypeComboBox; ///< 井型选择器。 QCheckBox* m_pTimeDependentCheckBox; ///< 时间变表皮开关。 diff --git a/Src/nmNum/nmSubWxs/nmWellParameterCatalog.cpp b/Src/nmNum/nmSubWxs/nmWellParameterCatalog.cpp index 2217303..897fd08 100644 --- a/Src/nmNum/nmSubWxs/nmWellParameterCatalog.cpp +++ b/Src/nmNum/nmSubWxs/nmWellParameterCatalog.cpp @@ -63,8 +63,7 @@ nmWellParameterGroupInfo parameterGroup(const char* pTitle) } nmWellParameterGroupInfo::nmWellParameterGroupInfo() - : m_bBasicGroup(false), - m_bPerforationGroup(false) + : m_bPerforationGroup(false) { } @@ -76,7 +75,6 @@ QList nmWellParameterCatalog::createGroups( // 第一步:所有支持井型都显示通用井筒参数。 nmWellParameterGroupInfo oBasic = parameterGroup("Basic parameters"); - oBasic.m_bBasicGroup = true; oBasic.m_listFields << numericField(NM_WELL_PARAMETER_X, "W_X") << numericField(NM_WELL_PARAMETER_Y, "W_Y") diff --git a/Src/nmNum/nmSubWxs/nmWellParameterPanel.cpp b/Src/nmNum/nmSubWxs/nmWellParameterPanel.cpp index 463df1f..4333daa 100644 --- a/Src/nmNum/nmSubWxs/nmWellParameterPanel.cpp +++ b/Src/nmNum/nmSubWxs/nmWellParameterPanel.cpp @@ -38,8 +38,6 @@ nmWellParameterPanel::nmWellParameterPanel( m_pUnitService(pUnitService), m_pWell(nullptr), m_pMainLayout(new QVBoxLayout(this)), - m_pWellNameLineEdit(new QLineEdit(this)), - m_pWellTypeComboBox(new QComboBox(this)), m_pPerforationComboBox(nullptr), m_listFields(), m_mapFields(), @@ -53,19 +51,6 @@ nmWellParameterPanel::nmWellParameterPanel( m_pMainLayout->setContentsMargins(8, 8, 8, 8); m_pMainLayout->setSpacing(10); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); - - m_pWellNameLineEdit->setFixedHeight(nmParameterField::editorHeight()); - m_pWellNameLineEdit->setMinimumWidth( - nmParameterField::editorMinimumWidth()); - m_pWellNameLineEdit->setSizePolicy( - QSizePolicy::Expanding, QSizePolicy::Fixed); - m_pWellTypeComboBox->setFixedHeight(nmParameterField::editorHeight()); - m_pWellTypeComboBox->setMinimumWidth( - nmParameterField::editorMinimumWidth()); - m_pWellTypeComboBox->setSizePolicy( - QSizePolicy::Expanding, QSizePolicy::Fixed); - m_pWellNameLineEdit->hide(); - m_pWellTypeComboBox->hide(); } nmWellParameterPanel::~nmWellParameterPanel() @@ -216,16 +201,6 @@ bool nmWellParameterPanel::isInputValid() return collectValues(mapValues, sError); } -QLineEdit* nmWellParameterPanel::wellNameEditor() const -{ - return m_pWellNameLineEdit; -} - -QComboBox* nmWellParameterPanel::wellTypeEditor() const -{ - return m_pWellTypeComboBox; -} - void nmWellParameterPanel::focusFirstInvalid() { // 按界面显示顺序定位错误,使用户无需自行查找红色字段。 @@ -368,8 +343,6 @@ void nmWellParameterPanel::slotWellDataChanged() void nmWellParameterPanel::clearGroups() { - // 井信息控件跨井型复用,删除旧基础分组前先转移回参数面板。 - detachWellInformationEditors(); m_listFields.clear(); m_mapFields.clear(); m_pPerforationComboBox = nullptr; @@ -386,22 +359,6 @@ void nmWellParameterPanel::clearGroups() } } -void nmWellParameterPanel::detachWellInformationEditors() -{ - if (m_pWellNameLineEdit != nullptr && - m_pWellNameLineEdit->parentWidget() != this) - { - m_pWellNameLineEdit->setParent(this); - m_pWellNameLineEdit->hide(); - } - if (m_pWellTypeComboBox != nullptr && - m_pWellTypeComboBox->parentWidget() != this) - { - m_pWellTypeComboBox->setParent(this); - m_pWellTypeComboBox->hide(); - } -} - bool nmWellParameterPanel::buildGroup( const nmWellParameterGroupInfo& oGroupInfo, QString& sError) @@ -421,27 +378,8 @@ bool nmWellParameterPanel::buildGroup( pFieldLayout->setColumnMinimumWidth( 2, nmParameterField::unitMinimumWidth()); - // 第二步:基础分组先挂载井信息,输入控件固定在第二列,第三列留给单位。 + // 第二步:射孔选择器只占第二列,不侵入单位列。 int nRowOffset = 0; - if (oGroupInfo.m_bBasicGroup) - { - QLabel* pNameLabel = new QLabel(tr("Well name"), pGroupBox); - QLabel* pTypeLabel = new QLabel(tr("Well type"), pGroupBox); - pNameLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); - pTypeLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); - - m_pWellNameLineEdit->setParent(pGroupBox); - m_pWellTypeComboBox->setParent(pGroupBox); - pFieldLayout->addWidget(pNameLabel, 0, 0); - pFieldLayout->addWidget(m_pWellNameLineEdit, 0, 1); - pFieldLayout->addWidget(pTypeLabel, 1, 0); - pFieldLayout->addWidget(m_pWellTypeComboBox, 1, 1); - m_pWellNameLineEdit->show(); - m_pWellTypeComboBox->show(); - nRowOffset = 2; - } - - // 第三步:射孔选择器同样只占第二列,不侵入单位列。 if (oGroupInfo.m_bPerforationGroup) { QLabel* pSelectorLabel = new QLabel(tr("Perforation"), pGroupBox); @@ -456,7 +394,7 @@ bool nmWellParameterPanel::buildGroup( nRowOffset = 1; } - // 第四步:按目录顺序创建字段,并建立稳定ID到字段对象的索引。 + // 第三步:按目录顺序创建字段,并建立稳定ID到字段对象的索引。 for (int nIndex = 0; nIndex < oGroupInfo.m_listFields.size(); ++nIndex) { nmParameterField* pField = new nmParameterField( @@ -468,10 +406,6 @@ bool nmWellParameterPanel::buildGroup( 0, sError)) { - if (oGroupInfo.m_bBasicGroup) - { - detachWellInformationEditors(); - } delete pGroupBox; return false; } diff --git a/Src/nmNum/nmSubWxs/nmWxWellEditor.cpp b/Src/nmNum/nmSubWxs/nmWxWellEditor.cpp index 80d8bbc..fc6f069 100644 --- a/Src/nmNum/nmSubWxs/nmWxWellEditor.cpp +++ b/Src/nmNum/nmSubWxs/nmWxWellEditor.cpp @@ -18,11 +18,14 @@ #include #include #include +#include +#include #include #include #include #include #include +#include #include #include #include @@ -39,6 +42,7 @@ nmWxWellEditor::nmWxWellEditor(const nmWellEditContext& oContext, m_pParameterPanel(nullptr), m_pTrajectoryDisplay(nullptr), m_pWellEditorController(nullptr), + m_pWellCodeLineEdit(nullptr), m_pWellNameLineEdit(nullptr), m_pWellTypeComboBox(nullptr), m_pTimeDependentCheckBox(nullptr), @@ -88,6 +92,7 @@ bool nmWxWellEditor::initialize(QString& sError) } // 第一步:同步井信息和时间变表皮控件。 + m_pWellCodeLineEdit->setText(pWell->getWellCode()); m_pWellNameLineEdit->setText(pWell->getWellName()); int nWellTypeIndex = m_pWellTypeComboBox->findData( static_cast(pWell->getWellType())); @@ -380,21 +385,21 @@ void nmWxWellEditor::createUi() pMainLayout->setContentsMargins(12, 10, 12, 0); pMainLayout->setSpacing(8); - // 第一步:左侧全部信息进入同一滚动参数面板,右侧保持常驻轨迹视图。 + // 第一步:左侧固定井信息并滚动参数分组,右侧保持常驻轨迹视图。 m_pMainSplitter = new QSplitter(Qt::Horizontal, this); m_pMainSplitter->setChildrenCollapsible(false); QWidget* pParameterContainer = new QWidget(m_pMainSplitter); QVBoxLayout* pParameterLayout = new QVBoxLayout(pParameterContainer); pParameterLayout->setContentsMargins(0, 0, 0, 0); - pParameterLayout->setSpacing(0); + pParameterLayout->setSpacing(8); QScrollArea* pScrollArea = new QScrollArea(pParameterContainer); pScrollArea->setWidgetResizable(true); pScrollArea->setFrameShape(QFrame::NoFrame); m_pParameterPanel = new nmWellParameterPanel(this, pScrollArea); - m_pWellNameLineEdit = m_pParameterPanel->wellNameEditor(); - m_pWellTypeComboBox = m_pParameterPanel->wellTypeEditor(); + pParameterLayout->addWidget( + createWellInformationWidget(pParameterContainer)); m_pWellTypeComboBox->addItem( tr("Vertical well"), static_cast(Vertical_Well)); m_pWellTypeComboBox->addItem( @@ -431,6 +436,54 @@ void nmWxWellEditor::createUi() this, SLOT(slotPanelValidationMessageChanged(QString))); } +QWidget* nmWxWellEditor::createWellInformationWidget(QWidget* pParent) +{ + QGroupBox* pInformationGroup = new QGroupBox( + tr("Well information"), pParent); + QGridLayout* pInformationLayout = new QGridLayout(pInformationGroup); + pInformationLayout->setContentsMargins(8, 15, 8, 10); + pInformationLayout->setHorizontalSpacing(6); + pInformationLayout->setVerticalSpacing(6); + pInformationLayout->setColumnStretch(0, 0); + pInformationLayout->setColumnStretch(1, 1); + + QLabel* pCodeLabel = new QLabel(tr("Well number"), pInformationGroup); + QLabel* pNameLabel = new QLabel(tr("Well name"), pInformationGroup); + QLabel* pTypeLabel = new QLabel(tr("Well type"), pInformationGroup); + pCodeLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); + pNameLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); + pTypeLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); + + m_pWellCodeLineEdit = new QLineEdit(pInformationGroup); + m_pWellNameLineEdit = new QLineEdit(pInformationGroup); + m_pWellTypeComboBox = new QComboBox(pInformationGroup); + m_pWellCodeLineEdit->setReadOnly(true); + m_pWellCodeLineEdit->setToolTip( + tr("Project-level unique well identifier")); + + QList listEditors; + listEditors << m_pWellCodeLineEdit + << m_pWellNameLineEdit + << m_pWellTypeComboBox; + for (int nIndex = 0; nIndex < listEditors.size(); ++nIndex) + { + listEditors[nIndex]->setFixedHeight( + nmParameterField::editorHeight()); + listEditors[nIndex]->setMinimumWidth( + nmParameterField::editorMinimumWidth()); + listEditors[nIndex]->setSizePolicy( + QSizePolicy::Expanding, QSizePolicy::Fixed); + } + + pInformationLayout->addWidget(pCodeLabel, 0, 0); + pInformationLayout->addWidget(m_pWellCodeLineEdit, 0, 1); + pInformationLayout->addWidget(pNameLabel, 1, 0); + pInformationLayout->addWidget(m_pWellNameLineEdit, 1, 1); + pInformationLayout->addWidget(pTypeLabel, 2, 0); + pInformationLayout->addWidget(m_pWellTypeComboBox, 2, 1); + return pInformationGroup; +} + QWidget* nmWxWellEditor::createFooter() { QWidget* pFooter = new QWidget(this);