2026-04-14 18:05:38 +08:00
|
|
|
|
#include "NuclideLib.h"
|
|
|
|
|
|
#include "ui_NuclideLib.h"
|
|
|
|
|
|
#include "sqlitemanager.h"
|
|
|
|
|
|
#include <QMessageBox>
|
|
|
|
|
|
#include <QHeaderView>
|
|
|
|
|
|
#include <QPainter>
|
|
|
|
|
|
#include <QStyleOptionButton>
|
|
|
|
|
|
#include <QMouseEvent>
|
|
|
|
|
|
#include <QApplication>
|
2026-05-09 16:50:34 +08:00
|
|
|
|
#include <QDebug>
|
|
|
|
|
|
#include <QDateTime>
|
|
|
|
|
|
#include "NuclideRayListDialog.h"
|
2026-04-14 18:05:38 +08:00
|
|
|
|
ButtonDelegate::ButtonDelegate(QObject *parent) : QStyledItemDelegate(parent) {}
|
|
|
|
|
|
|
|
|
|
|
|
void ButtonDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
|
|
|
|
|
|
{
|
|
|
|
|
|
if (index.column() == 7) {
|
|
|
|
|
|
QStyleOptionButton button;
|
|
|
|
|
|
button.rect = option.rect;
|
2026-05-12 19:18:41 +08:00
|
|
|
|
button.text = QStringLiteral(u"核素发射射线信息");
|
2026-04-14 18:05:38 +08:00
|
|
|
|
button.state = QStyle::State_Enabled;
|
|
|
|
|
|
if (option.state & QStyle::State_MouseOver)
|
|
|
|
|
|
button.state |= QStyle::State_MouseOver;
|
|
|
|
|
|
QApplication::style()->drawControl(QStyle::CE_PushButton, &button, painter);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
QStyledItemDelegate::paint(painter, option, index);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool ButtonDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (index.column() == 7 && event->type() == QEvent::MouseButtonRelease) {
|
|
|
|
|
|
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
|
|
|
|
|
|
QRect buttonRect = option.rect;
|
|
|
|
|
|
if (buttonRect.contains(mouseEvent->pos())) {
|
|
|
|
|
|
emit buttonClicked(index);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return QStyledItemDelegate::editorEvent(event, model, option, index);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
NuclideLibManage::NuclideLibManage(QWidget *parent) :
|
|
|
|
|
|
QWidget(parent),
|
|
|
|
|
|
ui(new Ui::NuclideLibManage)
|
|
|
|
|
|
{
|
|
|
|
|
|
ui->setupUi(this);
|
|
|
|
|
|
|
|
|
|
|
|
m_model = new QStandardItemModel(0, 8, this);
|
|
|
|
|
|
m_model->setHorizontalHeaderLabels({"ID", "序号", "核素名称", "半衰期", "半衰期不确定度", "母体核素名称", "子体核素名称", "操作"});
|
|
|
|
|
|
ui->tableView->setModel(m_model);
|
|
|
|
|
|
|
|
|
|
|
|
ui->tableView->setColumnHidden(0, true);
|
|
|
|
|
|
|
|
|
|
|
|
ui->tableView->setColumnWidth(1, 90); // 序号
|
|
|
|
|
|
ui->tableView->setColumnWidth(7, 280); // 操作列
|
|
|
|
|
|
ui->tableView->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
|
|
|
|
|
|
ui->tableView->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Stretch);
|
|
|
|
|
|
ui->tableView->horizontalHeader()->setSectionResizeMode(4, QHeaderView::Stretch);
|
|
|
|
|
|
ui->tableView->horizontalHeader()->setSectionResizeMode(5, QHeaderView::Stretch);
|
|
|
|
|
|
ui->tableView->horizontalHeader()->setSectionResizeMode(6, QHeaderView::Stretch);
|
|
|
|
|
|
|
|
|
|
|
|
ui->tableView->setAlternatingRowColors(true);
|
|
|
|
|
|
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
|
|
|
|
|
|
ui->tableView->setFocusPolicy(Qt::NoFocus);
|
2026-05-12 19:18:41 +08:00
|
|
|
|
ui->tableView->verticalHeader()->setVisible(false);
|
2026-04-14 18:05:38 +08:00
|
|
|
|
|
2026-05-12 19:18:41 +08:00
|
|
|
|
QString dbPath = QCoreApplication::applicationDirPath() + "/nuclideLib.db";
|
2026-05-09 16:50:34 +08:00
|
|
|
|
qDebug()<<dbPath;
|
|
|
|
|
|
bool dbOpened = SqliteManager::instance().openDatabase(dbPath);
|
|
|
|
|
|
if (!dbOpened) {
|
|
|
|
|
|
QMessageBox::critical(this, "数据库错误", "打开数据库失败:" + SqliteManager::instance().lastError());
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-04-14 18:05:38 +08:00
|
|
|
|
// 设置委托
|
|
|
|
|
|
m_delegate = new ButtonDelegate(this);
|
|
|
|
|
|
ui->tableView->setItemDelegateForColumn(7, m_delegate);
|
|
|
|
|
|
connect(m_delegate, &ButtonDelegate::buttonClicked, this, &NuclideLibManage::onButtonClicked);
|
2026-05-09 16:50:34 +08:00
|
|
|
|
loadNuclideData();
|
|
|
|
|
|
|
2026-04-14 18:05:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
NuclideLibManage::~NuclideLibManage()
|
|
|
|
|
|
{
|
|
|
|
|
|
delete ui;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void NuclideLibManage::loadNuclideData()
|
|
|
|
|
|
{
|
2026-05-09 16:50:34 +08:00
|
|
|
|
QString sql = "SELECT ID, NUCLIDE_NAME, HALF_LIFE, HALF_LIFE_UNCERTAINTY, PARENT_NUCLIDE_NAME, CHILD_NUCLIDE_NAME FROM nuclideLib;";
|
2026-04-14 18:05:38 +08:00
|
|
|
|
auto rows = SqliteManager::instance().selectRows(sql);
|
2026-05-09 16:50:34 +08:00
|
|
|
|
|
2026-04-14 18:05:38 +08:00
|
|
|
|
m_listNuclide.clear();
|
|
|
|
|
|
m_model->setRowCount(0);
|
|
|
|
|
|
int row = 0;
|
|
|
|
|
|
for (const auto& rec : rows) {
|
|
|
|
|
|
QStringList item;
|
|
|
|
|
|
item << rec["ID"].toString()
|
2026-05-09 16:50:34 +08:00
|
|
|
|
<< rec["NUCLIDE_NAME"].toString()
|
2026-04-14 18:05:38 +08:00
|
|
|
|
<< rec["HALF_LIFE"].toString()
|
2026-05-12 19:18:41 +08:00
|
|
|
|
<< rec["HALF_LIFE_UNCERTAINTY"].toString()
|
|
|
|
|
|
<< rec["PARENT_NUCLIDE_NAME"].toString()
|
|
|
|
|
|
<< rec["CHILD_NUCLIDE_NAME"].toString();
|
2026-04-14 18:05:38 +08:00
|
|
|
|
m_listNuclide.append(item);
|
|
|
|
|
|
|
2026-05-09 16:50:34 +08:00
|
|
|
|
// 插入模型行(界面显示逻辑不变)
|
2026-04-14 18:05:38 +08:00
|
|
|
|
QList<QStandardItem*> rowItems;
|
|
|
|
|
|
// 第0列:ID(隐藏)
|
|
|
|
|
|
QStandardItem *idItem = new QStandardItem(item[0]);
|
|
|
|
|
|
idItem->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
|
idItem->setFlags(idItem->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
|
rowItems << idItem;
|
|
|
|
|
|
// 第1列:序号(行号+1)
|
|
|
|
|
|
QStandardItem *seqItem = new QStandardItem(QString::number(row + 1));
|
|
|
|
|
|
seqItem->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
|
seqItem->setFlags(seqItem->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
|
rowItems << seqItem;
|
|
|
|
|
|
// 第2~6列:核素名称、半衰期等
|
2026-05-09 16:50:34 +08:00
|
|
|
|
for (int col = 1; col <= 5; ++col) {
|
2026-04-14 18:05:38 +08:00
|
|
|
|
QStandardItem *dataItem = new QStandardItem(item[col]);
|
|
|
|
|
|
dataItem->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
|
dataItem->setFlags(dataItem->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
|
rowItems << dataItem;
|
|
|
|
|
|
}
|
2026-05-09 16:50:34 +08:00
|
|
|
|
// 第7列:操作列
|
2026-04-14 18:05:38 +08:00
|
|
|
|
QStandardItem *opItem = new QStandardItem("");
|
|
|
|
|
|
opItem->setFlags(opItem->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
|
rowItems << opItem;
|
|
|
|
|
|
|
|
|
|
|
|
m_model->appendRow(rowItems);
|
|
|
|
|
|
++row;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QStringList NuclideLibManage::getNuclideData(const QString &id)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (const auto& item : m_listNuclide) {
|
|
|
|
|
|
if (item.at(0) == id)
|
|
|
|
|
|
return item;
|
|
|
|
|
|
}
|
|
|
|
|
|
return QStringList();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void NuclideLibManage::on_pushButton_add_clicked()
|
|
|
|
|
|
{
|
2026-05-09 16:50:34 +08:00
|
|
|
|
NuclideEditDialog dlg(false, {}, this);
|
|
|
|
|
|
if (dlg.exec() == QDialog::Accepted) {
|
|
|
|
|
|
QStringList data = dlg.getNuclideData();
|
|
|
|
|
|
if (data.size() < 5) return;
|
|
|
|
|
|
|
|
|
|
|
|
QMap<QString, QVariant> fieldValues;
|
|
|
|
|
|
fieldValues["NUCLIDE_NAME"] = data[0];
|
|
|
|
|
|
fieldValues["HALF_LIFE"] = data[1];
|
|
|
|
|
|
fieldValues["HALF_LIFE_UNCERTAINTY"] = data[2].toDouble(); // 显式转换为REAL类型
|
|
|
|
|
|
fieldValues["PARENT_NUCLIDE_NAME"] = data[3];
|
|
|
|
|
|
fieldValues["CHILD_NUCLIDE_NAME"] = data[4];
|
|
|
|
|
|
fieldValues["CREATE_TIME"] = QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
|
|
|
|
|
|
|
qint64 newId = SqliteManager::instance().insertRow("nuclideLib", fieldValues);
|
|
|
|
|
|
if (newId > 0) {
|
2026-05-12 19:18:41 +08:00
|
|
|
|
QMessageBox::information(this, QStringLiteral(u"成功"), QStringLiteral(u"核素添加成功!"));
|
2026-05-09 16:50:34 +08:00
|
|
|
|
loadNuclideData();
|
|
|
|
|
|
} else {
|
2026-05-12 19:18:41 +08:00
|
|
|
|
QMessageBox::warning(this, QStringLiteral(u"失败"), QStringLiteral(u"添加失败:") + SqliteManager::instance().lastError());
|
2026-05-09 16:50:34 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-04-14 18:05:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void NuclideLibManage::on_pushButton_edit_clicked()
|
|
|
|
|
|
{
|
|
|
|
|
|
QModelIndexList selected = ui->tableView->selectionModel()->selectedRows();
|
|
|
|
|
|
if (selected.isEmpty()) {
|
2026-05-12 19:18:41 +08:00
|
|
|
|
QMessageBox::information(this, QStringLiteral(u"提示"), QStringLiteral(u"请先选择要修改的核素行!"));
|
2026-04-14 18:05:38 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
2026-05-09 16:50:34 +08:00
|
|
|
|
|
2026-04-14 18:05:38 +08:00
|
|
|
|
int row = selected.first().row();
|
2026-05-09 16:50:34 +08:00
|
|
|
|
QString id = m_model->index(row, 0).data().toString();
|
2026-04-14 18:05:38 +08:00
|
|
|
|
QStringList data = getNuclideData(id);
|
|
|
|
|
|
if (data.isEmpty()) return;
|
2026-05-09 16:50:34 +08:00
|
|
|
|
|
|
|
|
|
|
NuclideEditDialog dlg(true, data, this);
|
|
|
|
|
|
if (dlg.exec() == QDialog::Accepted) {
|
|
|
|
|
|
QStringList newData = dlg.getNuclideData();
|
|
|
|
|
|
if (newData.size() < 6) return;
|
|
|
|
|
|
|
|
|
|
|
|
QMap<QString, QVariant> fieldValues;
|
|
|
|
|
|
fieldValues["NUCLIDE_NAME"] = newData[1];
|
|
|
|
|
|
fieldValues["HALF_LIFE"] = newData[2];
|
|
|
|
|
|
fieldValues["HALF_LIFE_UNCERTAINTY"] = newData[3].toDouble(); // 显式转换为REAL类型
|
|
|
|
|
|
fieldValues["PARENT_NUCLIDE_NAME"] = newData[4];
|
|
|
|
|
|
fieldValues["CHILD_NUCLIDE_NAME"] = newData[5];
|
|
|
|
|
|
|
|
|
|
|
|
int affectedRows = SqliteManager::instance().updateRow(
|
|
|
|
|
|
"nuclideLib",
|
|
|
|
|
|
fieldValues,
|
|
|
|
|
|
"ID = ?",
|
|
|
|
|
|
{newData[0]}
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (affectedRows > 0) {
|
2026-05-12 19:18:41 +08:00
|
|
|
|
QMessageBox::information(this, QStringLiteral(u"成功"), QStringLiteral(u"核素修改成功!"));
|
2026-05-09 16:50:34 +08:00
|
|
|
|
loadNuclideData();
|
|
|
|
|
|
} else if (affectedRows == 0) {
|
2026-05-12 19:18:41 +08:00
|
|
|
|
QMessageBox::information(this, QStringLiteral(u"提示"), QStringLiteral(u"未修改任何数据!"));
|
2026-05-09 16:50:34 +08:00
|
|
|
|
} else {
|
2026-05-12 19:18:41 +08:00
|
|
|
|
QMessageBox::warning(this, QStringLiteral(u"失败"), QStringLiteral(u"修改失败:") + SqliteManager::instance().lastError());
|
2026-05-09 16:50:34 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-04-14 18:05:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void NuclideLibManage::on_pushButton_del_clicked()
|
|
|
|
|
|
{
|
|
|
|
|
|
QModelIndexList selected = ui->tableView->selectionModel()->selectedRows();
|
|
|
|
|
|
if (selected.isEmpty()) {
|
2026-05-12 19:18:41 +08:00
|
|
|
|
QMessageBox::information(this, QStringLiteral(u"提示"), QStringLiteral(u"请先选择要删除的核素行!"));
|
2026-04-14 18:05:38 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
2026-05-09 16:50:34 +08:00
|
|
|
|
|
2026-04-14 18:05:38 +08:00
|
|
|
|
int row = selected.first().row();
|
|
|
|
|
|
QString id = m_model->index(row, 0).data().toString();
|
|
|
|
|
|
|
2026-05-12 19:18:41 +08:00
|
|
|
|
QMessageBox box(QMessageBox::Question, QStringLiteral(u"提示"), QStringLiteral(u"确定删除该核素吗?"),
|
2026-04-14 18:05:38 +08:00
|
|
|
|
QMessageBox::Yes | QMessageBox::No, this);
|
2026-05-12 19:18:41 +08:00
|
|
|
|
box.button(QMessageBox::Yes)->setText(QStringLiteral(u"确认"));
|
|
|
|
|
|
box.button(QMessageBox::No)->setText(QStringLiteral(u"取消"));
|
2026-04-14 18:05:38 +08:00
|
|
|
|
if (box.exec() != QMessageBox::Yes) return;
|
|
|
|
|
|
|
2026-05-09 16:50:34 +08:00
|
|
|
|
bool ok = SqliteManager::instance().deleteRow("nuclideLib", "ID = ?", {id});
|
2026-04-14 18:05:38 +08:00
|
|
|
|
if (ok) {
|
|
|
|
|
|
loadNuclideData();
|
|
|
|
|
|
} else {
|
2026-05-12 19:18:41 +08:00
|
|
|
|
QMessageBox::warning(this, QStringLiteral(u"错误"), QStringLiteral(u"删除失败:") + SqliteManager::instance().lastError());
|
2026-04-14 18:05:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void NuclideLibManage::onButtonClicked(const QModelIndex &index)
|
|
|
|
|
|
{
|
|
|
|
|
|
int row = index.row();
|
|
|
|
|
|
QString nuclideId = m_model->index(row, 0).data().toString();
|
2026-05-09 16:50:34 +08:00
|
|
|
|
QString nuclideName = m_model->index(row, 2).data().toString();
|
|
|
|
|
|
|
|
|
|
|
|
// 打开射线信息管理对话框
|
|
|
|
|
|
NuclideRayListDialog dlg(nuclideId, nuclideName, this);
|
|
|
|
|
|
dlg.exec();
|
|
|
|
|
|
|
2026-04-14 18:05:38 +08:00
|
|
|
|
}
|