EnergySpectrumAnalyer/src/NuclideLib/NuclideRayListDialog.cpp

250 lines
10 KiB
C++
Raw Normal View History

#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());
}
}