#include "nmGUIComponentBase.h" #include "nmDataAttribute.h" #include #include #include #include #include "nmDataAttribute.h" #include #include "nmTranslationManager.h" Q_DECLARE_METATYPE(int*) Q_DECLARE_METATYPE(double*) Q_DECLARE_METATYPE(QString*) nmGUIComponentBase::nmGUIComponentBase(nmDataAttribute* pOriginValue, bool enable, QWidget *parent) : QWidget(parent), m_pLayout(nullptr), m_pNameLabel(nullptr), m_pValueEdit(nullptr), m_pUnitComboBox(nullptr), m_pOriginValue(pOriginValue), m_isEnable(enable), m_eUIType(NM_GUI_Component_Type_LineEdit), m_baseValue(0.0), m_baseUnit(""), m_currentUnit(""), m_valueEditedByUser(false) , m_lastValidValue(""), m_bIsUpdateValue(false) { } bool nmGUIComponentBase::updateValueToOrigin() { if (m_pOriginValue == nullptr) { return false; } QString sValue = ""; // 获取值 if (m_eUIType == NM_GUI_Component_Type_LineEdit) { sValue = static_cast(m_pValueEdit)->text().trimmed(); } else if (m_eUIType == NM_GUI_Component_Type_ComboBox) { sValue = static_cast(m_pValueEdit)->currentText().trimmed(); } if (sValue.isEmpty()) { return false; } QVariant value = m_pOriginValue->getValue(); const int typeId = value.userType(); bool conversionOk = true; QVariant newValue; // 处理数值类型 if (typeId == QVariant::Double || typeId == QVariant::Int) { double inputValue = sValue.toDouble(&conversionOk); if (!conversionOk) { return false; } // 将输入值从当前单位转换为原始单位 const double baseValue = m_pOriginValue->convertValueByUnitType(inputValue, m_currentUnit, m_baseUnit); // 根据数据类型设置新值 if (typeId == QVariant::Int) { newValue = static_cast(baseValue); } else { //newValue = qRound(baseValue * 100.0)/ 100.0; newValue = baseValue; } } // 处理其他类型 else { switch (typeId) { case QVariant::String: newValue = sValue; break; case QVariant::Bool: newValue = sValue.toInt(&conversionOk) != 0; break; default: conversionOk = false; break; } } if (conversionOk) { m_pOriginValue->setValue(newValue); return true; } return false; } bool nmGUIComponentBase::updateValueFromOrigin() { if (!m_pOriginValue || !m_pValueEdit) return false; QVariant val = m_pOriginValue->getValue(); QString s; // 数值类型 if (val.type() == QVariant::Double || val.type() == QVariant::Int) { double baseVal = (val.type() == QVariant::Double ? val.toDouble() : val.toInt()); // 把基础值从 baseUnit 转到 currentUnit double disp = m_pOriginValue->convertValueByUnitType(baseVal, m_baseUnit, m_currentUnit); s = QString::number(disp); } // 字符串类型 else if (val.type() == QVariant::String) { s = val.toString(); } else { s = val.toString(); } // 设置到 QLineEdit 或 QComboBox if (m_eUIType == NM_GUI_Component_Type_LineEdit) { static_cast(m_pValueEdit)->setText(s); m_lastValidValue = s; // 更新有效值 } else { auto cb = static_cast(m_pValueEdit); int idx = cb->findText(s); if (idx>=0) cb->setCurrentIndex(idx); } return true; } //bool nmGUIComponentBase::updateValueFromOrigin() { // if (!m_pOriginValue || !m_pValueEdit) // return false; // // QVariant val = m_pOriginValue->getValue(); // QString s; // // // 数值类型 // if (val.type() == QVariant::Double || val.type() == QVariant::Int) { // double baseVal = (val.type() == QVariant::Double // ? val.toDouble() // : val.toInt()); // // 把基础值从 baseUnit 转到 currentUnit // double disp = m_pOriginValue->convertValueByUnitType(baseVal, m_baseUnit, m_currentUnit); // s = QString::number(disp); // } // // 字符串类型 // else if (val.type() == QVariant::String) { // s = val.toString(); // } // else { // s = val.toString(); // } // // // 设置到 QLineEdit 或 QComboBox // if (m_eUIType == NM_GUI_Component_Type_LineEdit) { // static_cast(m_pValueEdit)->setText(s); // } else { // auto cb = static_cast(m_pValueEdit); // int idx = cb->findText(s); // if (idx>=0) cb->setCurrentIndex(idx); // } // return true; //} void nmGUIComponentBase::init() { this->initUI(); } void nmGUIComponentBase::initUI() { this->initLayout(); this->initComponents(); this->initInitValue(); } void nmGUIComponentBase::initLayout() { m_pLayout = new QHBoxLayout(this); m_pLayout->setContentsMargins(0, 0, 0, 0); m_pLayout->setSpacing(5); } void nmGUIComponentBase::initComponents() { if (!m_pOriginValue) return; QString sName = nmTranslationManager::mapToChinese(m_pOriginValue->getName()); // 初始化标签 - 使用固定宽度 m_pNameLabel = new QLabel(sName, this); m_pNameLabel->setAlignment(Qt::AlignVCenter | Qt::AlignLeft); m_pNameLabel->setFixedWidth(200); m_pLayout->addWidget(m_pNameLabel); // 在标签和输入框之间添加弹性空间 m_pLayout->addStretch(); // 初始化值控件 if (m_eUIType == NM_GUI_Component_Type_LineEdit) { QLineEdit *le = new QLineEdit(this); m_pValueEdit = le; le->setAlignment(Qt::AlignVCenter | Qt::AlignLeft); le->setFixedWidth(137); // 设置固定宽度 connect(le, SIGNAL(textEdited(const QString&)), this, SLOT(onValueEdited(const QString&))); connect(le, SIGNAL(editingFinished()), this, SLOT(onValueEditFinish())); m_pLayout->addWidget(m_pValueEdit); // 初始化单位控件 const QString unitCode = m_pOriginValue->getUnit(); if (!unitCode.isEmpty()) { m_pUnitComboBox = new QComboBox(this); QStringList unitSelections = m_pOriginValue->getListUnitSelections(); for (int i = 0; i < unitSelections.size(); ++i) { const QString &code = unitSelections[i]; QString disp = nmTranslationManager::mapToChinese(code); m_pUnitComboBox->addItem(disp, QVariant(code)); } int idx = unitSelections.indexOf(unitCode); if (idx >= 0) { m_pUnitComboBox->setCurrentIndex(idx); m_currentUnit = m_pUnitComboBox->itemData(idx).toString(); } else { m_currentUnit = unitCode; } connect(m_pUnitComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onUnitChanged(int))); m_pUnitComboBox->setFixedWidth(80); // 给单位下拉框设置固定宽度 m_pLayout->addWidget(m_pUnitComboBox); } else { // 没有单位时,添加相同宽度的占位空间,保持对齐 QWidget* placeholder = new QWidget(this); placeholder->setFixedWidth(80); // 与单位框宽度相同 m_pLayout->addWidget(placeholder); } } else if (m_eUIType == NM_GUI_Component_Type_ComboBox) { m_pValueEdit = new QComboBox(this); QStringList valueSelections = m_pOriginValue->getListValueSelections(); for (int i = 0; i < valueSelections.size(); ++i) { valueSelections[i] = nmTranslationManager::mapToChinese(valueSelections[i]); } static_cast(m_pValueEdit)->addItems(valueSelections); m_pLayout->addWidget(m_pValueEdit); } m_pValueEdit->setEnabled(m_isEnable); } //void nmGUIComponentBase::initComponents() { // if (!m_pOriginValue) return; // // QString sName = nmTranslationManager::mapToChinese(m_pOriginValue->getName()); // // // 初始化标签 // m_pNameLabel = new QLabel(sName, this); // m_pNameLabel->setAlignment(Qt::AlignVCenter | Qt::AlignLeft); // m_pNameLabel->setMinimumWidth(200); // m_pLayout->addWidget(m_pNameLabel, 5); // // // 初始化值控件 // if (m_eUIType == NM_GUI_Component_Type_LineEdit) { // QLineEdit *le = new QLineEdit(this); // m_pValueEdit = le; // le->setAlignment(Qt::AlignVCenter | Qt::AlignLeft); // connect(le, SIGNAL(textEdited(const QString&)), this, SLOT(onValueEdited(const QString&))); // // 编辑完成 // connect(le, SIGNAL(editingFinished()), this, SLOT(onValueEditFinish())); // // // 初始化单位控件 // const QString unitCode = m_pOriginValue->getUnit(); // 英文单位码 // if (!unitCode.isEmpty()) { // m_pUnitComboBox = new QComboBox(this); // QStringList unitSelections = m_pOriginValue->getListUnitSelections(); // 英文列表 // // // 将英文 code 存为 itemData,显示中文 // for (int i = 0; i < unitSelections.size(); ++i) { // const QString &code = unitSelections[i]; // QString disp = nmTranslationManager::mapToChinese(code); // m_pUnitComboBox->addItem(disp, QVariant(code)); // display=中文, data=英文 // } // // // 设置默认索引 // int idx = unitSelections.indexOf(unitCode); // if (idx >= 0) { // m_pUnitComboBox->setCurrentIndex(idx); // m_currentUnit = m_pUnitComboBox->itemData(idx).toString(); // 取英文码 // } // else { // m_currentUnit = unitCode; // } // // connect(m_pUnitComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onUnitChanged(int))); // // m_pLayout->addWidget(m_pValueEdit, 4); // m_pLayout->addWidget(m_pUnitComboBox, 1); // } else { // m_pLayout->addWidget(m_pValueEdit, 5); // } // } // else if (m_eUIType == NM_GUI_Component_Type_ComboBox) { // m_pValueEdit = new QComboBox(this); // QStringList valueSelections = m_pOriginValue->getListValueSelections(); // for (int i = 0; i < valueSelections.size(); ++i) { // valueSelections[i] = nmTranslationManager::mapToChinese(valueSelections[i]); // } // static_cast(m_pValueEdit)->addItems(valueSelections); // m_pLayout->addWidget(m_pValueEdit, 5); // } // // m_pValueEdit->setEnabled(m_isEnable); //} //void nmGUIComponentBase::initInitValue() { // if (!m_pOriginValue) return; // // // 初始化基础值和单位 // m_baseUnit = m_pOriginValue->getUnit(); // m_currentUnit = m_baseUnit; // // const QVariant valueVar = m_pOriginValue->getValue(); // if (valueVar.userType() == QVariant::Double) { // m_baseValue = valueVar.toDouble(); // } else if (valueVar.userType() == QVariant::Int) { // m_baseValue = valueVar.toInt(); // } // // // 设置初始显示值 // if (m_eUIType == NM_GUI_Component_Type_LineEdit) { // if (valueVar.userType() == QVariant::Double || valueVar.userType() == QVariant::Int) { // const double displayValue = m_pOriginValue->convertValueByUnitType(m_baseValue, m_baseUnit, m_currentUnit); // static_cast(m_pValueEdit)->setText(QString::number(displayValue)); // } else { // static_cast(m_pValueEdit)->setText(valueVar.toString()); // } // } //} void nmGUIComponentBase::initInitValue() { if (!m_pOriginValue) return; // 初始化基础值和单位 m_baseUnit = m_pOriginValue->getUnit(); m_currentUnit = m_baseUnit; const QVariant valueVar = m_pOriginValue->getValue(); if (valueVar.userType() == QVariant::Double) { m_baseValue = valueVar.toDouble(); } else if (valueVar.userType() == QVariant::Int) { m_baseValue = valueVar.toInt(); } // 设置初始显示值 if (m_eUIType == NM_GUI_Component_Type_LineEdit) { if (valueVar.userType() == QVariant::Double || valueVar.userType() == QVariant::Int) { const double displayValue = m_pOriginValue->convertValueByUnitType(m_baseValue, m_baseUnit, m_currentUnit); QString valueText = QString::number(displayValue); static_cast(m_pValueEdit)->setText(valueText); m_lastValidValue = valueText; // 保存初始有效值 } else { QString valueText = valueVar.toString(); static_cast(m_pValueEdit)->setText(valueText); m_lastValidValue = valueText; // 保存初始有效值 } } } void nmGUIComponentBase::onUnitChanged(int index) { if (!m_pUnitComboBox || !m_pValueEdit) return; // 只有刚才改过文本,才把显示值写回baseValue if (m_valueEditedByUser) { updateValueToOrigin(); m_valueEditedByUser = false; } // 从 itemData() 读取英文单位码 m_currentUnit = m_pUnitComboBox->itemData(index).toString(); updateValueFromOrigin(); } void nmGUIComponentBase::onValueEdited(const QString &) { // 用户敲入时打标记 m_valueEditedByUser = true; } void nmGUIComponentBase::onValueEditFinish() { if (m_eUIType != NM_GUI_Component_Type_LineEdit) { return; } QLineEdit* pLineEdit = static_cast(m_pValueEdit); QString currentText = pLineEdit->text().trimmed(); // 检查是否为空 if (currentText.isEmpty()) { pLineEdit->setText(m_lastValidValue); return; } // 检查是否为有效数字 bool ok = false; double value = currentText.toDouble(&ok); if (!ok) { // 不是有效数字,恢复上一个有效值 pLineEdit->setText(m_lastValidValue); return; } // 是有效数字,保存并更新到数据源 m_lastValidValue = QString::number(value); // 标准化数字格式 pLineEdit->setText(m_lastValidValue); // 根据是否实时更新数据标记来选择是否立即更新值到数据源 if (m_bIsUpdateValue) { updateValueToOrigin(); } } //void nmGUIComponentBase::onValueEditFinish() //{ // // 根据是否实时更新数据标记来选择是否立即更新值到数据源 // if (m_bIsUpdateValue) // { // updateValueToOrigin(); // } //} void nmGUIComponentBase::setIsRealTimeUpdateValue(bool isUpdate) { m_bIsUpdateValue = isUpdate; } void nmGUIComponentBase::setOriginValue(nmDataAttribute* pOriginValue) { m_pOriginValue = pOriginValue; if (m_pOriginValue) { // 重新初始化单位 m_baseUnit = m_pOriginValue->getUnit(); m_currentUnit = m_baseUnit; // 重新初始化基础值 const QVariant valueVar = m_pOriginValue->getValue(); if (valueVar.userType() == QVariant::Double) { m_baseValue = valueVar.toDouble(); } else if (valueVar.userType() == QVariant::Int) { m_baseValue = valueVar.toInt(); } // 更新单位下拉框(如果存在) if (m_pUnitComboBox) { const QString unitCode = m_pOriginValue->getUnit(); QStringList unitSelections = m_pOriginValue->getListUnitSelections(); // 清空并重新填充 m_pUnitComboBox->clear(); for (int i = 0; i < unitSelections.size(); ++i) { const QString &code = unitSelections[i]; QString disp = nmTranslationManager::mapToChinese(code); m_pUnitComboBox->addItem(disp, QVariant(code)); } // 设置当前索引 int idx = unitSelections.indexOf(unitCode); if (idx >= 0) { m_pUnitComboBox->setCurrentIndex(idx); } } // 更新标签名称(如果需要) if (m_pNameLabel) { QString sName = nmTranslationManager::mapToChinese(m_pOriginValue->getName()); m_pNameLabel->setText(sName); } // 更新显示值 updateValueFromOrigin(); } }