EnergySpectrumAnalyer/src/NuclideLib/NuclideRayListDialog.cpp

250 lines
10 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "NuclideRayListDialog.h"
#include <QTableView>
RayButtonDelegate::RayButtonDelegate(QObject *parent) : QStyledItemDelegate(parent) {}
void RayButtonDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if (index.column() == 8) { // 第8列是操作列
// 绘制编辑按钮
QStyleOptionButton editBtn;
editBtn.rect = QRect(option.rect.x(), option.rect.y() + 2, 60, option.rect.height() - 4);
editBtn.text = QStringLiteral(u"编辑");
editBtn.state = QStyle::State_Enabled;
if (option.state & QStyle::State_MouseOver)
editBtn.state |= QStyle::State_MouseOver;
QApplication::style()->drawControl(QStyle::CE_PushButton, &editBtn, painter);
// 绘制删除按钮
QStyleOptionButton delBtn;
delBtn.rect = QRect(option.rect.x() + 70, option.rect.y() + 2, 60, option.rect.height() - 4);
delBtn.text = QStringLiteral(u"删除");
delBtn.state = QStyle::State_Enabled;
if (option.state & QStyle::State_MouseOver)
delBtn.state |= QStyle::State_MouseOver;
QApplication::style()->drawControl(QStyle::CE_PushButton, &delBtn, painter);
} else {
QStyledItemDelegate::paint(painter, option, index);
}
}
bool RayButtonDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
if (index.column() == 8 && event->type() == QEvent::MouseButtonRelease) {
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
QRect editRect = QRect(option.rect.x(), option.rect.y() + 2, 60, option.rect.height() - 4);
QRect delRect = QRect(option.rect.x() + 70, option.rect.y() + 2, 60, option.rect.height() - 4);
if (editRect.contains(mouseEvent->pos())) {
emit editButtonClicked(index);
return true;
} else if (delRect.contains(mouseEvent->pos())) {
emit deleteButtonClicked(index);
return true;
}
}
return QStyledItemDelegate::editorEvent(event, model, option, index);
}
NuclideRayListDialog::NuclideRayListDialog(const QString& nuclideId, const QString& nuclideName, QWidget *parent)
: QDialog(parent), m_nuclideId(nuclideId), m_nuclideName(nuclideName)
{
initUI();
loadRayData();
}
void NuclideRayListDialog::initUI()
{
setWindowTitle(QStringLiteral(u"%1 - 射线信息管理").arg(m_nuclideName));
setFixedSize(1100, 500);
QVBoxLayout *mainLayout = new QVBoxLayout(this);
// 添加按钮
QPushButton *btnAdd = new QPushButton(QStringLiteral(u"添加射线"), this);
connect(btnAdd, &QPushButton::clicked, this, &NuclideRayListDialog::onAddRayClicked);
mainLayout->addWidget(btnAdd, 0, Qt::AlignRight);
// 射线列表
m_model = new QStandardItemModel(0, 9, this);
m_model->setHorizontalHeaderLabels({
QStringLiteral(u"ID"), QStringLiteral(u"射线类型"), QStringLiteral(u"能量(MeV)"), QStringLiteral(u"能量不确定度"), QStringLiteral(u"分支比"),
QStringLiteral(u"分支比不确定度"), QStringLiteral(u"主射线"), QStringLiteral(u"加和峰"), QStringLiteral(u"操作")
});
QTableView *tableView = new QTableView(this);
tableView->setModel(m_model);
tableView->verticalHeader()->setVisible(false);
tableView->setColumnWidth(0, 80); // ID
tableView->setColumnWidth(1, 80); // 射线类型
tableView->setColumnWidth(2, 120); // 能量
tableView->setColumnWidth(3, 120); // 能量不确定度
tableView->setColumnWidth(4, 100); // 分支比
tableView->setColumnWidth(5, 120); // 分支比不确定度
tableView->setColumnWidth(6, 80); // 主射线
tableView->setColumnWidth(7, 100); // 加和峰
tableView->setColumnWidth(8, 150); // 操作列
tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
tableView->setAlternatingRowColors(true);
tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
tableView->setFocusPolicy(Qt::NoFocus);
// 设置委托
m_delegate = new RayButtonDelegate(this);
tableView->setItemDelegateForColumn(8, m_delegate);
connect(m_delegate, &RayButtonDelegate::editButtonClicked, this, &NuclideRayListDialog::onEditRayClicked);
connect(m_delegate, &RayButtonDelegate::deleteButtonClicked, this, &NuclideRayListDialog::onDeleteRayClicked);
mainLayout->addWidget(tableView);
// 关闭按钮
QPushButton *btnClose = new QPushButton(QStringLiteral(u"关闭"), this);
connect(btnClose, &QPushButton::clicked, this, &QDialog::accept);
mainLayout->addWidget(btnClose, 0, Qt::AlignRight);
}
void NuclideRayListDialog::loadRayData()
{
// 查询当前核素的所有射线信息
QString sql = "SELECT ID, RAY_TYPE, RAY_MEV, RAY_MEV_UNCERTAINTY, RAY_BRANCH_RATIO, "
"RAY_BRANCH_RATIO_UNCERTAINTY, MAIN_RAY_IDENT, JIAHE_PEAK "
"FROM nuclideRayInfo WHERE NUCLIDE_ID = ?;";
auto rows = SqliteManager::instance().selectRows(sql, {m_nuclideId});
m_listRay.clear();
m_model->setRowCount(0);
int row = 0;
for (const auto& rec : rows) {
QStringList item;
item << rec["ID"].toString()
<< rec["RAY_TYPE"].toString()
<< rec["RAY_MEV"].toString()
<< rec["RAY_MEV_UNCERTAINTY"].toString()
<< rec["RAY_BRANCH_RATIO"].toString()
<< rec["RAY_BRANCH_RATIO_UNCERTAINTY"].toString()
<< rec["MAIN_RAY_IDENT"].toString()
<< rec["JIAHE_PEAK"].toString();
m_listRay.append(item);
// 插入模型行
QList<QStandardItem*> rowItems;
// 第0列ID隐藏
QStandardItem *idItem = new QStandardItem(item[0]);
idItem->setTextAlignment(Qt::AlignCenter);
idItem->setFlags(idItem->flags() & ~Qt::ItemIsEditable);
rowItems << idItem;
// 第1~7列射线数据
for (int col = 1; col <= 7; ++col) {
QStandardItem *dataItem = new QStandardItem(item[col]);
dataItem->setTextAlignment(Qt::AlignCenter);
dataItem->setFlags(dataItem->flags() & ~Qt::ItemIsEditable);
rowItems << dataItem;
}
// 第8列操作列
QStandardItem *opItem = new QStandardItem("");
opItem->setFlags(opItem->flags() & ~Qt::ItemIsEditable);
rowItems << opItem;
m_model->appendRow(rowItems);
++row;
}
}
QStringList NuclideRayListDialog::getRayData(const QString &id)
{
for (const auto& item : m_listRay) {
if (item.at(0) == id)
return item;
}
return QStringList();
}
void NuclideRayListDialog::onAddRayClicked()
{
NuclideRayDialog dlg(false, {}, this);
if (dlg.exec() == QDialog::Accepted) {
QStringList data = dlg.getRayData();
if (data.size() < 7) return;
QMap<QString, QVariant> fieldValues;
fieldValues["NUCLIDE_ID"] = m_nuclideId.toInt();
fieldValues["RAY_TYPE"] = data[0];
fieldValues["RAY_MEV"] = data[1];
fieldValues["RAY_MEV_UNCERTAINTY"] = data[2];
fieldValues["RAY_BRANCH_RATIO"] = data[3];
fieldValues["RAY_BRANCH_RATIO_UNCERTAINTY"] = data[4];
fieldValues["MAIN_RAY_IDENT"] = data[5];
fieldValues["JIAHE_PEAK"] = data[6];
fieldValues["CREATE_TIME"] = QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss");
qint64 newId = SqliteManager::instance().insertRow("nuclideRayInfo", fieldValues);
if (newId > 0) {
QMessageBox::information(this, QStringLiteral(u"成功"), QStringLiteral(u"射线信息添加成功!"));
loadRayData(); // 刷新列表
} else {
QMessageBox::warning(this, QStringLiteral(u"失败"), QStringLiteral(u"添加失败:") + SqliteManager::instance().lastError());
}
}
}
void NuclideRayListDialog::onEditRayClicked(const QModelIndex &index)
{
int row = index.row();
QString id = m_model->index(row, 0).data().toString();
QStringList data = getRayData(id);
if (data.isEmpty()) return;
NuclideRayDialog dlg(true, data, this);
if (dlg.exec() == QDialog::Accepted) {
QStringList newData = dlg.getRayData();
if (newData.size() < 8) return;
QMap<QString, QVariant> fieldValues;
fieldValues["RAY_TYPE"] = newData[1];
fieldValues["RAY_MEV"] = newData[2];
fieldValues["RAY_MEV_UNCERTAINTY"] = newData[3];
fieldValues["RAY_BRANCH_RATIO"] = newData[4];
fieldValues["RAY_BRANCH_RATIO_UNCERTAINTY"] = newData[5];
fieldValues["MAIN_RAY_IDENT"] = newData[6];
fieldValues["JIAHE_PEAK"] = newData[7];
int affectedRows = SqliteManager::instance().updateRow(
"nuclideRayInfo",
fieldValues,
"ID = ?",
{newData[0]}
);
if (affectedRows > 0) {
QMessageBox::information(this, QStringLiteral(u"成功"), QStringLiteral(u"射线信息修改成功!"));
loadRayData();
} else if (affectedRows == 0) {
QMessageBox::information(this, QStringLiteral(u"提示"), QStringLiteral(u"未修改任何数据!"));
} else {
QMessageBox::warning(this, QStringLiteral(u"失败"), QStringLiteral(u"修改失败:") + SqliteManager::instance().lastError());
}
}
}
void NuclideRayListDialog::onDeleteRayClicked(const QModelIndex &index)
{
int row = index.row();
QString id = m_model->index(row, 0).data().toString();
QMessageBox box(QMessageBox::Question, QStringLiteral(u"提示"), QStringLiteral(u"确定删除该射线信息吗?"),
QMessageBox::Yes | QMessageBox::No, this);
box.button(QMessageBox::Yes)->setText(QStringLiteral(u"确认"));
box.button(QMessageBox::No)->setText(QStringLiteral(u"取消"));
if (box.exec() != QMessageBox::Yes) return;
bool ok = SqliteManager::instance().deleteRow("nuclideRayInfo", "ID = ?", {id});
if (ok) {
loadRayData();
} else {
QMessageBox::warning(this, QStringLiteral(u"错误"), QStringLiteral(u"删除失败:") + SqliteManager::instance().lastError());
}
}