修改分析报告自动生成中数据编辑界面

This commit is contained in:
anxinglong 2026-06-30 18:06:33 +08:00
parent 9d1164e336
commit cafcb2839a
3 changed files with 267 additions and 59 deletions

View File

@ -1,4 +1,4 @@
#include "EnergyScaleDataModel.h"
#include "EnergyScaleDataModel.h"
#include <QJsonDocument>
#include <QFile>
#include <QVariant>

View File

@ -11,7 +11,9 @@
#include <QTextEdit>
#include <QPushButton>
#include <QLineEdit>
#include <QLabel>
#include <QTableWidget>
#include <QScrollArea>
ReportWidget::ReportWidget(QWidget *parent)
: QWidget(parent)
{
@ -59,62 +61,167 @@ void ReportWidget::setupUi()
// 测量参数组
auto* measureGroup = new QGroupBox("测量参数", this);
auto* measureLayout = new QFormLayout(measureGroup);
auto* measureLayout = new QGridLayout(measureGroup);
measureLayout->setSpacing(4);
measureLayout->setContentsMargins(4, 4, 4, 4);
m_spectrumFileLabel = new QLabel("能谱文件:",this);
m_spectrumFileEdit = new QLineEdit(this);
m_startTimeLabel = new QLabel("开始时间:",this);
m_startTimeEdit = new QLineEdit(this);
m_liveTimeLabel = new QLabel("活时间 (秒):",this);
m_liveTimeEdit = new QLineEdit(this);
m_realTimeLabel = new QLabel("实时间 (秒):",this);
m_realTimeEdit = new QLineEdit(this);
m_deadTimeLabel = new QLabel("死时间 (秒):",this);
m_deadTimeEdit = new QLineEdit(this);
measureLayout->addRow("能谱文件:", m_spectrumFileEdit);
measureLayout->addRow("开始时间 (yyyy/M/d hh:mm:ss):", m_startTimeEdit);
measureLayout->addRow("活时间 (秒):", m_liveTimeEdit);
measureLayout->addRow("实时间 (秒):", m_realTimeEdit);
measureLayout->addRow("死时间 (%):", m_deadTimeEdit);
dataLayout->addWidget(measureGroup);
measureLayout->addWidget(m_spectrumFileLabel,0,0);
measureLayout->addWidget(m_spectrumFileEdit,0,1);
measureLayout->addWidget(m_startTimeLabel,1,0);
measureLayout->addWidget(m_startTimeEdit,1,1);
measureLayout->addWidget(m_liveTimeLabel,1,2);
measureLayout->addWidget(m_liveTimeEdit,1,3);
measureLayout->addWidget(m_realTimeLabel,2,0);
measureLayout->addWidget(m_realTimeEdit,2,1);
measureLayout->addWidget(m_deadTimeLabel,2,2);
measureLayout->addWidget(m_deadTimeEdit,2,3);
// 刻度参数组
auto* calibGroup = new QGroupBox("刻度参数", this);
auto* calibLayout = new QFormLayout(calibGroup);
m_calibFileEdit = new QLineEdit(this);
m_energyInterceptEdit = new QLineEdit(this);
m_energySlopeEdit = new QLineEdit(this);
m_energyQuadraticEdit = new QLineEdit(this);
auto* calibLayout = new QVBoxLayout(calibGroup);
auto* calibFileLayout = new QHBoxLayout();
auto* calibFileLabel = new QLabel("文件:",this);
m_calibFileEdit = new QLineEdit(this);
calibFileLayout->addWidget(calibFileLabel);
calibFileLayout->addWidget(m_calibFileEdit);
auto* energyGroup = new QGroupBox("能量刻度", this);
auto* energyGridLayout = new QGridLayout(energyGroup);
auto* calibGenerateTimeLabel = new QLabel("生成时间:",this);
m_calibGenerateTimeEdit = new QLineEdit(this);
auto* energyInterceptLabel = new QLabel("能量截距 (keV):",this);
m_energyInterceptEdit = new QLineEdit(this);
auto* energySlopeLabel = new QLabel("能量斜率 (keV/ch):",this);
m_energySlopeEdit = new QLineEdit(this);
auto* energyQuadraticLabel = new QLabel("二次项系数 (keV/(ch^2)):",this);
m_energyQuadraticEdit = new QLineEdit(this);
energyGridLayout->addWidget(calibGenerateTimeLabel,0,0);
energyGridLayout->addWidget(m_calibGenerateTimeEdit,0,1);
energyGridLayout->addWidget(energyInterceptLabel,0,2);
energyGridLayout->addWidget(m_energyInterceptEdit,0,3);
energyGridLayout->addWidget(energySlopeLabel,1,0);
energyGridLayout->addWidget(m_energySlopeEdit,1,1);
energyGridLayout->addWidget(energyQuadraticLabel,1,2);
energyGridLayout->addWidget(m_energyQuadraticEdit,1,3);
auto* EfficiencyGroup = new QGroupBox("效率刻度", this);
auto* EfficiencyGridLayout = new QGridLayout(EfficiencyGroup);
auto* efficiencyTimeLabel = new QLabel("效率生成时间:",this);
m_efficiencyTimeEdit = new QLineEdit(this);//效率生成时间
auto* inflectionEnergyLabel = new QLabel("拐点能量:",this);
m_inflectionEnergyEdit = new QLineEdit(this);//拐点能量
auto* aboveInflectionLabel = new QLabel("拐点向上:",this);
m_aboveInflectionEdit = new QLineEdit(this);//拐点向上
auto* aboveErrorLabel = new QLabel("拐点向上误差:",this);
m_aboveErrorEdit = new QLineEdit(this);//拐点向上误差
auto* belowInflectionLabel = new QLabel("拐点向下:",this);
m_belowInflectionEdit = new QLineEdit(this);//拐点向下
auto* belowErrorLabel = new QLabel("拐点向下误差:",this);
m_belowErrorEdit = new QLineEdit(this);//拐点向下误差
auto* logEquationLabel = new QLabel("效率对数方程式:",this);
m_logEquationEdit= new QLineEdit(this);//效率对数方程式
EfficiencyGridLayout->addWidget(efficiencyTimeLabel,0,0);
EfficiencyGridLayout->addWidget(m_efficiencyTimeEdit,0,1);
EfficiencyGridLayout->addWidget(inflectionEnergyLabel,0,2);
EfficiencyGridLayout->addWidget(m_inflectionEnergyEdit,0,3);
EfficiencyGridLayout->addWidget(aboveInflectionLabel,1,0);
EfficiencyGridLayout->addWidget(m_aboveInflectionEdit,1,1);
EfficiencyGridLayout->addWidget(aboveErrorLabel,1,2);
EfficiencyGridLayout->addWidget(m_aboveErrorEdit,1,3);
EfficiencyGridLayout->addWidget(belowInflectionLabel,2,0);
EfficiencyGridLayout->addWidget(m_belowInflectionEdit,2,1);
EfficiencyGridLayout->addWidget(belowErrorLabel,2,2);
EfficiencyGridLayout->addWidget(m_belowErrorEdit,2,3);
EfficiencyGridLayout->addWidget(logEquationLabel,3,0);
EfficiencyGridLayout->addWidget(m_logEquationEdit,3,1,1,3);
calibLayout->addLayout(calibFileLayout,1);
calibLayout->addWidget(energyGroup,2);
calibLayout->addWidget(EfficiencyGroup,2);
calibLayout->addRow("刻度文件:", m_calibFileEdit);
calibLayout->addRow("能量截距 (keV):", m_energyInterceptEdit);
calibLayout->addRow("能量斜率 (keV/ch):", m_energySlopeEdit);
calibLayout->addRow("二次项系数 (keV/(ch^2)):", m_energyQuadraticEdit);
dataLayout->addWidget(calibGroup);
// 核素库与分析参数
auto* paramGroup = new QGroupBox("核素库与分析参数", this);
auto* paramLayout = new QFormLayout(paramGroup);
auto* paramLayout = new QGridLayout(paramGroup);
auto* nuclideLibLabel = new QLabel("核素库文件:",this);
m_nuclideLibEdit = new QLineEdit(this);
auto* peakMatchWidthLabel = new QLabel("峰匹配宽度:",this);
m_peakMatchWidthEdit = new QLineEdit(this);
auto* startEnergyLabel = new QLabel("起始能量 (keV):",this);
m_startEnergyEdit = new QLineEdit(this);
auto* endEnergyLabel = new QLabel("终止能量 (keV):",this);
m_endEnergyEdit = new QLineEdit(this);
auto* statErrorLabel = new QLabel("统计误差限值 (%):",this);
m_statErrorEdit = new QLineEdit(this);
auto* activityRatiomLabel = new QLabel("活度比例系数:",this);
m_activityRatiomEdit = new QLineEdit(this);//活度比例系数
auto* mdaMethodLabel = new QLabel("探测限计算方法:",this);
m_mdaMethodEdit = new QLineEdit(this);//探测限计算方法
paramLayout->addWidget(nuclideLibLabel,0,0);
paramLayout->addWidget(m_nuclideLibEdit,0,1);
paramLayout->addWidget(peakMatchWidthLabel,0,2);
paramLayout->addWidget(m_peakMatchWidthEdit,0,3);
paramLayout->addWidget(startEnergyLabel,1,0);
paramLayout->addWidget(m_startEnergyEdit,1,1);
paramLayout->addWidget(endEnergyLabel,1,2);
paramLayout->addWidget(m_endEnergyEdit,1,3);
paramLayout->addWidget(statErrorLabel,2,0);
paramLayout->addWidget(m_statErrorEdit,2,1);
paramLayout->addWidget(activityRatiomLabel,2,2);
paramLayout->addWidget(m_activityRatiomEdit,2,3);
paramLayout->addWidget(mdaMethodLabel,3,0);
paramLayout->addWidget(m_mdaMethodEdit,3,1,1,3);
paramLayout->addRow("核素库文件:", m_nuclideLibEdit);
paramLayout->addRow("峰匹配宽度 (*FWHM):", m_peakMatchWidthEdit);
paramLayout->addRow("起始能量 (keV):", m_startEnergyEdit);
paramLayout->addRow("终止能量 (keV):", m_endEnergyEdit);
paramLayout->addRow("统计误差限值 (%):", m_statErrorEdit);
dataLayout->addWidget(paramGroup);
// 峰数据表格
auto* peakGroup = new QGroupBox("能谱峰数据", this);
auto* peakLayout = new QVBoxLayout(peakGroup);
m_peakTable = new QTableWidget(this);
m_peakTable->setColumnCount(7);
m_peakTable->setHorizontalHeaderLabels(
QStringList() << "核素" << "平均活度(Bq)" << "能量(keV)"
<< "峰活度(Bq)" << "MDA(Bq)" << "提示码" << "备注");
m_peakTable->horizontalHeader()->setStretchLastSection(true);
m_peakTable->setRowCount(10); // 预留10行
m_peakTable->horizontalHeader()->setVisible(false);
m_peakTable->verticalHeader()->setVisible(false);
m_peakTable->setColumnCount(8);
m_peakTable->setRowCount(10);
m_peakTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // 列宽均分
// m_peakTable->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch); // 行高均分
m_peakTable->verticalHeader()->setDefaultSectionSize(24); // 设置默认行高
m_peakTable->setSpan(0, 0, 1, 8);
setDataTableTitle(m_peakTable, 0, 0, "能谱峰一览表");
m_peakTable->setSpan(1, 0, 2, 1);
setDataTableTitle(m_peakTable, 1, 0, "核素");
m_peakTable->setSpan(1, 1, 2, 1);
setDataTableTitle(m_peakTable, 1, 1, "平均活度\n贝克Bq");
m_peakTable->setSpan(1, 2, 2, 1);
setDataTableTitle(m_peakTable, 1, 2, "不确\n定度");
m_peakTable->setSpan(1, 3, 1, 4);
setDataTableTitle(m_peakTable, 1, 3, "");
setDataTableTitle(m_peakTable, 2, 3, "能量keV");
setDataTableTitle(m_peakTable, 2, 4, "活度\n贝克Bq");
setDataTableTitle(m_peakTable, 2, 5, "不确定度");
setDataTableTitle(m_peakTable, 2, 6, "最小可探测活度\n(MDA)(贝克Bq)");
m_peakTable->setSpan(1, 7, 2, 1);
setDataTableTitle(m_peakTable, 1, 7, "备注");
peakLayout->addWidget(m_peakTable);
dataLayout->addWidget(peakGroup);
// 签名信息
auto* signGroup = new QGroupBox("签名信息", this);
@ -128,15 +235,25 @@ void ReportWidget::setupUi()
signLayout->addRow("审查员:", m_reviewerEdit);
signLayout->addRow("实验室:", m_laboratoryEdit);
signLayout->addRow("报告日期 (yyyy-MM-dd):", m_reportDateEdit);
dataLayout->addWidget(signGroup);
dataLayout->addWidget(measureGroup,0);
dataLayout->addWidget(calibGroup,0);
dataLayout->addWidget(paramGroup,0);
dataLayout->addWidget(peakGroup,1);
dataLayout->addWidget(signGroup,0);
dataLayout->addStretch();
m_tabWidget->addTab(m_dataEditWidget, "数据编辑");
auto* scrollArea = new QScrollArea(this);
scrollArea->setFrameShape(QFrame::NoFrame);
scrollArea->setWidgetResizable(true);
scrollArea->setWidget(m_dataEditWidget);
// m_tabWidget->addTab(m_dataEditWidget, "数据编辑");
m_tabWidget->addTab(scrollArea, "数据编辑");
mainLayout->addWidget(m_tabWidget);
resize(1000, 700);
setWindowTitle("能谱分析报告生成器");
// resize(800, 600);
setWindowTitle("能谱分析报告");
}
void ReportWidget::setupConnections()
@ -161,16 +278,27 @@ void ReportWidget::setReportData(const SpectrumReportData &data)
m_deadTimeEdit->setText(QString::number(m_data.measurement.deadTime));
m_calibFileEdit->setText(m_data.calibration.fileName);
m_calibGenerateTimeEdit->setText(m_data.calibration.energy.generateTime.toString("yyyy/M/d hh:mm:ss"));
m_energyInterceptEdit->setText(QString::number(m_data.calibration.energy.intercept));
m_energySlopeEdit->setText(QString::number(m_data.calibration.energy.slope));
m_energyQuadraticEdit->setText(QString::number(m_data.calibration.energy.quadratic, 'E', 3));
m_efficiencyTimeEdit->setText(m_data.calibration.efficiency.generateTime.toString("yyyy/M/d hh:mm:ss"));//效率生成时间
m_inflectionEnergyEdit->setText(QString::number(m_data.calibration.efficiency.inflectionEnergy));//拐点能量
m_aboveInflectionEdit->setText(m_data.calibration.efficiency.aboveInflection);//拐点向上
m_aboveErrorEdit->setText(QString::number(m_data.calibration.efficiency.aboveError));//拐点向上误差
m_belowInflectionEdit->setText(m_data.calibration.efficiency.belowInflection);//拐点向下
m_belowErrorEdit->setText(QString::number(m_data.calibration.efficiency.belowError));//拐点向下误差
m_logEquationEdit->setText(m_data.calibration.efficiency.logEquation);//效率对数方程式
m_nuclideLibEdit->setText(m_data.nuclideLib.fileName);
m_peakMatchWidthEdit->setText(QString::number(m_data.nuclideLib.peakMatchWidth));
m_startEnergyEdit->setText(QString::number(m_data.analysis.startEnergy));
m_endEnergyEdit->setText(QString::number(m_data.analysis.endEnergy));
m_statErrorEdit->setText(QString::number(m_data.analysis.statErrorLimit));
m_activityRatiomEdit->setText(QString::number(m_data.analysis.activityRatio));
m_mdaMethodEdit->setText(m_data.analysis.mdaMethod);
m_analystEdit->setText(m_data.signature.analyst);
m_reviewerEdit->setText(m_data.signature.reviewer);
@ -230,7 +358,7 @@ void ReportWidget::updateDataFromUi()
// 峰数据(从表格读取)
m_data.clearPeaks();
for (int row = 0; row < m_peakTable->rowCount(); ++row) {
for (int row = 3; row < m_peakTable->rowCount(); ++row) {
QTableWidgetItem* nuclideItem = m_peakTable->item(row, 0);
if (!nuclideItem || nuclideItem->text().isEmpty()) {
continue;
@ -265,8 +393,8 @@ void ReportWidget::updatePeakTable()
{
m_peakTable->setRowCount(m_data.peakCount() + 5); // 多留几行
for (int i = 0; i < m_data.peakCount(); ++i) {
const auto& peak = m_data.peaks[i];
for (int i = 3; i < m_data.peakCount() + 3; ++i) {
const auto& peak = m_data.peaks[i-3];
m_peakTable->setItem(i, 0, new QTableWidgetItem(peak.nuclide));
m_peakTable->setItem(i, 1, new QTableWidgetItem(QString::number(peak.avgActivity, 'E', 4)));
m_peakTable->setItem(i, 2, new QTableWidgetItem(QString::number(peak.energy, 'f', 2)));
@ -342,4 +470,57 @@ void ReportWidget::loadSampleData()
SpectrumReportData data;
data.fillSampleData();
setReportData(data);
}
}
void ReportWidget::setDataTableTitle(QTableWidget *pTableWidget, int nRow, int nCol, int nVal)
{
QString strVal = nVal == 0 ? "0" : QString("%1").arg(nVal);
setData2Table(pTableWidget, nRow, nCol, strVal);
}
void ReportWidget::setDataTableTitle(QTableWidget *pTableWidget, int nRow, int nCol, double dVal)
{
QString strVal = dVal == 0 ? "0" : QString("%1").arg(dVal);
setData2Table(pTableWidget, nRow, nCol, strVal);
}
void ReportWidget::setDataTableTitle(QTableWidget *pTableWidget, int nRow, int nCol, QString strVal)
{
if (pTableWidget == NULL)
return;
QString strValTmp = strVal == "" ? "" : QString("%1").arg(strVal);
pTableWidget->setItem(nRow, nCol, new QTableWidgetItem(strValTmp));
pTableWidget->item(nRow, nCol)->setForeground(QBrush(Qt::black));
// QFont f = pTableWidget->item(nRow, nCol)->font(); // 拷贝原字体
// f.setPointSize(15);
// pTableWidget->item(nRow, nCol)->setFont(f); // 生效
pTableWidget->item(nRow, nCol)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
}
void ReportWidget::setData2Table(QTableWidget *pTableWidget, int nRow, int nCol, int nVal)
{
QString strVal = nVal == 0 ? "0" : QString("%1").arg(nVal);
setData2Table(pTableWidget, nRow, nCol, strVal);
}
void ReportWidget::setData2Table(QTableWidget *pTableWidget, int nRow, int nCol, double dVal)
{
QString strVal = dVal == 0 ? "0" : QString("%1").arg(dVal);
setData2Table(pTableWidget, nRow, nCol, strVal);
}
void ReportWidget::setData2Table(QTableWidget *pTableWidget, int nRow, int nCol, QString strVal)
{
if (pTableWidget == NULL)
return;
QString strValTmp = strVal == "" ? "" : QString("%1").arg(strVal);
pTableWidget->setItem(nRow, nCol, new QTableWidgetItem(strValTmp));
pTableWidget->item(nRow, nCol)->setForeground(QBrush(Qt::black));
// pTableWidget->item(nRow, nCol)->setBackground(QColor(135, 206, 235)); // 天蓝色
// QFont f = pTableWidget->item(nRow, nCol)->font(); // 拷贝原字体
// f.setPointSize(15); // 14 号字
// pTableWidget->item(nRow, nCol)->setFont(f); // 生效
pTableWidget->item(nRow, nCol)->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
}

View File

@ -49,6 +49,14 @@ private:
void updateDataFromUi();
void updatePeakTable();
void setData2Table(QTableWidget *pTableWidget, int nRow, int nCol, int nVal);
void setData2Table(QTableWidget *pTableWidget, int nRow, int nCol, double dVal);
void setData2Table(QTableWidget *pTableWidget, int nRow, int nCol, QString strVal);
void setDataTableTitle(QTableWidget *pTableWidget, int nRow, int nCol, int nVal);
void setDataTableTitle(QTableWidget *pTableWidget, int nRow, int nCol, double dVal);
void setDataTableTitle(QTableWidget *pTableWidget, int nRow, int nCol, QString strVal);
// UI组件
QTabWidget* m_tabWidget;
QTextBrowser* m_htmlView;
@ -56,30 +64,49 @@ private:
QWidget* m_dataEditWidget;
// 数据编辑组件
QLineEdit* m_spectrumFileEdit;
QLineEdit* m_startTimeEdit;
QLineEdit* m_liveTimeEdit;
QLineEdit* m_realTimeEdit;
QLineEdit* m_deadTimeEdit;
QLabel *m_spectrumFileLabel;
QLineEdit* m_spectrumFileEdit;//能谱文件
QLineEdit* m_calibFileEdit;
QLineEdit* m_energyInterceptEdit;
QLineEdit* m_energySlopeEdit;
QLineEdit* m_energyQuadraticEdit;
QLabel *m_startTimeLabel;
QLineEdit* m_startTimeEdit;//开始时间
QLineEdit* m_nuclideLibEdit;
QLineEdit* m_peakMatchWidthEdit;
QLabel *m_liveTimeLabel;
QLineEdit* m_liveTimeEdit;//活时间
QLineEdit* m_startEnergyEdit;
QLineEdit* m_endEnergyEdit;
QLineEdit* m_statErrorEdit;
QLabel *m_realTimeLabel;
QLineEdit* m_realTimeEdit;//实时间
QLabel *m_deadTimeLabel;
QLineEdit* m_deadTimeEdit;//死时间
QLineEdit* m_calibFileEdit;//刻度文件
QLineEdit* m_calibGenerateTimeEdit;//生成时间
QLineEdit* m_energyInterceptEdit;//能量截距
QLineEdit* m_energySlopeEdit;//能量斜率
QLineEdit* m_energyQuadraticEdit;//二次项系数
QLineEdit* m_efficiencyTimeEdit;//效率生成时间
QLineEdit* m_inflectionEnergyEdit;//拐点能量
QLineEdit* m_aboveInflectionEdit;//拐点向上
QLineEdit* m_aboveErrorEdit;//拐点向上误差
QLineEdit* m_belowInflectionEdit;//拐点向下
QLineEdit* m_belowErrorEdit;//拐点向下误差
QLineEdit* m_logEquationEdit;//效率对数方程式
QLineEdit* m_nuclideLibEdit;//核素库文件
QLineEdit* m_peakMatchWidthEdit;//峰匹配宽度
QLineEdit* m_startEnergyEdit;//起始能量
QLineEdit* m_endEnergyEdit;//终止能量
QLineEdit* m_statErrorEdit;//统计误差限值
QLineEdit* m_activityRatiomEdit;//活度比例系数
QLineEdit* m_mdaMethodEdit;//探测限计算方法
QTableWidget* m_peakTable;
QLineEdit* m_analystEdit;
QLineEdit* m_reviewerEdit;
QLineEdit* m_laboratoryEdit;
QLineEdit* m_reportDateEdit;
QLineEdit* m_analystEdit;//分析员
QLineEdit* m_reviewerEdit;//审查员
QLineEdit* m_laboratoryEdit;//实验室
QLineEdit* m_reportDateEdit;//报告日期
// 按钮
QPushButton* m_refreshBtn;