#include "ParticleInjectTimeAnalysis.h" #include "ui_ParticleInjectTimeAnalysis.h" #include #include #include #include #include #include #include #include #include #include "CustomQwtPlot.h" #include ParticleInjectTimeAnalysis::ParticleInjectTimeAnalysis(QWidget *parent) : MeasureAnalysisView(parent), ui(new Ui::ParticleInjectTimeAnalysis) { ui->setupUi(this); InitUi(); // 获取当前可执行文件的路径 QString Path = QCoreApplication::applicationDirPath(); m_AllData = getParticleInjectTimeData(Path + "/data.csv"); setData(m_AllData); } ParticleInjectTimeAnalysis::~ParticleInjectTimeAnalysis() { delete ui; } void ParticleInjectTimeAnalysis::InitViewWorkspace(const QString &project_name) { } void ParticleInjectTimeAnalysis::SetAnalyzeDataFilename(const QMap &data_files_set) { } void ParticleInjectTimeAnalysis::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; } x.append(info.index); y.append(info.dTime); minValue = qMin(minValue, info.dTime); maxValue = qMax(maxValue, info.dTime); } // 创建曲线并设置数据 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); plot->setAxisTitle(QwtPlot::xBottom, "粒子序号"); plot->setAxisTitle(QwtPlot::yLeft, "粒子时间"); // 刷新绘图 plot->replot(); } QVector ParticleInjectTimeAnalysis::getParticleInjectTimeData(QString path) { QVector records; QFile file(path); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qWarning() << "无法打开文件:" << file.errorString(); return records; } QTextStream stream(&file); stream.setCodec("UTF-8"); int lineNumber = 0; while (!stream.atEnd()) { QString line = stream.readLine().trimmed(); lineNumber++; // 跳过空行 if (line.isEmpty()) continue; // 按逗号分割 QStringList fields = line.split(','); // 检查字段数量是否正确(应该为4) if (fields.size() != 4) { qWarning() << "行" << lineNumber << "字段数量不正确,跳过:" << line; continue; } //获取板卡号通道号 int bd = fields[0].toInt(); int ch = fields[1].toInt(); int detector = bd + ch * 8; if(detector >= 32) { continue; } bool ok; ParticleInjectTime rec; rec.index = lineNumber; rec.dEnergy = fields[2].toDouble(&ok); if (!ok) { qWarning() << "道址格式错误,行" << rec.dEnergy << lineNumber; continue; } rec.dTime = fields[3].toLongLong(&ok); if (!ok) { qWarning() << "时间计数格式错误,行" << fields[3] << rec.dTime <SetXaxisDragScale(true); ui->verticalLayout->addWidget(plot); }