From 4ba9703c4de8c1ec7ae19b05246974f7efd3badd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B5=B7?= Date: Mon, 30 Mar 2026 13:37:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=B2=92=E5=AD=90=E5=85=A5?= =?UTF-8?q?=E5=B0=84=E6=97=B6=E9=97=B4=E6=95=B0=E6=8D=AE=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E5=8F=8A=E4=BA=A4=E4=BA=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BusyIndicator/BusyIndicator.cpp | 3 + .../ParticleInjectTimeAnalysisView.cpp | 258 ++++++++---------- .../ParticleInjectTimeAnalysisView.h | 40 ++- .../ParticleInjectTimeAnalysisView.ui | 157 ----------- src/src.pro | 1 - 5 files changed, 134 insertions(+), 325 deletions(-) delete mode 100644 src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.ui diff --git a/src/BusyIndicator/BusyIndicator.cpp b/src/BusyIndicator/BusyIndicator.cpp index bf9c3ed..2106cbb 100644 --- a/src/BusyIndicator/BusyIndicator.cpp +++ b/src/BusyIndicator/BusyIndicator.cpp @@ -9,6 +9,9 @@ BusyIndicator::BusyIndicator(QWidget* parent) setAttribute(Qt::WA_TransparentForMouseEvents); QLabel* icon = new QLabel; + icon->resize(80, 80); + QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + icon->setSizePolicy(sizePolicy); _busy_movie = new QMovie(":gif/BusyIndicator.gif"); // 转圈 GIF icon->setMovie(_busy_movie); _busy_movie->start(); diff --git a/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.cpp b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.cpp index b70f202..deb2c4b 100644 --- a/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.cpp +++ b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.cpp @@ -1,5 +1,4 @@ #include "ParticleInjectTimeAnalysisView.h" -#include "ui_ParticleInjectTimeAnalysisView.h" #include #include #include @@ -12,22 +11,61 @@ #include #include #include "CustomQwtPlot.h" -#include #include +#include "csv.h" +#include +#include +#include "BusyIndicator.h" +#include +#include ParticleInjectTimeAnalysisView::ParticleInjectTimeAnalysisView(QWidget *parent) : - MeasureAnalysisView(parent), - ui(new Ui::ParticleInjectTimeAnalysisView) + MeasureAnalysisView(parent) { this->setViewType(PlotFrame); - ui->setupUi(this); - InitUi(); + _plot = new CustomQwtPlot(); + QVBoxLayout* layout = new QVBoxLayout(this); + layout->addWidget(_plot); + + _plot->setCanvasBackground(Qt::white); + QwtPlotCanvas* canvas = qobject_cast(_plot->canvas()); + canvas->setFrameStyle(QFrame::NoFrame); + + QFont font = this->font(); + font.setBold(false); + QwtText particle_num_label = QStringLiteral(u"粒子序号"); + particle_num_label.setFont(font); + QwtText time_label = QStringLiteral(u"粒子时间(ns)"); + time_label.setFont(font); + _plot->setAxisTitle(QwtPlot::xBottom, particle_num_label); + _plot->setAxisTitle(QwtPlot::yLeft, time_label); + // set axis auto scale + _plot->setAxisAutoScale(QwtPlot::xBottom, true); + _plot->setAxisAutoScale(QwtPlot::yLeft, true); + // 启用网格线 + _plot->enableAxis(QwtPlot::xBottom); + _plot->enableAxis(QwtPlot::yLeft); + + _plot->SetAxisDragScale(QwtPlot::xBottom, true); + + // // 设置QWT图例 + // QwtLegend* legend = new QwtLegend(); + // legend->setDefaultItemMode(QwtLegendData::ReadOnly); + // _plot->insertLegend(legend, QwtPlot::RightLegend); + + _curve = new QwtPlotCurve(); + _plot->AddCurve(_curve); + + this->_menu = new QMenu(this); + setupMenu(); + + _busy_indicator = new BusyIndicator(this); } ParticleInjectTimeAnalysisView::~ParticleInjectTimeAnalysisView() { - delete ui; + } void ParticleInjectTimeAnalysisView::InitViewWorkspace(const QString &project_name) @@ -37,153 +75,83 @@ void ParticleInjectTimeAnalysisView::InitViewWorkspace(const QString &project_na void ParticleInjectTimeAnalysisView::SetAnalyzeDataFilename(const QMap &data_files_set) { - int energyStart = ui->label_energyStart->text().toInt(); - int energyEnd = ui->label_energyEnd->text().toInt(); - if(!data_files_set.isEmpty()) - { - io::CSVReader<4> in(QStrToSysPath(data_files_set.first().toString())); - in.read_header(io::ignore_extra_column, "板卡号", "通道号", "能量(KeV)", "时间计数"); - - int board, channel; - double energy, time_count; - int lineNumber = 0; - QVector x; - QVector y; - double minValue = 0; - double maxValue = 0; - // 逐行读取 - while (in.read_row(board, channel, energy, time_count)) - { - // qDebug()< 32) - { - continue; - } - if(energy <= energyStart || energy >= energyEnd) - { - continue; - } - x.append(lineNumber); - y.append(time_count); - minValue = qMin(minValue, time_count); - maxValue = qMax(maxValue, time_count); - } - // 创建曲线并设置数据 - QwtPlotCurve *curve = new QwtPlotCurve(); - curve->setSamples(x, y); - // 将曲线添加到 CustomQwtPlot 中(会自动分配颜色) - plot->AddCurve(curve); - // 设置坐标轴范围和标题 - // plot->setAxisScale(QwtPlot::xBottom, 0, x.last()); - // plot->setAxisScale(QwtPlot::yLeft,minValue , maxValue); - - LOG_INFO(QStringLiteral(u"%1数据读取完毕.").arg(this->GetViewName())); - - // 刷新绘图 - plot->replot(); -// m_AllData = getParticleInjectTimeData(data_files_set.first().toString()); -// setData(m_AllData); - - } -} - -void ParticleInjectTimeAnalysisView::setData(QVector data) -{ - int energyStart = ui->label_energyStart->text().toInt(); - int energyEnd = ui->label_energyEnd->text().toInt(); - - QVector x; - QVector y; - - double minValue = 0; - double maxValue = 0; - for(auto info : data) - { - if(info->dEnergy <= energyStart || info->dEnergy >= energyEnd) - { - continue; + const QString& data_filename = data_files_set.first().toString(); + if ( !data_filename.isEmpty() ) { + if (QFileInfo(data_filename).exists()) { + this->_data_filename = data_filename; + this->updateData(true); } - x.append(info->index); - y.append(info->dTime); - minValue = qMin(minValue, info->dTime); - maxValue = qMax(maxValue, info->dTime); } +} - // 创建曲线并设置数据 - QwtPlotCurve *curve = new QwtPlotCurve(); -// curve->setRawSamples(x.data(),y.data(),x.size()); - curve->setSamples(x, y); - // 将曲线添加到 CustomQwtPlot 中(会自动分配颜色) - plot->AddCurve(curve); - // 设置坐标轴范围和标题 -// plot->setAxisScale(QwtPlot::xBottom, 0, x.last()); -// plot->setAxisScale(QwtPlot::yLeft,minValue , maxValue); +void ParticleInjectTimeAnalysisView::setupMenu() +{ + this->setContextMenuPolicy(Qt::CustomContextMenu); + connect(this, &ParticleInjectTimeAnalysisView::customContextMenuRequested, [this](const QPoint& pos) { + this->_menu->exec(this->mapToGlobal(pos)); + }); + QAction* action_plot_reset = this->_menu->addAction(QStringLiteral(u"还原")); + action_plot_reset->setObjectName("plot_reset"); + connect(action_plot_reset, &QAction::triggered, [this]() { + this->_plot->ResetPlot(); + }); + this->_menu->addSeparator(); - LOG_INFO(QStringLiteral(u"%1数据读取完毕.").arg(this->GetViewName())); + this->_menu->addSeparator(); + QAction* action_plot_config = this->_menu->addAction(QStringLiteral(u"图表配置")); + action_plot_config->setObjectName("plot_config"); + connect(action_plot_config, &QAction::triggered, this, &ParticleInjectTimeAnalysisView::onActionPlotConfigure); +} - // 刷新绘图 - plot->replot(); +void ParticleInjectTimeAnalysisView::updateData(bool b_init_update) +{ + auto functionToRun = [this, b_init_update](){ + if(!_data_filename.isEmpty()) { + _busy_indicator->Start(); + std::string board_id_str = QString(QStringLiteral(u"板卡号")).toStdString(); + std::string channel_id_str = QString(QStringLiteral(u"通道号")).toStdString(); + std::string energy_str = QString(QStringLiteral(u"能量(KeV)")).toStdString(); + std::string time_str = QString(QStringLiteral(u"时间计数")).toStdString(); + + io::CSVReader<4> in(QStrToSysPath(_data_filename)); + in.read_header(io::ignore_extra_column, board_id_str, channel_id_str, energy_str, time_str); + + int particle_num = 0; + QVector x; + QVector y; + + int board, channel; + double energy; + unsigned long long time_count; + while (in.read_row(board, channel, energy, time_count)) { + if ( !b_init_update && (energy <= _begin_enery || energy >= _end_energy)) { + continue; + } + particle_num++; + x.append(particle_num); + y.append(time_count); + } + _curve->setSamples(x, y); + _plot->replot(); + LOG_INFO(QStringLiteral(u"%1数据更新完毕.").arg(this->GetViewName())); + _busy_indicator->Stop(); + } + }; + QThread* load_data_thread = QThread::create(functionToRun); + load_data_thread->start(); +} + +void ParticleInjectTimeAnalysisView::onActionPlotConfigure() +{ } -QVector ParticleInjectTimeAnalysisView::getParticleInjectTimeData(QString path) +void ParticleInjectTimeAnalysisView::showEvent(QShowEvent *e) { - QVector records; - - io::CSVReader<4> in(QStrToSysPath(path)); - in.read_header(io::ignore_extra_column, "板卡号", "通道号", "能量(KeV)", "时间计数"); - - int board, channel; - double energy, time_count; - int lineNumber = 0; - - // 逐行读取 - while (in.read_row(board, channel, energy, time_count)) - { -// qDebug()< 32) - { - continue; - } - ParticleInjectTime *rec = new ParticleInjectTime; - rec->index = lineNumber; - rec->dEnergy = energy; - rec->dTime = time_count; - records.append(rec); + Q_UNUSED(e); + if (_busy_indicator) { + _busy_indicator->setGeometry(this->rect()); + this->update(); } - return records; } -void ParticleInjectTimeAnalysisView::InitUi() -{ - plot = new CustomQwtPlot(); - setupPlot(); - ui->verticalLayout_2->addWidget(plot); -} - -void ParticleInjectTimeAnalysisView::setupPlot() -{ - plot->setCanvasBackground(Qt::white); - QwtPlotCanvas* canvas = qobject_cast(plot->canvas()); - canvas->setFrameStyle(QFrame::NoFrame); - - plot->setAxisTitle(QwtPlot::xBottom, QStringLiteral(u"粒子序号")); - plot->setAxisTitle(QwtPlot::yLeft, QStringLiteral(u"粒子时间")); - // set axis auto scale - plot->setAxisAutoScale(QwtPlot::xBottom, true); - plot->setAxisAutoScale(QwtPlot::yLeft, true); - // 启用网格线 - plot->enableAxis(QwtPlot::xBottom); - plot->enableAxis(QwtPlot::yLeft); - -// // 设置QWT图例 -// QwtLegend* legend = new QwtLegend(); -// legend->setDefaultItemMode(QwtLegendData::ReadOnly); -// plot->insertLegend(legend, QwtPlot::RightLegend); - - plot->SetAxisDragScale(QwtPlot::xBottom, true); -} diff --git a/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.h b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.h index 3e5b500..603acb9 100644 --- a/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.h +++ b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.h @@ -1,43 +1,39 @@ #ifndef PARTICLEINJECTTIMEANALYSISVIEW_H #define PARTICLEINJECTTIMEANALYSISVIEW_H -#include -#include "qwt.h" -#include "CustomQwtPlot.h" -#include -#include #include "MeasureAnalysisView.h" -#include "csv.h" - - -namespace Ui { -class ParticleInjectTimeAnalysisView; -} +class CustomQwtPlot; +class QwtPlotCurve; +class BusyIndicator; +class QMenu; class ParticleInjectTimeAnalysisView : public MeasureAnalysisView { Q_OBJECT - public: explicit ParticleInjectTimeAnalysisView(QWidget *parent = nullptr); virtual ~ParticleInjectTimeAnalysisView(); - virtual void InitViewWorkspace(const QString& project_name) override final; virtual void SetAnalyzeDataFilename(const QMap& data_files_set); - void setData(QVector data); - - //获取数据 - QVector getParticleInjectTimeData(QString path); private: - void InitUi(); - void setupPlot(); + void setupMenu(); + void updateData(bool b_init_update); +private slots: + void onActionPlotConfigure(); + +protected: + virtual void showEvent(QShowEvent* e) override final; private: - Ui::ParticleInjectTimeAnalysisView *ui; - CustomQwtPlot *plot; - QVector m_AllData;//存储的所有的粒子入射时间数据 + BusyIndicator* _busy_indicator = nullptr; + CustomQwtPlot *_plot = nullptr; + QwtPlotCurve *_curve = nullptr; + QMenu* _menu = nullptr; + double _begin_enery = 0.0f; + double _end_energy = 0.0f; + QString _data_filename; }; #endif // PARTICLEINJECTTIMEANALYSIS_H diff --git a/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.ui b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.ui deleted file mode 100644 index e9d4bd5..0000000 --- a/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.ui +++ /dev/null @@ -1,157 +0,0 @@ - - - ParticleInjectTimeAnalysisView - - - - 0 - 0 - 997 - 307 - - - - ParticleInjectTimeAnalysis - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - 粒子入射设置 - - - - - - - 起始能量: - - - - - - - 50 - - - - - - - KeV - - - - - - - ~ - - - - - - - 终止能量: - - - - - - - 100 - - - - - - - KeV - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - 感兴趣区域(ROI)选择 - - - - - - - - - - 0 - 0 - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - - - - - diff --git a/src/src.pro b/src/src.pro index c4fce99..3338fc7 100644 --- a/src/src.pro +++ b/src/src.pro @@ -149,7 +149,6 @@ FORMS += \ ParticleCountPlotView/BatchEnergyScaleDialog.ui \ MeasureDeviceParamsCfgForm.ui \ NewMeasureAnalysisDlg.ui \ - ParticleInjectTimeView/ParticleInjectTimeAnalysisView.ui\ ThreeDimensionalConformityAnalysisView/DetectorStatusSummary.ui \ ThreeDimensionalConformityAnalysisView/ParticleDataStatistics.ui \ ThreeDimensionalConformityAnalysisView/ThreeDDisplay.ui \