From 2e4d09a03e147e3834893bb8295d661707e9de99 Mon Sep 17 00:00:00 2001 From: anxinglong <2910824064@qq.com> Date: Wed, 24 Jun 2026 17:53:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=95=8C=E9=9D=A2=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E6=A0=B8=E7=B4=A0=E7=95=8C=E9=9D=A2=E3=80=82=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=82=B9=E5=87=BB=E6=A0=B8=E7=B4=A0=EF=BC=8C=E5=9C=A8?= =?UTF-8?q?=E8=A7=86=E5=9B=BE=E4=B8=8A=E6=98=BE=E7=A4=BA=E7=AB=96=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/NuclideAnalysisView/AddNuclideDialog.cpp | 263 ++++++++++++ src/NuclideAnalysisView/AddNuclideDialog.h | 49 +++ src/NuclideAnalysisView/AddNuclideDialog.ui | 375 ++++++++++++++++++ .../NuclideAnalysisView.cpp | 209 +++++++++- src/NuclideAnalysisView/NuclideAnalysisView.h | 7 + src/src.pro | 3 + 6 files changed, 888 insertions(+), 18 deletions(-) create mode 100644 src/NuclideAnalysisView/AddNuclideDialog.cpp create mode 100644 src/NuclideAnalysisView/AddNuclideDialog.h create mode 100644 src/NuclideAnalysisView/AddNuclideDialog.ui diff --git a/src/NuclideAnalysisView/AddNuclideDialog.cpp b/src/NuclideAnalysisView/AddNuclideDialog.cpp new file mode 100644 index 0000000..b400922 --- /dev/null +++ b/src/NuclideAnalysisView/AddNuclideDialog.cpp @@ -0,0 +1,263 @@ +#include "AddNuclideDialog.h" +#include "ui_AddNuclideDialog.h" +#include "sqlitemanager.h" +#include +#include +#include + +AddNuclideDialog::AddNuclideDialog(QWidget *parent) + : QDialog(parent) + , ui(new Ui::AddNuclideDialog) +{ + ui->setupUi(this); + setWindowTitle(QStringLiteral(u"新增核素")); + + this->initTable(ui->tableWidget_left); + connect(ui->tableWidget_left, &QTableWidget::itemClicked, this, &AddNuclideDialog::slotTableItemClicked); + + this->initTable(ui->tableWidget_cter); + this->initTable(ui->tableWidget_right); + + this->initHeaderItem(ui->tableWidget_cter, { QStringLiteral(u"编号"), QStringLiteral(u"能量KeV"), QStringLiteral(u"发射几率%"), QStringLiteral(u"操作") }); + this->initHeaderItem(ui->tableWidget_right, { QStringLiteral(u"核素"), QStringLiteral(u"能量KeV") }); + connect(ui->lineEdit_up, &QLineEdit::textChanged, this, &AddNuclideDialog::onSearchTextChanged); + + this->readNuclideData(); +} + +AddNuclideDialog::~AddNuclideDialog() +{ + delete ui; +} + +void AddNuclideDialog::readNuclideData() +{ + auto& db = SqliteManager::instance(); + QString sql = "SELECT ID, NUCLIDE_NAME FROM nuclideLib ORDER BY NUCLIDE_NAME;"; + auto nuclideList = db.selectRows(sql); + + m_allNuclideList.clear(); + for (const auto& row : nuclideList) { + QString id = row["ID"].toString(); + QString name = row["NUCLIDE_NAME"].toString(); + QStringList slist; + slist << id; + slist << name; + m_allNuclideList.append(slist); + this->insertTableWidget(ui->tableWidget_left, slist); + } +} + +void AddNuclideDialog::initTable(QTableWidget* tableWgt) +{ + tableWgt->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + tableWgt->setSelectionBehavior(QAbstractItemView::SelectRows); + tableWgt->setFocusPolicy(Qt::NoFocus); + tableWgt->setShowGrid(false); + tableWgt->setAlternatingRowColors(true); +} + +void AddNuclideDialog::initHeaderItem(QTableWidget* tableWgt, QStringList hlist, bool bvis) +{ + tableWgt->setColumnCount(0); + tableWgt->setRowCount(0); + int ncolCount = 0; + for (int i = 0; i < hlist.length(); i++) { + tableWgt->insertColumn(ncolCount); + tableWgt->setHorizontalHeaderItem(ncolCount, new QTableWidgetItem(hlist.at(i))); + ncolCount = tableWgt->columnCount(); + } + tableWgt->horizontalHeader()->setVisible(bvis); +} + +void AddNuclideDialog::insertTableWidget(QTableWidget* tableWidget, QStringList listDt) +{ + int rowCount = tableWidget->rowCount(); + tableWidget->insertRow(rowCount); + int nIdx = 0; + + for (int i = 1; i < listDt.size(); i++) { + QString str = listDt[i]; + if (nIdx >= tableWidget->columnCount()) + break; + + QTableWidgetItem* pItem = new QTableWidgetItem(str); + if (nIdx == 0) { + pItem->setData(Qt::UserRole, listDt[0]); + } + pItem->setTextAlignment(Qt::AlignCenter); + pItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + tableWidget->setItem(rowCount, nIdx, pItem); + tableWidget->setRowHeight(rowCount, 30); + nIdx++; + } + + if (tableWidget == ui->tableWidget_cter) { + nIdx = tableWidget->columnCount() - 1; + QWidget* operatorWidget = new QWidget(tableWidget); + QHBoxLayout* layout = new QHBoxLayout(operatorWidget); + layout->setContentsMargins(2, 0, 2, 0); + layout->setSpacing(10); + + QCheckBox* box = new QCheckBox(operatorWidget); + if (this->hvNuclideRay(listDt[0])) + box->setChecked(true); + else + box->setChecked(false); + box->setProperty("id", listDt[0]); + connect(box, &QCheckBox::stateChanged, this, &AddNuclideDialog::on_checkChanged); + + layout->addStretch(); + layout->addWidget(box); + layout->addStretch(); + tableWidget->setCellWidget(rowCount, nIdx, operatorWidget); + } +} + +QList& AddNuclideDialog::getSelectRay() +{ + return m_listSelectRay; +} + +QString AddNuclideDialog::getSelectRayMev(QString sid) +{ + QString str; + for (int i = 0; i < m_listCurNuclideRayInfo.size(); i++) { + if (m_listCurNuclideRayInfo.at(i).at(0) == sid) { + str = m_listCurNuclideRayInfo.at(i).at(3); + break; + } + } + return str; +} + +void AddNuclideDialog::removeSelectRay(QString sid) +{ + for (int i = 0; i < m_listSelectRay.size(); i++) { + if (m_listSelectRay.at(i).at(0) == sid) { + m_listSelectRay.removeAt(i); + break; + } + } +} + +bool AddNuclideDialog::hvNuclideRay(QString sid) +{ + for (int i = 0; i < m_listSelectRay.size(); i++) { + if (m_listSelectRay.at(i).at(0) == sid) { + return true; + } + } + return false; +} + +void AddNuclideDialog::on_checkChanged() +{ + QCheckBox* cb = qobject_cast(sender()); + QString sid = cb->property("id").toString(); + + if (cb->isChecked()) { + QString smev = this->getSelectRayMev(sid); + QStringList slt; + slt << sid; + slt << m_strNucName; + slt << smev; + m_listSelectRay << slt; + } else { + this->removeSelectRay(sid); + } + + ui->tableWidget_right->setRowCount(0); + for (int i = 0; i < m_listSelectRay.size(); i++) { + QStringList slit = m_listSelectRay.at(i); + this->insertTableWidget(ui->tableWidget_right, slit); + } +} + +void AddNuclideDialog::slotTableItemClicked(QTableWidgetItem* item) +{ + if (item == nullptr) + return; + + QString sid = item->data(Qt::UserRole).toString(); + m_strNucName = item->text(); + + auto& db = SqliteManager::instance(); + + // 查询核素基本信息(半衰期等) + QString nuclideSql = QString("SELECT * FROM nuclideLib WHERE ID = %1;").arg(sid); + auto nuclideInfo = db.selectRows(nuclideSql); + if (!nuclideInfo.isEmpty()) { + auto& firstRow = nuclideInfo.first(); + if (firstRow.contains("HALF_LIFE")) { + ui->lineEdit_halfleft->setText(firstRow["HALF_LIFE"].toString()); + } + // 半衰期不确定度 + if (firstRow.contains("HALF_LIFE_UNCERTAINTY")) { + ui->lineEdit_halfleftun->setText(firstRow["HALF_LIFE_UNCERTAINTY"].toString()); + } else if (firstRow.contains("HALF_LIFE_UNC")) { + ui->lineEdit_halfleftun->setText(firstRow["HALF_LIFE_UNC"].toString()); + } else if (firstRow.contains("HALF_LIFE_ERROR")) { + ui->lineEdit_halfleftun->setText(firstRow["HALF_LIFE_ERROR"].toString()); + } + } + + ui->label_c1->setText(QStringLiteral(u"核素信息 %1").arg(m_strNucName)); + ui->tableWidget_cter->setRowCount(0); + + // 查询核素射线信息 + QString raySql = QString("SELECT ID, NUCLIDE_ID, RAY_TYPE, RAY_MEV, RAY_BRANCH_RATIO " + "FROM nuclideRayInfo WHERE NUCLIDE_ID = %1;").arg(sid); + auto rayInfoList = db.selectRows(raySql); + + m_listCurNuclideRayInfo.clear(); + for (int i = 0; i < rayInfoList.size(); i++) { + const auto& row = rayInfoList.at(i); + QStringList slt; + slt << row["ID"].toString(); + slt << row["NUCLIDE_ID"].toString(); + slt << row["RAY_TYPE"].toString(); + slt << row["RAY_MEV"].toString(); + slt << row["RAY_BRANCH_RATIO"].toString(); + m_listCurNuclideRayInfo.append(slt); + + QStringList tmp; + tmp << row["ID"].toString(); + tmp << QString::number(i + 1); + tmp << row["RAY_MEV"].toString(); + tmp << row["RAY_BRANCH_RATIO"].toString(); + this->insertTableWidget(ui->tableWidget_cter, tmp); + } +} + +void AddNuclideDialog::on_btn_ok_clicked() +{ + this->accept(); +} + +void AddNuclideDialog::on_btn_cancle_clicked() +{ + this->reject(); +} + +void AddNuclideDialog::onSearchTextChanged(const QString &text) +{ + ui->tableWidget_left->setRowCount(0); + + QString searchText = text.trimmed(); + if (searchText.isEmpty()) { + // 搜索框为空,显示所有核素 + for (const QStringList& nuclide : m_allNuclideList) { + this->insertTableWidget(ui->tableWidget_left, nuclide); + } + return; + } + + // 模糊搜索,不区分大小写 + for (const QStringList& nuclide : m_allNuclideList) { + QString name = nuclide.at(1); + if (name.contains(searchText, Qt::CaseInsensitive)) { + this->insertTableWidget(ui->tableWidget_left, nuclide); + } + } +} \ No newline at end of file diff --git a/src/NuclideAnalysisView/AddNuclideDialog.h b/src/NuclideAnalysisView/AddNuclideDialog.h new file mode 100644 index 0000000..850f929 --- /dev/null +++ b/src/NuclideAnalysisView/AddNuclideDialog.h @@ -0,0 +1,49 @@ +#ifndef ADDNUCLIDEDIALOG_H +#define ADDNUCLIDEDIALOG_H + +#include +#include +#include +#include + +namespace Ui { +class AddNuclideDialog; +} + +class AddNuclideDialog : public QDialog +{ + Q_OBJECT + +public: + explicit AddNuclideDialog(QWidget *parent = nullptr); + ~AddNuclideDialog(); + + void readNuclideData(); + void initTable(QTableWidget* tableWgt); + void initHeaderItem(QTableWidget* tableWgt, QStringList hlist, bool bvis = true); + void insertTableWidget(QTableWidget* tableWidget, QStringList vecList); + QList& getSelectRay(); + +protected: + QString getSelectRayMev(QString sid); + void removeSelectRay(QString sid); + bool hvNuclideRay(QString sid); + +private slots: + void on_checkChanged(); + void slotTableItemClicked(QTableWidgetItem* item); + void on_btn_ok_clicked(); + void on_btn_cancle_clicked(); + void onSearchTextChanged(const QString& text); + +private: + Ui::AddNuclideDialog *ui; + + QString m_strNucName; + QList m_listCurNuclideRayInfo; + QList m_listSelectRay; + QList m_allNuclideList; // 所有核素数据(用于搜索过滤) + +}; + +#endif // ADDNUCLIDEDIALOG_H \ No newline at end of file diff --git a/src/NuclideAnalysisView/AddNuclideDialog.ui b/src/NuclideAnalysisView/AddNuclideDialog.ui new file mode 100644 index 0000000..c214fd4 --- /dev/null +++ b/src/NuclideAnalysisView/AddNuclideDialog.ui @@ -0,0 +1,375 @@ + + + AddNuclideDialog + + + + 0 + 0 + 1097 + 579 + + + + Dialog + + + + + + + + + + + + 1 + + + 1 + + + 1 + + + 1 + + + + + 6 + + + 9 + + + 9 + + + 9 + + + 9 + + + + + 核素搜索: + + + + + + + + + + + + + 16777215 + 16777215 + + + + true + + + false + + + + 核素 + + + + + + + + + + + QWidget#widget_plot{ +border: 1px solid #2c5f8c; +} + + + + 1 + + + 1 + + + 1 + + + 1 + + + + + 6 + + + 0 + + + + + + + + 核素信息 + + + Qt::AlignCenter + + + + + + + 80 + + + 6 + + + 80 + + + 6 + + + + + + + + 半衰期: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 核素不确定度: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + 1 + + + 0 + + + + + + + + 峰信息 + + + Qt::AlignCenter + + + + + + + + 16777215 + 16777215 + + + + true + + + false + + + + + + + + + + + + 1 + + + 0 + + + + + + + + 能量刻度-核素以能量 + + + Qt::AlignCenter + + + + + + + + 16777215 + 16777215 + + + + true + + + false + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + 90 + 16777215 + + + + QPushButton{ +background-color: #1d7be0; +border: 0px solid #1A8EE5; +padding-left:13px; +padding-right:13px; +font-size: 15px; +font-family: Microsoft YaHei; +color:#ffffff; +} + +QPushButton:pressed{ +background-color: #11c678; +} + +QPushButton:hover{ +background-color: #1e80e8; +} + +QPushButton::menu-indicator { +subcontrol-position: right center; +} + + + 确定 + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 90 + 16777215 + + + + QPushButton{ +background-color: #738087; +border: 0px solid #1A8EE5; +padding-left:13px; +padding-right:13px; +font-size: 15px; +font-family: Microsoft YaHei; +color:#ffffff; +} + +QPushButton:pressed{ +background-color: #11c678; +} + +QPushButton:hover{ +background-color: #87979f; +} + +QPushButton::menu-indicator { +subcontrol-position: right center; +} + + + 取消 + + + + + + + + + + diff --git a/src/NuclideAnalysisView/NuclideAnalysisView.cpp b/src/NuclideAnalysisView/NuclideAnalysisView.cpp index f79cc4c..82fa6bd 100644 --- a/src/NuclideAnalysisView/NuclideAnalysisView.cpp +++ b/src/NuclideAnalysisView/NuclideAnalysisView.cpp @@ -10,7 +10,12 @@ #include #include #include - +#include +#include +#include +#include +#include +#include "AddNuclideDialog.h" // 更新选择框显示 static void updateSelectionMarkers(QwtPlot* plot, QwtPlotMarker*& leftMarker, @@ -209,10 +214,10 @@ void NuclideAnalysisView::setupMenu() connect(action_plot_config, &QAction::triggered, this, &NuclideAnalysisView::onActionPlotConfigure); this->_menu->addSeparator(); - QAction* action_plot_select = this->_menu->addAction(QStringLiteral(u"在谱线上选择")); - action_plot_select->setObjectName("plot_select"); - connect(action_plot_select, &QAction::triggered, this, &NuclideAnalysisView::onActionPlotSelect); - this->_menu->addSeparator(); + // QAction* action_plot_select = this->_menu->addAction(QStringLiteral(u"在谱线上选择")); + // action_plot_select->setObjectName("plot_select"); + // connect(action_plot_select, &QAction::triggered, this, &NuclideAnalysisView::onActionPlotSelect); + // this->_menu->addSeparator(); QAction* action_plot_clear = this->_menu->addAction(QStringLiteral(u"清除")); action_plot_clear->setObjectName("plot_clear"); @@ -306,6 +311,14 @@ void NuclideAnalysisView::onActionPlotClear() m_selectRightMarker = nullptr; } + for (QwtPlotMarker* marker : m_selectedNuclideMarkers) { + if (marker) { + marker->detach(); + delete marker; + } + } + m_selectedNuclideMarkers.clear(); + m_allFitResults.clear(); m_bSelecting = false; @@ -542,7 +555,7 @@ void NuclideAnalysisView::DrawPeaks(const QVector& peaks) QwtPlotCurve* rectCurve = new QwtPlotCurve(); rectCurve->setSamples(rectPoints); - rectCurve->setPen(QPen(color, 2, Qt::SolidLine)); + rectCurve->setPen(QPen(color, 1, Qt::SolidLine)); rectCurve->setBrush(QBrush(fillColor)); rectCurve->attach(_plot); m_peakMarkers.append(static_cast(rectCurve)); @@ -633,7 +646,7 @@ void NuclideAnalysisView::setupNuclideDialog() { m_nuclideDialog = new QDialog(this); m_nuclideDialog->setWindowTitle(QStringLiteral(u"匹配核素射线")); - m_nuclideDialog->resize(520, 400); + m_nuclideDialog->resize(700, 400); QVBoxLayout* layout = new QVBoxLayout(m_nuclideDialog); layout->setContentsMargins(6, 6, 6, 6); @@ -651,18 +664,33 @@ void NuclideAnalysisView::setupNuclideDialog() layout->addLayout(topBarLayout); m_nuclideTable = new QTableWidget(m_nuclideDialog); - QStringList headers = { "核素", "射线类型", "能量(keV)","操作" }; + QStringList headers = { "核素", "射线类型", "能量(keV)", "操作" }; m_nuclideTable->setColumnCount(headers.size()); m_nuclideTable->setHorizontalHeaderLabels(headers); - // m_nuclideTable->horizontalHeader()->setStretchLastSection(true); m_nuclideTable->setSelectionBehavior(QAbstractItemView::SelectRows); m_nuclideTable->setEditTriggers(QAbstractItemView::NoEditTriggers); m_nuclideTable->setAlternatingRowColors(true); + + m_nuclideTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); + m_nuclideTable->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); + m_nuclideTable->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch); + m_nuclideTable->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Fixed); + m_nuclideTable->setColumnWidth(3, 120); layout->addWidget(m_nuclideTable); + connect(m_nuclideTable, &QTableWidget::itemSelectionChanged, + this, &NuclideAnalysisView::onNuclideTableSelectionChanged); } void NuclideAnalysisView::queryNuclidesForPeak(const PeakFitResultNuclide& peak) { + for (QwtPlotMarker* marker : m_selectedNuclideMarkers) { + if (marker) { + marker->detach(); + delete marker; + } + } + m_selectedNuclideMarkers.clear(); + if (!peak.success) return; if (!openNuclideDatabase()) { @@ -753,16 +781,47 @@ void NuclideAnalysisView::queryNuclidesForPeak(const PeakFitResultNuclide& peak) return qAbs(a.sortValue - center) < qAbs(b.sortValue - center); }); - m_nuclideTable->setRowCount(matches.size()); - for (int i = 0; i < matches.size(); ++i) { - const auto& m = matches[i]; - m_nuclideTable->setItem(i, 0, new QTableWidgetItem(m.nuclideName)); - m_nuclideTable->setItem(i, 1, new QTableWidgetItem(m.rayType)); - m_nuclideTable->setItem(i, 2, new QTableWidgetItem(m.energyDisplay)); - createRowOperationWidgets(i); + // //单峰显示 + // m_nuclideTable->setRowCount(matches.size()); + // for (int i = 0; i < matches.size(); ++i) { + // const auto& m = matches[i]; + // m_nuclideTable->setItem(i, 0, new QTableWidgetItem(m.nuclideName)); + // m_nuclideTable->setItem(i, 1, new QTableWidgetItem(m.rayType)); + // m_nuclideTable->setItem(i, 2, new QTableWidgetItem(m.energyDisplay)); + // createRowOperationWidgets(i); + // } + + // if (matches.isEmpty()) { + // m_nuclideTable->setRowCount(1); + // m_nuclideTable->setItem(0, 0, new QTableWidgetItem(QStringLiteral(u"未找到匹配核素"))); + // } + + //多峰显示 + if (m_nuclideTable->rowCount() > 0) { + QTableWidgetItem* firstItem = m_nuclideTable->item(0, 0); + if (firstItem) { + QString txt = firstItem->text(); + if (txt == QStringLiteral(u"未找到匹配核素") || + txt == QStringLiteral(u"数据库未打开")) { + m_nuclideTable->removeRow(0); + } + } } - if (matches.isEmpty()) { + // 新匹配结果追加到表格末尾 + int startRow = m_nuclideTable->rowCount(); + for (int i = 0; i < matches.size(); ++i) { + int row = startRow + i; + m_nuclideTable->insertRow(row); + const auto& m = matches[i]; + m_nuclideTable->setItem(row, 0, new QTableWidgetItem(m.nuclideName)); + m_nuclideTable->setItem(row, 1, new QTableWidgetItem(m.rayType)); + m_nuclideTable->setItem(row, 2, new QTableWidgetItem(m.energyDisplay)); + createRowOperationWidgets(row); + } + + // 表格为空且没匹配到时,才显示提示 + if (m_nuclideTable->rowCount() == 0 && matches.isEmpty()) { m_nuclideTable->setRowCount(1); m_nuclideTable->setItem(0, 0, new QTableWidgetItem(QStringLiteral(u"未找到匹配核素"))); } @@ -833,10 +892,124 @@ void NuclideAnalysisView::onDeleteRow() void NuclideAnalysisView::onSaveSelectedNuclides() { + QJsonArray nuclideArray; + for (int i = 0; i < m_nuclideTable->rowCount(); ++i) { + QWidget* widget = m_nuclideTable->cellWidget(i, 3); + if (widget) { + QCheckBox* checkBox = widget->findChild(); + if (checkBox && checkBox->isChecked()) { + QTableWidgetItem* nuclideItem = m_nuclideTable->item(i, 0); + QTableWidgetItem* rayTypeItem = m_nuclideTable->item(i, 1); + QTableWidgetItem* energyItem = m_nuclideTable->item(i, 2); + + if (nuclideItem) { + QJsonObject obj; + obj["nuclide"] = nuclideItem->text(); + if (rayTypeItem) { + obj["ray_type"] = rayTypeItem->text(); + } + if (energyItem) { + obj["energy_keV"] = energyItem->text(); + } + nuclideArray.append(obj); + } + } + } + } + + if (nuclideArray.isEmpty()) { + QMessageBox::information(m_nuclideDialog, QStringLiteral(u"提示"), + QStringLiteral(u"请先勾选要保存的核素")); + return; + } + + QString savePath = _workspace + "/selected_nuclides.json"; + QFile file(savePath); + if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QJsonDocument doc(nuclideArray); + file.write(doc.toJson(QJsonDocument::Indented)); + file.close(); + } else { + QMessageBox::warning(m_nuclideDialog, QStringLiteral(u"保存失败"), + QStringLiteral(u"无法写入文件:%1").arg(savePath)); + } } void NuclideAnalysisView::onAddNuclide() { - + AddNuclideDialog dlg(m_nuclideDialog); + if (dlg.exec() == QDialog::Accepted) { + QList& selectRays = dlg.getSelectRay(); + for (const QStringList& ray : selectRays) { + if (ray.size() >= 3) { + QString nuclideName = ray.at(1); + QString energy = ray.at(2); + int row = m_nuclideTable->rowCount(); + m_nuclideTable->insertRow(row); + m_nuclideTable->setItem(row, 0, new QTableWidgetItem(nuclideName)); + m_nuclideTable->setItem(row, 1, new QTableWidgetItem(QStringLiteral(u"γ"))); + m_nuclideTable->setItem(row, 2, new QTableWidgetItem(energy)); + createRowOperationWidgets(row); + } + } + } } + +void NuclideAnalysisView::onNuclideTableSelectionChanged() +{ + // 清除旧竖线 + for (QwtPlotMarker* marker : m_selectedNuclideMarkers) { + if (marker) { + marker->detach(); + delete marker; + } + } + m_selectedNuclideMarkers.clear(); + + // 获取选中行 + QList ranges = m_nuclideTable->selectedRanges(); + if (ranges.isEmpty()) { + _plot->replot(); + return; + } + + // 遍历选中行,解析能量画竖线 + for (const QTableWidgetSelectionRange& range : ranges) { + for (int row = range.topRow(); row <= range.bottomRow(); ++row) { + QTableWidgetItem* item = m_nuclideTable->item(row, 2); + if (!item) continue; + + QString str = item->text().trimmed(); + if (str.contains('-')) { + // 范围能量,画两条线 + QStringList parts = str.split('-'); + if (parts.size() == 2) { + bool ok1, ok2; + double low = parts[0].trimmed().toDouble(&ok1); + double high = parts[1].trimmed().toDouble(&ok2); + if (ok1 && ok2) { + addNuclideVLine(low); + addNuclideVLine(high); + } + } + } else { + // 单能量,画一条线 + bool ok; + double e = str.toDouble(&ok); + if (ok) addNuclideVLine(e); + } + } + } + _plot->replot(); +} + +void NuclideAnalysisView::addNuclideVLine(double energy) +{ + QwtPlotMarker* marker = new QwtPlotMarker(); + marker->setLineStyle(QwtPlotMarker::VLine); + marker->setLinePen(QPen(Qt::green, 2, Qt::SolidLine)); + marker->setValue(energy, 0); + marker->attach(_plot); + m_selectedNuclideMarkers.append(marker); +} \ No newline at end of file diff --git a/src/NuclideAnalysisView/NuclideAnalysisView.h b/src/NuclideAnalysisView/NuclideAnalysisView.h index 1b40bf7..a6ae4dc 100644 --- a/src/NuclideAnalysisView/NuclideAnalysisView.h +++ b/src/NuclideAnalysisView/NuclideAnalysisView.h @@ -15,6 +15,7 @@ #include #include #include +#include #include "sqlitemanager.h" @@ -81,6 +82,8 @@ private: void createRowOperationWidgets(int row); + void addNuclideVLine(double energy); + private slots: void onActionPlotConfigure(); @@ -93,6 +96,8 @@ private slots: void onDeleteRow(); void onSaveSelectedNuclides(); void onAddNuclide(); + void onNuclideTableSelectionChanged(); + private: CustomQwtPlot* _plot = nullptr; @@ -121,6 +126,8 @@ private: QTableWidget* m_nuclideTable = nullptr; QPushButton* m_saveBtn = nullptr; QPushButton* m_addBtn = nullptr; // 新增核素按钮 + QList m_selectedNuclideMarkers; + }; #endif // NUCLIDEANALYSISVIEW_H \ No newline at end of file diff --git a/src/src.pro b/src/src.pro index ab59bc8..881a253 100644 --- a/src/src.pro +++ b/src/src.pro @@ -92,6 +92,7 @@ SOURCES += \ MeasureDeviceParamsConfigView/DeviceParamsSaveToSysDlg.cpp \ MeasureDeviceParamsConfigView/DeviceParamsTableForm.cpp \ MeasureDeviceParamsConfigView/MeasureDeviceParamsConfigView.cpp \ + NuclideAnalysisView/AddNuclideDialog.cpp \ NuclideAnalysisView/NuclideAnalysisView.cpp \ NuclideLib/NuclideEditDialog.cpp \ NuclideLib/NuclideRayDialog.cpp \ @@ -148,6 +149,7 @@ HEADERS += \ MeasureDeviceParamsConfigView/DeviceParamsSaveToSysDlg.h \ MeasureDeviceParamsConfigView/DeviceParamsTableForm.h \ MeasureDeviceParamsConfigView/MeasureDeviceParamsConfigView.h \ + NuclideAnalysisView/AddNuclideDialog.h \ NuclideAnalysisView/NuclideAnalysisView.h \ NuclideLib/NuclideEditDialog.h \ NuclideLib/NuclideRayDialog.h \ @@ -187,6 +189,7 @@ FORMS += \ MeasureDeviceParamsConfigView/DeviceParamsManagerDlg.ui \ MeasureDeviceParamsConfigView/DeviceParamsSaveToSysDlg.ui \ MeasureDeviceParamsConfigView/DeviceParamsTableForm.ui \ + NuclideAnalysisView/AddNuclideDialog.ui \ ParticleCountPlotView/BatchEnergyScaleDialog.ui \ NewMeasureAnalysisDlg.ui \ RegionOfInterest/RegionOfInterest.ui \