diff --git a/src/EnergyScaleDataModel.cpp b/src/EnergyScaleDataModel.cpp index c841bcd..da4528a 100644 --- a/src/EnergyScaleDataModel.cpp +++ b/src/EnergyScaleDataModel.cpp @@ -1,4 +1,4 @@ -#include "EnergyScaleDataModel.h" + #include "EnergyScaleDataModel.h" #include #include #include diff --git a/src/analysisReport/reportwidget.cpp b/src/analysisReport/reportwidget.cpp index 9a461bb..366bcab 100644 --- a/src/analysisReport/reportwidget.cpp +++ b/src/analysisReport/reportwidget.cpp @@ -11,7 +11,9 @@ #include #include #include +#include #include +#include 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); -} \ No newline at end of file +} + + + + +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); +} diff --git a/src/analysisReport/reportwidget.h b/src/analysisReport/reportwidget.h index 07af140..c3c3c83 100644 --- a/src/analysisReport/reportwidget.h +++ b/src/analysisReport/reportwidget.h @@ -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;