EnergySpectrumAnalyer/src/NuclideLib/NuclideRayDialog.cpp

134 lines
5.0 KiB
C++
Raw Normal View History

#include "NuclideRayDialog.h"
NuclideRayDialog::NuclideRayDialog(bool isEdit, const QStringList& rayData, QWidget *parent)
: QDialog(parent), m_isEdit(isEdit)
{
// 编辑模式下提取ID和已有数据
if (isEdit && !rayData.isEmpty()) {
m_id = rayData[0]; // 第一个元素是ID
}
initUI();
// 编辑模式:填充已有数据
if (isEdit && rayData.size() >= 8) {
m_cmbRayType->setCurrentText(rayData[1]);
m_leRayMev->setText(rayData[2]);
m_leRayMevUnc->setText(rayData[3]);
m_leBranchRatio->setText(rayData[4]);
m_leBranchRatioUnc->setText(rayData[5]);
m_cmbMainRayIdent->setCurrentText(rayData[6]);
m_leJiahePeak->setText(rayData[7]);
}
}
void NuclideRayDialog::initUI()
{
setWindowTitle(m_isEdit ? QStringLiteral(u"编辑射线信息") : QStringLiteral(u"添加射线信息"));
setFixedSize(450, 300);
QFormLayout *formLayout = new QFormLayout(this);
// 射线类型下拉框(常用核素射线类型)
m_cmbRayType = new QComboBox(this);
m_cmbRayType->addItems({QStringLiteral(u"γ"), QStringLiteral(u"β⁻"), QStringLiteral(u"β⁺"), QStringLiteral(u"α"), QStringLiteral(u"X射线"), QStringLiteral(u"中子"), QStringLiteral(u"电子俘获")});
formLayout->addRow(QStringLiteral(u"射线类型"), m_cmbRayType);
m_leRayMev = new QLineEdit(this);
m_leRayMev->setPlaceholderText(QStringLiteral(u"例如1.332 MeV"));
formLayout->addRow(QStringLiteral(u"射线能量"), m_leRayMev);
m_leRayMevUnc = new QLineEdit(this);
m_leRayMevUnc->setPlaceholderText(QStringLiteral(u"例如0.001 MeV"));
formLayout->addRow(QStringLiteral(u"能量不确定度"), m_leRayMevUnc);
m_leBranchRatio = new QLineEdit(this);
m_leBranchRatio->setPlaceholderText(QStringLiteral(u"例如0.9998"));
formLayout->addRow("分支比", m_leBranchRatio);
m_leBranchRatioUnc = new QLineEdit(this);
m_leBranchRatioUnc->setPlaceholderText(QStringLiteral(u"例如0.0001"));
formLayout->addRow(QStringLiteral(u"分支比不确定度"), m_leBranchRatioUnc);
// 主射线标识下拉框
m_cmbMainRayIdent = new QComboBox(this);
m_cmbMainRayIdent->addItems({QStringLiteral(u""), QStringLiteral(u"")});
formLayout->addRow(QStringLiteral(u"是否为主射线"), m_cmbMainRayIdent);
m_leJiahePeak = new QLineEdit(this);
m_leJiahePeak->setPlaceholderText(QStringLiteral(u"无则留空"));
formLayout->addRow(QStringLiteral(u"加和峰"), m_leJiahePeak);
// 按钮盒
QDialogButtonBox *btnBox = new QDialogButtonBox(
QDialogButtonBox::Ok | QDialogButtonBox::Cancel,
Qt::Horizontal, this);
formLayout->addRow(btnBox);
// 信号连接
connect(btnBox, &QDialogButtonBox::accepted, this, [this]() {
if (validateInput()) {
accept();
}
});
connect(btnBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
}
bool NuclideRayDialog::validateInput()
{
// 必填项校验
if (m_leRayMev->text().trimmed().isEmpty()) {
QMessageBox::warning(this, QStringLiteral(u"输入错误"), QStringLiteral(u"射线能量不能为空!"));
return false;
}
if (m_leRayMevUnc->text().trimmed().isEmpty()) {
QMessageBox::warning(this, QStringLiteral(u"输入错误"), QStringLiteral(u"能量不确定度不能为空!"));
return false;
}
if (m_leBranchRatioUnc->text().trimmed().isEmpty()) {
QMessageBox::warning(this, QStringLiteral(u"输入错误"), QStringLiteral(u"分支比不确定度不能为空!"));
return false;
}
// 数字格式校验(允许带单位)
bool ok;
// 提取数字部分进行校验
QString mevText = m_leRayMev->text().trimmed().replace(QRegExp("[^0-9.]"), "");
mevText.toDouble(&ok);
if (!ok) {
QMessageBox::warning(this, QStringLiteral(u"输入错误"), QStringLiteral(u"射线能量必须为有效数字!"));
return false;
}
QString mevUncText = m_leRayMevUnc->text().trimmed().replace(QRegExp("[^0-9.]"), "");
mevUncText.toDouble(&ok);
if (!ok) {
QMessageBox::warning(this, QStringLiteral(u"输入错误"), QStringLiteral(u"能量不确定度必须为有效数字!"));
return false;
}
QString ratioUncText = m_leBranchRatioUnc->text().trimmed().replace(QRegExp("[^0-9.]"), "");
ratioUncText.toDouble(&ok);
if (!ok) {
QMessageBox::warning(this, QStringLiteral(u"输入错误"), QStringLiteral(u"分支比不确定度必须为有效数字!"));
return false;
}
return true;
}
QStringList NuclideRayDialog::getRayData() const
{
QStringList data;
if (m_isEdit) {
data << m_id; // 编辑模式返回ID
}
data << m_cmbRayType->currentText().trimmed()
<< m_leRayMev->text().trimmed()
<< m_leRayMevUnc->text().trimmed()
<< m_leBranchRatio->text().trimmed()
<< m_leBranchRatioUnc->text().trimmed()
<< m_cmbMainRayIdent->currentText().trimmed()
<< m_leJiahePeak->text().trimmed();
return data;
}