#include "NuclideRayListDialog.h" #include 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(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 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 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 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()); } }