修改能量刻度等视图没有加到视图菜单栏,优化去重核素识别框选后识别的核素信息添加到核素识别的选择弹框,修改核素识别的选择弹框的名称“匹配核素射线”为“核素识别”
This commit is contained in:
parent
8bcb4ecd21
commit
29a746d873
|
|
@ -55,6 +55,7 @@ TwoDSpectralCompliance::TwoDSpectralCompliance(QWidget* parent)
|
||||||
, ui(new Ui::TwoDSpectralCompliance)
|
, ui(new Ui::TwoDSpectralCompliance)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
this->setViewType(PlotFrame);
|
||||||
this->_menu = new QMenu(this);
|
this->_menu = new QMenu(this);
|
||||||
setupMenu();
|
setupMenu();
|
||||||
QHBoxLayout* layout = new QHBoxLayout(this);
|
QHBoxLayout* layout = new QHBoxLayout(this);
|
||||||
|
|
|
||||||
|
|
@ -100,7 +100,6 @@ void NuclideAnalysisView::SetAnalyzeDataFilename(const QMap<QString, QVariant>&
|
||||||
const QString& data_filename = data_files_set.first().toString();
|
const QString& data_filename = data_files_set.first().toString();
|
||||||
if (QFileInfo(data_filename).exists()) {
|
if (QFileInfo(data_filename).exists()) {
|
||||||
loadDataFromFile(data_name, data_filename);
|
loadDataFromFile(data_name, data_filename);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -223,6 +222,11 @@ void NuclideAnalysisView::setupMenu()
|
||||||
connect(action_plot_clear, &QAction::triggered, this, &NuclideAnalysisView::onActionPlotClear);
|
connect(action_plot_clear, &QAction::triggered, this, &NuclideAnalysisView::onActionPlotClear);
|
||||||
this->_menu->addSeparator();
|
this->_menu->addSeparator();
|
||||||
|
|
||||||
|
QAction* action_plot_nuclide_recognition = this->_menu->addAction(QStringLiteral(u"核素识别"));
|
||||||
|
action_plot_nuclide_recognition->setObjectName("action_plot_nuclide_recognition");
|
||||||
|
connect(action_plot_nuclide_recognition, &QAction::triggered, this, &NuclideAnalysisView::onActionPlotNuclideRecognition);
|
||||||
|
this->_menu->addSeparator();
|
||||||
|
|
||||||
setupNuclideDialog();
|
setupNuclideDialog();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -328,6 +332,10 @@ void NuclideAnalysisView::onActionPlotClear()
|
||||||
_plot->replot();
|
_plot->replot();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NuclideAnalysisView::onActionPlotNuclideRecognition()
|
||||||
|
{
|
||||||
|
m_nuclideDialog->show();
|
||||||
|
}
|
||||||
|
|
||||||
void NuclideAnalysisView::addVerticalLine(double xValue, const QColor& color)
|
void NuclideAnalysisView::addVerticalLine(double xValue, const QColor& color)
|
||||||
{
|
{
|
||||||
|
|
@ -646,7 +654,7 @@ std::vector<FindPeaksBySvd::PeakInfo> NuclideAnalysisView::GetSvdPeaks(const QVe
|
||||||
void NuclideAnalysisView::setupNuclideDialog()
|
void NuclideAnalysisView::setupNuclideDialog()
|
||||||
{
|
{
|
||||||
m_nuclideDialog = new QDialog(this);
|
m_nuclideDialog = new QDialog(this);
|
||||||
m_nuclideDialog->setWindowTitle(QStringLiteral(u"匹配核素射线"));
|
m_nuclideDialog->setWindowTitle(QStringLiteral(u"核素识别"));
|
||||||
m_nuclideDialog->resize(700, 400);
|
m_nuclideDialog->resize(700, 400);
|
||||||
|
|
||||||
QVBoxLayout* layout = new QVBoxLayout(m_nuclideDialog);
|
QVBoxLayout* layout = new QVBoxLayout(m_nuclideDialog);
|
||||||
|
|
@ -665,18 +673,20 @@ void NuclideAnalysisView::setupNuclideDialog()
|
||||||
layout->addLayout(topBarLayout);
|
layout->addLayout(topBarLayout);
|
||||||
|
|
||||||
m_nuclideTable = new QTableWidget(m_nuclideDialog);
|
m_nuclideTable = new QTableWidget(m_nuclideDialog);
|
||||||
QStringList headers = { "核素", "射线类型", "能量(keV)", "操作" };
|
QStringList headers = {"选择", "核素", "射线类型", "能量(keV)", "操作" };
|
||||||
m_nuclideTable->setColumnCount(headers.size());
|
m_nuclideTable->setColumnCount(headers.size());
|
||||||
m_nuclideTable->setHorizontalHeaderLabels(headers);
|
m_nuclideTable->setHorizontalHeaderLabels(headers);
|
||||||
m_nuclideTable->setSelectionBehavior(QAbstractItemView::SelectRows);
|
m_nuclideTable->setSelectionBehavior(QAbstractItemView::SelectRows);
|
||||||
m_nuclideTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
m_nuclideTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
||||||
m_nuclideTable->setAlternatingRowColors(true);
|
m_nuclideTable->setAlternatingRowColors(true);
|
||||||
|
|
||||||
m_nuclideTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
|
m_nuclideTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
|
||||||
|
m_nuclideTable->setColumnWidth(0, 60);
|
||||||
m_nuclideTable->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
|
m_nuclideTable->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
|
||||||
m_nuclideTable->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
|
m_nuclideTable->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
|
||||||
m_nuclideTable->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Fixed);
|
m_nuclideTable->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Stretch);
|
||||||
m_nuclideTable->setColumnWidth(3, 120);
|
m_nuclideTable->horizontalHeader()->setSectionResizeMode(4, QHeaderView::Fixed);
|
||||||
|
m_nuclideTable->setColumnWidth(4, 80);
|
||||||
layout->addWidget(m_nuclideTable);
|
layout->addWidget(m_nuclideTable);
|
||||||
connect(m_nuclideTable, &QTableWidget::itemSelectionChanged,
|
connect(m_nuclideTable, &QTableWidget::itemSelectionChanged,
|
||||||
this, &NuclideAnalysisView::onNuclideTableSelectionChanged);
|
this, &NuclideAnalysisView::onNuclideTableSelectionChanged);
|
||||||
|
|
@ -696,7 +706,7 @@ void NuclideAnalysisView::queryNuclidesForPeak(const PeakFitResultNuclide& peak)
|
||||||
|
|
||||||
if (!openNuclideDatabase()) {
|
if (!openNuclideDatabase()) {
|
||||||
m_nuclideTable->setRowCount(1);
|
m_nuclideTable->setRowCount(1);
|
||||||
m_nuclideTable->setItem(0, 0, new QTableWidgetItem(QStringLiteral(u"数据库未打开")));
|
m_nuclideTable->setItem(0, 1, new QTableWidgetItem(QStringLiteral(u"数据库未打开")));
|
||||||
m_nuclideDialog->show();
|
m_nuclideDialog->show();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -799,7 +809,7 @@ void NuclideAnalysisView::queryNuclidesForPeak(const PeakFitResultNuclide& peak)
|
||||||
|
|
||||||
//多峰显示
|
//多峰显示
|
||||||
if (m_nuclideTable->rowCount() > 0) {
|
if (m_nuclideTable->rowCount() > 0) {
|
||||||
QTableWidgetItem* firstItem = m_nuclideTable->item(0, 0);
|
QTableWidgetItem* firstItem = m_nuclideTable->item(0, 1);
|
||||||
if (firstItem) {
|
if (firstItem) {
|
||||||
QString txt = firstItem->text();
|
QString txt = firstItem->text();
|
||||||
if (txt == QStringLiteral(u"未找到匹配核素") ||
|
if (txt == QStringLiteral(u"未找到匹配核素") ||
|
||||||
|
|
@ -809,22 +819,24 @@ void NuclideAnalysisView::queryNuclidesForPeak(const PeakFitResultNuclide& peak)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新匹配结果追加到表格末尾
|
|
||||||
int startRow = m_nuclideTable->rowCount();
|
|
||||||
for (int i = 0; i < matches.size(); ++i) {
|
for (int i = 0; i < matches.size(); ++i) {
|
||||||
int row = startRow + i;
|
const auto& matchItem = matches[i];
|
||||||
|
// 已存在相同核素+射线类型+能量则跳过
|
||||||
|
if (isNuclideExists(matchItem.nuclideName, matchItem.rayType, matchItem.energyDisplay)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
int row = m_nuclideTable->rowCount();
|
||||||
m_nuclideTable->insertRow(row);
|
m_nuclideTable->insertRow(row);
|
||||||
const auto& m = matches[i];
|
m_nuclideTable->setItem(row, 1, new QTableWidgetItem(matchItem.nuclideName));
|
||||||
m_nuclideTable->setItem(row, 0, new QTableWidgetItem(m.nuclideName));
|
m_nuclideTable->setItem(row, 2, new QTableWidgetItem(matchItem.rayType));
|
||||||
m_nuclideTable->setItem(row, 1, new QTableWidgetItem(m.rayType));
|
m_nuclideTable->setItem(row, 3, new QTableWidgetItem(matchItem.energyDisplay));
|
||||||
m_nuclideTable->setItem(row, 2, new QTableWidgetItem(m.energyDisplay));
|
|
||||||
createRowOperationWidgets(row);
|
createRowOperationWidgets(row);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 表格为空且没匹配到时,才显示提示
|
// 表格为空且没匹配到时,才显示提示
|
||||||
if (m_nuclideTable->rowCount() == 0 && matches.isEmpty()) {
|
if (m_nuclideTable->rowCount() == 0 && matches.isEmpty()) {
|
||||||
m_nuclideTable->setRowCount(1);
|
m_nuclideTable->setRowCount(1);
|
||||||
m_nuclideTable->setItem(0, 0, new QTableWidgetItem(QStringLiteral(u"未找到匹配核素")));
|
m_nuclideTable->setItem(0, 1, new QTableWidgetItem(QStringLiteral(u"未找到匹配核素")));
|
||||||
}
|
}
|
||||||
|
|
||||||
m_nuclideDialog->show();
|
m_nuclideDialog->show();
|
||||||
|
|
@ -849,25 +861,29 @@ bool NuclideAnalysisView::openNuclideDatabase()
|
||||||
|
|
||||||
void NuclideAnalysisView::createRowOperationWidgets(int row)
|
void NuclideAnalysisView::createRowOperationWidgets(int row)
|
||||||
{
|
{
|
||||||
QWidget* operationWidget = new QWidget(m_nuclideTable);
|
QWidget* checkWidget = new QWidget(m_nuclideTable);
|
||||||
QHBoxLayout* hLayout = new QHBoxLayout(operationWidget);
|
QHBoxLayout* checkLayout = new QHBoxLayout(checkWidget);
|
||||||
hLayout->setContentsMargins(4, 2, 4, 2);
|
checkLayout->setContentsMargins(2,0,2,0);
|
||||||
hLayout->setSpacing(8);
|
checkLayout->setSpacing(0);
|
||||||
|
QCheckBox* checkBox = new QCheckBox(checkWidget);
|
||||||
// 复选框
|
|
||||||
QCheckBox* checkBox = new QCheckBox(operationWidget);
|
|
||||||
checkBox->setObjectName("rowCheckBox");
|
checkBox->setObjectName("rowCheckBox");
|
||||||
hLayout->addWidget(checkBox);
|
checkLayout->addStretch();
|
||||||
hLayout->addStretch();
|
checkLayout->addWidget(checkBox);
|
||||||
|
checkLayout->addStretch();
|
||||||
|
m_nuclideTable->setCellWidget(row, 0, checkWidget);
|
||||||
|
|
||||||
// 删除按钮
|
QWidget* delWidget = new QWidget(m_nuclideTable);
|
||||||
QPushButton* deleteBtn = new QPushButton(QStringLiteral(u"删除"), operationWidget);
|
QHBoxLayout* delLayout = new QHBoxLayout(delWidget);
|
||||||
|
delLayout->setContentsMargins(2,0,2,0);
|
||||||
|
delLayout->setSpacing(0);
|
||||||
|
QPushButton* deleteBtn = new QPushButton(QStringLiteral(u"删除"), delWidget);
|
||||||
deleteBtn->setFixedWidth(50);
|
deleteBtn->setFixedWidth(50);
|
||||||
deleteBtn->setProperty("rowIndex", row);
|
deleteBtn->setProperty("rowIndex", row);
|
||||||
connect(deleteBtn, &QPushButton::clicked, this, &NuclideAnalysisView::onDeleteRow);
|
connect(deleteBtn, &QPushButton::clicked, this, &NuclideAnalysisView::onDeleteRow);
|
||||||
hLayout->addWidget(deleteBtn);
|
delLayout->addStretch();
|
||||||
|
delLayout->addWidget(deleteBtn);
|
||||||
m_nuclideTable->setCellWidget(row, 3, operationWidget);
|
delLayout->addStretch();
|
||||||
|
m_nuclideTable->setCellWidget(row, 4, delWidget);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NuclideAnalysisView::onDeleteRow()
|
void NuclideAnalysisView::onDeleteRow()
|
||||||
|
|
@ -880,7 +896,7 @@ void NuclideAnalysisView::onDeleteRow()
|
||||||
m_nuclideTable->removeRow(row);
|
m_nuclideTable->removeRow(row);
|
||||||
// 更新后续行的rowIndex属性
|
// 更新后续行的rowIndex属性
|
||||||
for (int i = row; i < m_nuclideTable->rowCount(); ++i) {
|
for (int i = row; i < m_nuclideTable->rowCount(); ++i) {
|
||||||
QWidget* widget = m_nuclideTable->cellWidget(i, 3);
|
QWidget* widget = m_nuclideTable->cellWidget(i, 4);
|
||||||
if (widget) {
|
if (widget) {
|
||||||
QPushButton* delBtn = widget->findChild<QPushButton*>();
|
QPushButton* delBtn = widget->findChild<QPushButton*>();
|
||||||
if (delBtn) {
|
if (delBtn) {
|
||||||
|
|
@ -896,13 +912,13 @@ void NuclideAnalysisView::onSaveSelectedNuclides()
|
||||||
QJsonArray nuclideArray;
|
QJsonArray nuclideArray;
|
||||||
|
|
||||||
for (int i = 0; i < m_nuclideTable->rowCount(); ++i) {
|
for (int i = 0; i < m_nuclideTable->rowCount(); ++i) {
|
||||||
QWidget* widget = m_nuclideTable->cellWidget(i, 3);
|
QWidget* widget = m_nuclideTable->cellWidget(i, 0);
|
||||||
if (widget) {
|
if (widget) {
|
||||||
QCheckBox* checkBox = widget->findChild<QCheckBox*>();
|
QCheckBox* checkBox = widget->findChild<QCheckBox*>();
|
||||||
if (checkBox && checkBox->isChecked()) {
|
if (checkBox && checkBox->isChecked()) {
|
||||||
QTableWidgetItem* nuclideItem = m_nuclideTable->item(i, 0);
|
QTableWidgetItem* nuclideItem = m_nuclideTable->item(i, 1);
|
||||||
QTableWidgetItem* rayTypeItem = m_nuclideTable->item(i, 1);
|
QTableWidgetItem* rayTypeItem = m_nuclideTable->item(i, 2);
|
||||||
QTableWidgetItem* energyItem = m_nuclideTable->item(i, 2);
|
QTableWidgetItem* energyItem = m_nuclideTable->item(i, 3);
|
||||||
|
|
||||||
if (nuclideItem) {
|
if (nuclideItem) {
|
||||||
QJsonObject obj;
|
QJsonObject obj;
|
||||||
|
|
@ -946,11 +962,16 @@ void NuclideAnalysisView::onAddNuclide()
|
||||||
if (ray.size() >= 3) {
|
if (ray.size() >= 3) {
|
||||||
QString nuclideName = ray.at(1);
|
QString nuclideName = ray.at(1);
|
||||||
QString energy = ray.at(2);
|
QString energy = ray.at(2);
|
||||||
|
const QString rayType = QStringLiteral(u"γ"); // 手动添加默认为γ射线
|
||||||
|
// 已存在相同核素则跳过
|
||||||
|
if (isNuclideExists(nuclideName, rayType, energy)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
int row = m_nuclideTable->rowCount();
|
int row = m_nuclideTable->rowCount();
|
||||||
m_nuclideTable->insertRow(row);
|
m_nuclideTable->insertRow(row);
|
||||||
m_nuclideTable->setItem(row, 0, new QTableWidgetItem(nuclideName));
|
m_nuclideTable->setItem(row, 1, new QTableWidgetItem(nuclideName));
|
||||||
m_nuclideTable->setItem(row, 1, new QTableWidgetItem(QStringLiteral(u"γ")));
|
m_nuclideTable->setItem(row, 2, new QTableWidgetItem(QStringLiteral(u"γ")));
|
||||||
m_nuclideTable->setItem(row, 2, new QTableWidgetItem(energy));
|
m_nuclideTable->setItem(row, 3, new QTableWidgetItem(energy));
|
||||||
createRowOperationWidgets(row);
|
createRowOperationWidgets(row);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -978,7 +999,7 @@ void NuclideAnalysisView::onNuclideTableSelectionChanged()
|
||||||
// 遍历选中行,解析能量画竖线
|
// 遍历选中行,解析能量画竖线
|
||||||
for (const QTableWidgetSelectionRange& range : ranges) {
|
for (const QTableWidgetSelectionRange& range : ranges) {
|
||||||
for (int row = range.topRow(); row <= range.bottomRow(); ++row) {
|
for (int row = range.topRow(); row <= range.bottomRow(); ++row) {
|
||||||
QTableWidgetItem* item = m_nuclideTable->item(row, 2);
|
QTableWidgetItem* item = m_nuclideTable->item(row, 3);
|
||||||
if (!item) continue;
|
if (!item) continue;
|
||||||
|
|
||||||
QString str = item->text().trimmed();
|
QString str = item->text().trimmed();
|
||||||
|
|
@ -1013,4 +1034,34 @@ void NuclideAnalysisView::addNuclideVLine(double energy)
|
||||||
marker->setValue(energy, 0);
|
marker->setValue(energy, 0);
|
||||||
marker->attach(_plot);
|
marker->attach(_plot);
|
||||||
m_selectedNuclideMarkers.append(marker);
|
m_selectedNuclideMarkers.append(marker);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool NuclideAnalysisView::isNuclideExists(const QString &nuclideName, const QString &rayType, const QString &energy)
|
||||||
|
{
|
||||||
|
const QString trimmedName = nuclideName.trimmed();
|
||||||
|
const QString trimmedType = rayType.trimmed();
|
||||||
|
const QString trimmedEnergy = energy.trimmed();
|
||||||
|
|
||||||
|
for (int i = 0; i < m_nuclideTable->rowCount(); ++i) {
|
||||||
|
QTableWidgetItem* nameItem = m_nuclideTable->item(i, 1);
|
||||||
|
QTableWidgetItem* typeItem = m_nuclideTable->item(i, 2);
|
||||||
|
QTableWidgetItem* energyItem = m_nuclideTable->item(i, 3);
|
||||||
|
|
||||||
|
// 跳过空行或提示行("未找到匹配核素"、"数据库未打开")
|
||||||
|
if (!nameItem) continue;
|
||||||
|
const QString firstColText = nameItem->text().trimmed();
|
||||||
|
if (firstColText == QStringLiteral(u"未找到匹配核素") ||
|
||||||
|
firstColText == QStringLiteral(u"数据库未打开")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 三字段完全匹配(忽略前后空格)则判定为重复
|
||||||
|
if (nameItem && typeItem && energyItem &&
|
||||||
|
nameItem->text().trimmed() == trimmedName &&
|
||||||
|
typeItem->text().trimmed() == trimmedType &&
|
||||||
|
energyItem->text().trimmed() == trimmedEnergy) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -83,6 +83,8 @@ private:
|
||||||
void createRowOperationWidgets(int row);
|
void createRowOperationWidgets(int row);
|
||||||
|
|
||||||
void addNuclideVLine(double energy);
|
void addNuclideVLine(double energy);
|
||||||
|
// 判断表格中是否已存在相同核素
|
||||||
|
bool isNuclideExists(const QString& nuclideName, const QString& rayType, const QString& energy);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onActionPlotConfigure();
|
void onActionPlotConfigure();
|
||||||
|
|
@ -92,6 +94,8 @@ private slots:
|
||||||
|
|
||||||
void onActionPlotClear();
|
void onActionPlotClear();
|
||||||
|
|
||||||
|
//核素识别
|
||||||
|
void onActionPlotNuclideRecognition();
|
||||||
|
|
||||||
void onDeleteRow();
|
void onDeleteRow();
|
||||||
void onSaveSelectedNuclides();
|
void onSaveSelectedNuclides();
|
||||||
|
|
|
||||||
|
|
@ -166,7 +166,7 @@ ConformityAnalysis::ConformityAnalysis(QWidget *parent) :
|
||||||
{
|
{
|
||||||
qRegisterMetaType<ConformityCalculatedResult>();
|
qRegisterMetaType<ConformityCalculatedResult>();
|
||||||
qRegisterMetaType<ConformityHistoryItem>();
|
qRegisterMetaType<ConformityHistoryItem>();
|
||||||
|
this->setViewType(PlotFrame);
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
memset(m_boardChannel, 0, sizeof(m_boardChannel));
|
memset(m_boardChannel, 0, sizeof(m_boardChannel));
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user