From dbe0281c24ba6397cc6c34896b1639f7cbd5ac42 Mon Sep 17 00:00:00 2001 From: yuntang <123@qq.com> Date: Wed, 23 Apr 2025 17:25:38 +0800 Subject: [PATCH] 2025-04-23T17:25:37 --- experiment_data/sample_data/new.xlsx | Bin 5407 -> 19835 bytes src/data/xlsxhandler.cpp | 78 +++++++++++++++------------ src/ui/centralwidget.cpp | 47 +++++++++++++--- src/ui/centralwidget.h | 2 +- 4 files changed, 83 insertions(+), 44 deletions(-) diff --git a/experiment_data/sample_data/new.xlsx b/experiment_data/sample_data/new.xlsx index 259bed698d24881a1c947756e6e67f6e3487664e..0c573b0cc4b6367389ebff3c8fe2fe851d7e91fa 100644 GIT binary patch delta 15923 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 A4*&oF delta 1375 zcmex8i*de|bbvQAiwFY)2M2>>-t?%tHNINKj0_C#m>C!(CJT5=*Y{37o7Ze0(DJ^P z>q+(F57J!?8onZ1w`*lpmnU*+Bq-nJe0#fGF(^gQ`z_a#QV;h_{;arff9y!$tdEnnHaWZ1IZP~_$LBOJgm;1LmEx%rqh8xB3=uUg z@zHhRm$9BYLH6LB^@Cqr6E7I` zz6`zlrRz!N&4hfJ;}Zi?Qy#0`o^iou?i_n*i7AC;A-Zjccd~9de)0ImeJvKfYp)mS zESzvp^Ly|T^OsWsHWshuPpW8q7Lk1?q2lu`!?T}4x(+(-=+1s~bBCt+N5fP@v3m0e z*RwNzP0|mpa@@=$f8|cgywDetPT$q$RGq&kax3LWSX;iq9?8Sz>^hmFwR&uC-wc6?xLb9^SQ5(pEN-xY#3j*Dx&X*r|jyX*`?7Z?|`^y>LUo z?(Bk%Uta}0{&(^A`dRjWm=KY|B$>B)vSk`0i2iLQ3#O%P7Bg~!Vr%)$_e%{YAG6h} zuXJc#qvDZ!lxs=YQmyFga!prnY|PoNSRb$Mz;JNY=@;`XcN!Pj-9K&hgEiT8G1n9q zLoSDnZQP-vFOv6iq-$*G)AD=m=GbVpAtUaYkMK2#3e#S;$1FDvR8LX$5zlx&M@=Gn z8?$Hb6V9iHbCXp{|6LA=2>#})eIQfDK8drhsQ#74yViwry)RZg$q9KSAI#5m&ftoI zqhFauM2g!o&-e#ff8Ir!}t99`|oEC>HSSQ-8KE~--so}moK``I~V)2KRI^y zJij@O!M|>PS$h82nd8r9t-b4zJU{==-x8HLbHC$@y7$f5`1apE^thr@$Jgr>vk9ne4#_<`;X`G4i37ACv!kSpbzxw)B=^TFE#$+*?)wq+pkd zr0#PD28NwX3=C308U`8~1(_#vTgyz|;LQWlwhySyfMxO>Z#l3wa7qV8Rt`{`AWRRC zZfLy9I$6p`9;^rvqYMndA`K228co?J>)DG<&i4VEUF##mRLe1WwvRN(rX4_@2-oCm zK8hgTPahfU-~0>=@kOaQ#rk?6GQgXWiGdkWM*bB~sqqE6rJsd?K^Sfc$SvH0lLLHJ J**b+lq5xE5J8S>| diff --git a/src/data/xlsxhandler.cpp b/src/data/xlsxhandler.cpp index 3ee25ca..6f28d70 100644 --- a/src/data/xlsxhandler.cpp +++ b/src/data/xlsxhandler.cpp @@ -80,6 +80,8 @@ void XlsxHandler::readPhaseData(QXlsx::Worksheet *workSheet, int &startLineIndex // skip.第一段 startLineIndex++; + logde<<"startLineIndex:"<cellAt(startLineIndex++, 2)->value().toDouble(); phaseTotal.phase.temp_flow = workSheet->cellAt(startLineIndex++, 2)->value().toDouble(); phaseTotal.phase.constant_temp_time_min = (uint16_t)(workSheet->cellAt(startLineIndex++, 2)->value().toInt()); @@ -111,11 +113,20 @@ void XlsxHandler::writeFile(const QString filePath) xlsx.write(row++ , 1, ConFileDataInfo); xlsx.write(row , 1, ConSampleName); - xlsx.write(row , 2, ei.sampleName); + QString sampleName = ei.sampleName; + if(sampleName.isEmpty()){ + sampleName = "sample"; + } + xlsx.write(row , 2, sampleName); row++; xlsx.write(row , 1, ConSampleWeight); - xlsx.write(row , 2, ei.sampleWeight); + QString sampleWeight = ei.sampleWeight; + if(sampleWeight.isEmpty()){ + sampleWeight = "1"; + } + xlsx.write(row , 2, sampleWeight); + xlsx.write(row , 3, ConUnitMg); row++; @@ -125,26 +136,45 @@ void XlsxHandler::writeFile(const QString filePath) row++; xlsx.write(row , 1, Conexperimenter); - xlsx.write(row , 2, ei.experimentor); + QString experimentor = ei.experimentor; + if(experimentor.isEmpty()){ + experimentor = "experimentor"; + } + xlsx.write(row , 2, experimentor); row++; xlsx.write(row , 1, ConDate); - xlsx.write(row , 2, ei.date); + QString date = ei.date; + if(date.isEmpty()){ + date = "20250101"; + } + xlsx.write(row , 2, date); row++; xlsx.write(row , 1, ConMeasureType); xlsx.write(row , 2, "样品"); row++; + int phaseSizeRow = row; + int phaseCount = 0; xlsx.write(row , 1, ConPhaseSize); xlsx.write(row , 2, ei.phaseVtr.size()); row++; // Write phase data. int dataSizeRow = 0; + logde<<"phase vtr size:"<& rowData = data[row]; - for (int col = 0; col < rowData.size(); ++col) { - QString cellValue = rowData[col]; - xlsx.write(row + 1, col + 1, cellValue); // 行和列从1开始 - } - } - - // 保存文件 - if (!xlsx.saveAs(filePath)) { - qWarning() << "无法保存文件:" << filePath; - return ; - } - - qDebug() << "文件保存成功:" << filePath; - return ; -#endif } diff --git a/src/ui/centralwidget.cpp b/src/ui/centralwidget.cpp index dfc0149..ebe468d 100644 --- a/src/ui/centralwidget.cpp +++ b/src/ui/centralwidget.cpp @@ -48,9 +48,9 @@ CentralWidget::CentralWidget(QWidget *parent) _eventHandler->setEnable(true); _customPlot->installEventFilter(_eventHandler); - // _customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables); + _customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables); // _customPlot->setInteractions( QCP::iRangeZoom | QCP::iSelectPlottables); - _customPlot->setInteractions(QCP::iSelectPlottables); + // _customPlot->setInteractions(QCP::iSelectPlottables); connect(_eventHandler,&EventHandler::sigSendLineXCoord, this,&CentralWidget::sigSendLineXCoord); @@ -91,6 +91,8 @@ CentralWidget::~CentralWidget() void CentralWidget::setAnalysisMode(const CentralWidget::AnalysisMode mode) { + _customPlot->setInteractions(QCP::iSelectPlottables); + _analysisMode = mode; switch (mode) @@ -252,6 +254,7 @@ void CentralWidget::slotRecvAnalysisFileName(const QString &filePath) Global::_curveExperimentDataVtr.push_back({_currentCurve,fileInfo.fileName(),pti.dataVtr}); } + _customPlot->rescaleAxes(); _customPlot->replot(); } @@ -821,15 +824,24 @@ void CentralWidget::setEventHandlerEnable(const bool flag) #if 1 // move line to suitable position. - double xMax = _customPlot->xAxis->range().upper; // X 轴的最大值 + double xMax = _customPlot->xAxis->range().upper; + double xMin = _customPlot->xAxis->range().lower; logde<<"xMax:"<point1->setCoords(xMax / 3,_line1->point1->coords().y()); - _line1->point2->setCoords(xMax / 3,_line1->point2->coords().y()); + QVector ticks = _customPlot->xAxis->tickVector(); + int numTicks = ticks.size(); + logde<<"ticks:"<point1->setCoords(xMax / 3 * 2,_line2->point1->coords().y()); - _line2->point2->setCoords(xMax / 3 * 2,_line2->point2->coords().y()); + double range = xMax - xMin; + double xLeft = xMin + range / 3; + double xRight = xMin + range * 2 / 3; + + _line1->point1->setCoords(xLeft,_line1->point1->coords().y()); + _line1->point2->setCoords(xLeft,_line1->point2->coords().y()); + + _line2->point1->setCoords(xRight,_line2->point1->coords().y()); + _line2->point2->setCoords(xRight,_line2->point2->coords().y()); #endif lineVisiableFunc(_line1); if(AnalysisMode::NumericalLabel != _analysisMode){ @@ -839,13 +851,32 @@ void CentralWidget::setEventHandlerEnable(const bool flag) _customPlot->replot(); } +QPointF CentralWidget::getTheCoordinatesOfTheTextBox(const QPointF point) +{ + double xMax = _customPlot->xAxis->range().upper; + double xMin = _customPlot->xAxis->range().lower; + + logde<<"xMax:"< ticks = _customPlot->xAxis->tickVector(); + int numTicks = ticks.size(); + logde<<"ticks:"<setPositionAlignment(Qt::AlignBottom | Qt::AlignHCenter); // 对齐方式 textLabel->position->setType(QCPItemPosition::ptPlotCoords); // 使用数据坐标 - textLabel->position->setCoords(point.x() + 20, point.y()); // 设置文本位置在指定点上方 + textLabel->position->setCoords(textBoxPoint.x(),textBoxPoint.y()); // 设置文本位置在指定点上方 textLabel->setText(text); // 设置文本内容 // textLabel->setFont(QFont("Arial", 10)); diff --git a/src/ui/centralwidget.h b/src/ui/centralwidget.h index e4ea755..d389433 100644 --- a/src/ui/centralwidget.h +++ b/src/ui/centralwidget.h @@ -60,8 +60,8 @@ private: double derivativeAt(const double a, const double b, const double x); PointCalculate::Line calculateLinearRegression(const QVector& x, const QVector& y); - void setEventHandlerEnable(const bool); + QPointF getTheCoordinatesOfTheTextBox(const QPointF point); void drawText(const QPointF,const QString); void fillGraph(const double x1,const double x2);