From dffbe9da7a1d3581bbe27f14c660d1c5bac36971 Mon Sep 17 00:00:00 2001 From: lh <2334563547@qq.com> Date: Mon, 17 Aug 2026 10:25:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(nmNum):=20=E5=AE=8C=E5=96=84=E5=82=A8?= =?UTF-8?q?=E5=B1=82=E5=8F=82=E6=95=B0=E8=BE=93=E5=85=A5=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 使用参数中文别名和参数 ID 生成输入框悬浮提示 - 在悬浮提示中显示当前单位对应的有效范围 - 参数校验失败时将输入文字和提示文字标红 - 校验恢复正常后还原输入框原始文字颜色 - 使用调色板更新文字颜色,保留 Qt 原生输入框边框和右键菜单 --- .../nmSubWxs/nmReservoirParameterField.h | 2 + .../nmSubWxs/nmReservoirParameterField.cpp | 44 +++++++++++++++++-- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/Include/nmNum/nmSubWxs/nmReservoirParameterField.h b/Include/nmNum/nmSubWxs/nmReservoirParameterField.h index d1d67a2..7669d9f 100644 --- a/Include/nmNum/nmSubWxs/nmReservoirParameterField.h +++ b/Include/nmNum/nmSubWxs/nmReservoirParameterField.h @@ -3,6 +3,7 @@ #include "nmSubWxs_global.h" #include "nmReservoirParameterCatalog.h" +#include #include #include @@ -157,6 +158,7 @@ private: QComboBox* m_pValueComboBox; ///< 枚举值下拉框。 QComboBox* m_pUnitComboBox; ///< 可换算单位下拉框。 QLabel* m_pUnitLabel; ///< 无单位字段的空白对齐占位。 + QColor m_clrNormalText; ///< 输入框默认文字颜色。 bool m_bVisible; ///< 参数行是否参与编辑。 bool m_bUpdating; ///< 程序写值时阻止业务信号。 }; diff --git a/Src/nmNum/nmSubWxs/nmReservoirParameterField.cpp b/Src/nmNum/nmSubWxs/nmReservoirParameterField.cpp index 6e80ce8..e82e0ba 100644 --- a/Src/nmNum/nmSubWxs/nmReservoirParameterField.cpp +++ b/Src/nmNum/nmSubWxs/nmReservoirParameterField.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include namespace @@ -31,6 +32,24 @@ QString fieldText(const char* pText) "nmReservoirParameterField", pText); } +/** @brief 根据有效状态生成悬浮提示文字。 */ +QString validationToolTip(const QString& sText, bool bValid) +{ + if (bValid) + { + return sText; + } + + QString sEscaped = sText; + sEscaped.replace("&", "&"); + sEscaped.replace("<", "<"); + sEscaped.replace(">", ">"); + sEscaped.replace("\"", """); + sEscaped.replace("\n", "
"); + return "" + + sEscaped + ""; +} + } nmReservoirParameterField::nmReservoirParameterField( @@ -46,6 +65,7 @@ nmReservoirParameterField::nmReservoirParameterField( m_pValueComboBox(nullptr), m_pUnitComboBox(nullptr), m_pUnitLabel(nullptr), + m_clrNormalText(), m_bVisible(true), m_bUpdating(false) { @@ -149,6 +169,7 @@ bool nmReservoirParameterField::createNumericEditor( QSizePolicy::Fixed); m_pLineEdit = new QLineEdit(pParentWidget); + m_clrNormalText = m_pLineEdit->palette().color(QPalette::Text); m_pLineEdit->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); m_pLineEdit->setFixedHeight(editorHeight()); m_pLineEdit->setMinimumWidth(editorMinimumWidth()); @@ -399,12 +420,17 @@ QString nmReservoirParameterField::formatBaseValue(double dValue) const void nmReservoirParameterField::updateValidationAppearance(bool bValid) { - Q_UNUSED(bValid); if (m_pLineEdit == nullptr || m_pParameter == nullptr) { return; } + // 只修改文字色,避免Qt 4.8样式表绘制覆盖原生输入框边框。 + QPalette oPalette = m_pLineEdit->palette(); + oPalette.setColor(QPalette::Text, + bValid ? m_clrNormalText : QColor(Qt::red)); + m_pLineEdit->setPalette(oPalette); + QString sCurrentUnit; iUnitGroup* pUnitGroup = nullptr; if (m_pUnitComboBox != nullptr && m_pUnitService != nullptr) @@ -414,7 +440,19 @@ void nmReservoirParameterField::updateValidationAppearance(bool bValid) } QString sRange = iParaItemCtrl::getScaleStrOf( m_pParameter, sCurrentUnit, pUnitGroup); - QString sHelp = m_pParameter->m_sDesc; + // 参数别名来自当前语言XML,稳定ID便于定位参数定义。 + QString sHelp = m_pParameter->m_sAlias; + if (!m_pParameter->m_sName.isEmpty()) + { + if (!sHelp.isEmpty()) + { + sHelp += "[" + m_pParameter->m_sName + "]"; + } + else + { + sHelp = m_pParameter->m_sName; + } + } if (!sRange.isEmpty()) { if (!sHelp.isEmpty()) @@ -423,7 +461,7 @@ void nmReservoirParameterField::updateValidationAppearance(bool bValid) } sHelp += sRange; } - m_pLineEdit->setToolTip(sHelp); + m_pLineEdit->setToolTip(validationToolTip(sHelp, bValid)); m_pLineEdit->setWhatsThis(sHelp); if (m_pLabel != nullptr) {