2025-03-24T17:30:41
This commit is contained in:
parent
b9d1470a6d
commit
0fb8219dd9
6115
experiment_data/analysis_state/new 4.txt
Normal file
6115
experiment_data/analysis_state/new 4.txt
Normal file
File diff suppressed because it is too large
Load Diff
@ -50,11 +50,6 @@ MainWindow::~MainWindow()
|
|||||||
// 假设 Ui::MainWindow 不是 QObject 派生类
|
// 假设 Ui::MainWindow 不是 QObject 派生类
|
||||||
delete ui;
|
delete ui;
|
||||||
|
|
||||||
// 清理 status bar,如果它不是通过 new 创建的,则不需要删除
|
|
||||||
if (_statusBar) {
|
|
||||||
delete _statusBar;
|
|
||||||
}
|
|
||||||
|
|
||||||
FileManager::close();
|
FileManager::close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,6 +91,10 @@ void MainWindow::connections()
|
|||||||
_centralWidget,&CentralWidget::slotAnalysisSettingApply);
|
_centralWidget,&CentralWidget::slotAnalysisSettingApply);
|
||||||
connect(_analysisSettingWidget,&AnalysisSettingForm::sigConfirm,
|
connect(_analysisSettingWidget,&AnalysisSettingForm::sigConfirm,
|
||||||
_centralWidget,&CentralWidget::slotAnalysisSettingConfirm);
|
_centralWidget,&CentralWidget::slotAnalysisSettingConfirm);
|
||||||
|
connect(_analysisSettingWidget,&AnalysisSettingForm::sigUndo,
|
||||||
|
_centralWidget,&CentralWidget::slotAnalysisSettingUndo);
|
||||||
|
connect(_analysisSettingWidget,&AnalysisSettingForm::sigCancel,
|
||||||
|
_centralWidget,&CentralWidget::slotAnalysisSettingCancel);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::setActionEnable(const bool flag)
|
void MainWindow::setActionEnable(const bool flag)
|
||||||
@ -120,9 +119,10 @@ void MainWindow::on_actionStop_triggered()
|
|||||||
{
|
{
|
||||||
QByteArray ba = DataParser::setDeviceStartStop(DeviceStartMode::Stop);
|
QByteArray ba = DataParser::setDeviceStartStop(DeviceStartMode::Stop);
|
||||||
SerialPort::instance()->slotSendData(ba);
|
SerialPort::instance()->slotSendData(ba);
|
||||||
// SerialPort::instance()->slotCloseSp();
|
|
||||||
|
|
||||||
FileManager::close();
|
FileManager::close();
|
||||||
|
|
||||||
|
Global::instance()->setMode(Global::Mode::Analysis);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_actionNew_triggered()
|
void MainWindow::on_actionNew_triggered()
|
||||||
@ -140,6 +140,8 @@ void MainWindow::on_actionStart_triggered()
|
|||||||
SerialPort::instance()->slotSendData(ba);
|
SerialPort::instance()->slotSendData(ba);
|
||||||
//
|
//
|
||||||
FileManager::createExperimentFile();
|
FileManager::createExperimentFile();
|
||||||
|
|
||||||
|
Global::instance()->setMode(Global::Mode::ExperimentStart);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_actionReadOnly_triggered()
|
void MainWindow::on_actionReadOnly_triggered()
|
||||||
@ -184,3 +186,10 @@ void MainWindow::on_actionNumericalLabel_triggered()
|
|||||||
_rightWidget->show();
|
_rightWidget->show();
|
||||||
_centralWidget->setAnalysisMode(CentralWidget::AnalysisMode::NumericalLabel);
|
_centralWidget->setAnalysisMode(CentralWidget::AnalysisMode::NumericalLabel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_actionPeakSynthesisAnalysis_triggered()
|
||||||
|
{
|
||||||
|
//峰综合分析
|
||||||
|
_rightWidget->show();
|
||||||
|
_centralWidget->setAnalysisMode(CentralWidget::AnalysisMode::PeakSynthesisAnalysis);
|
||||||
|
}
|
||||||
|
|||||||
@ -39,6 +39,8 @@ private slots:
|
|||||||
void on_actionNumericalLabel_triggered();
|
void on_actionNumericalLabel_triggered();
|
||||||
void on_actionStartPoint_triggered();
|
void on_actionStartPoint_triggered();
|
||||||
void on_actionStopPoint_triggered();
|
void on_actionStopPoint_triggered();
|
||||||
|
void on_actionPeakSynthesisAnalysis_triggered();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void connections();
|
void connections();
|
||||||
void setActionEnable(const bool);
|
void setActionEnable(const bool);
|
||||||
@ -49,7 +51,6 @@ private:
|
|||||||
QDockWidget* _rightWidget;
|
QDockWidget* _rightWidget;
|
||||||
ExperimentSettingForm *_expertmentSettingForm;
|
ExperimentSettingForm *_expertmentSettingForm;
|
||||||
RealTimeDataForm* _realTimeDataForm;
|
RealTimeDataForm* _realTimeDataForm;
|
||||||
QStatusBar *_statusBar;
|
|
||||||
QMenu* _contextMenu;
|
QMenu* _contextMenu;
|
||||||
AnalysisSettingForm* _analysisSettingWidget;
|
AnalysisSettingForm* _analysisSettingWidget;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -47,6 +47,7 @@
|
|||||||
<addaction name="actionNumericalLabel"/>
|
<addaction name="actionNumericalLabel"/>
|
||||||
<addaction name="actionStartPoint"/>
|
<addaction name="actionStartPoint"/>
|
||||||
<addaction name="actionStopPoint"/>
|
<addaction name="actionStopPoint"/>
|
||||||
|
<addaction name="actionPeakSynthesisAnalysis"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menu_5">
|
<widget class="QMenu" name="menu_5">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
@ -166,6 +167,11 @@
|
|||||||
<string>数值标记</string>
|
<string>数值标记</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionPeakSynthesisAnalysis">
|
||||||
|
<property name="text">
|
||||||
|
<string>峰综合分析</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="images.qrc"/>
|
<include location="images.qrc"/>
|
||||||
|
|||||||
@ -78,7 +78,7 @@ SerialPort *SerialPort::instance()
|
|||||||
|
|
||||||
SerialPort::~SerialPort()
|
SerialPort::~SerialPort()
|
||||||
{
|
{
|
||||||
if (_sp->isOpen())
|
if (_sp && _sp->isOpen())
|
||||||
{
|
{
|
||||||
_sp->clear();
|
_sp->clear();
|
||||||
_sp->close();
|
_sp->close();
|
||||||
@ -136,7 +136,7 @@ void SerialPort::slotReadData()
|
|||||||
{
|
{
|
||||||
emit sigSendCommonData(cd);
|
emit sigSendCommonData(cd);
|
||||||
}
|
}
|
||||||
emit sigSendCommonDataToRealDataForm(cd);
|
// emit sigSendCommonDataToRealDataForm(cd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -45,13 +45,13 @@ AnalysisSettingForm::AnalysisSettingForm(QWidget *parent) :
|
|||||||
layout->addLayout(buttonLayout);
|
layout->addLayout(buttonLayout);
|
||||||
layout->addStretch(1);
|
layout->addStretch(1);
|
||||||
//
|
//
|
||||||
connect(_applyButton,&QPushButton::click,
|
connect(_applyButton,&QPushButton::clicked,
|
||||||
this,&AnalysisSettingForm::slotApply);
|
this,&AnalysisSettingForm::slotApply);
|
||||||
connect(_confirmButton,&QPushButton::click,
|
connect(_confirmButton,&QPushButton::clicked,
|
||||||
this,&AnalysisSettingForm::slotConfirm);
|
this,&AnalysisSettingForm::slotConfirm);
|
||||||
connect(_undoButton,&QPushButton::click,
|
connect(_undoButton,&QPushButton::clicked,
|
||||||
this,&AnalysisSettingForm::slotUndo);
|
this,&AnalysisSettingForm::slotUndo);
|
||||||
connect(_cancelButton,&QPushButton::click,
|
connect(_cancelButton,&QPushButton::clicked,
|
||||||
this,&AnalysisSettingForm::slotCancel);
|
this,&AnalysisSettingForm::slotCancel);
|
||||||
//
|
//
|
||||||
_leftBorderSpinBox->setRange(0.0, 10000.0); // 设置范围
|
_leftBorderSpinBox->setRange(0.0, 10000.0); // 设置范围
|
||||||
@ -74,7 +74,7 @@ void AnalysisSettingForm::slotRecvLineXCoord(const int index, const double point
|
|||||||
|
|
||||||
void AnalysisSettingForm::slotApply()
|
void AnalysisSettingForm::slotApply()
|
||||||
{
|
{
|
||||||
|
emit sigApply();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnalysisSettingForm::slotConfirm()
|
void AnalysisSettingForm::slotConfirm()
|
||||||
|
|||||||
@ -16,6 +16,8 @@ public:
|
|||||||
signals:
|
signals:
|
||||||
void sigApply();
|
void sigApply();
|
||||||
void sigConfirm();
|
void sigConfirm();
|
||||||
|
void sigUndo();
|
||||||
|
void sigCancel();
|
||||||
public slots:
|
public slots:
|
||||||
void slotRecvLineXCoord(const int,const double);
|
void slotRecvLineXCoord(const int,const double);
|
||||||
private slots:
|
private slots:
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
CentralWidget::CentralWidget(QWidget *parent)
|
CentralWidget::CentralWidget(QWidget *parent)
|
||||||
: QWidget(parent),
|
: QWidget(parent),
|
||||||
_customPlot(new QCustomPlot)
|
_customPlot(new QCustomPlot(this))
|
||||||
,_nanlysisMode(AnalysisMode::None)
|
,_nanlysisMode(AnalysisMode::None)
|
||||||
{
|
{
|
||||||
setMouseTracking(true);
|
setMouseTracking(true);
|
||||||
@ -78,11 +78,11 @@ void CentralWidget::setAnalysisMode(const CentralWidget::AnalysisMode mode)
|
|||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
case AnalysisMode::NumericalLabel:
|
case AnalysisMode::NumericalLabel:
|
||||||
|
case AnalysisMode::StartPoint:
|
||||||
|
case AnalysisMode::StopPoint:
|
||||||
|
case AnalysisMode::PeakSynthesisAnalysis:
|
||||||
setEventHandlerEnable(true);
|
setEventHandlerEnable(true);
|
||||||
break;
|
break;
|
||||||
case AnalysisMode::None:
|
|
||||||
setEventHandlerEnable(false);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -92,8 +92,14 @@ void CentralWidget::slotModeModify(const Global::Mode mode)
|
|||||||
{
|
{
|
||||||
if (Global::Mode::ExperimentStart == mode)
|
if (Global::Mode::ExperimentStart == mode)
|
||||||
{
|
{
|
||||||
|
if (_customPlot->graphCount() > 0 && _graph)
|
||||||
|
{
|
||||||
|
// 清除第一个图表上的数据
|
||||||
|
_graph->setData(QVector<double>(), QVector<double>());
|
||||||
|
}
|
||||||
|
|
||||||
// 创建画布,设置画布上的点数据
|
// 创建画布,设置画布上的点数据
|
||||||
_graph = _customPlot->addGraph();
|
// _graph = _customPlot->addGraph();
|
||||||
|
|
||||||
// 设置坐标轴标签
|
// 设置坐标轴标签
|
||||||
_customPlot->xAxis->setLabel("Temp/℃");
|
_customPlot->xAxis->setLabel("Temp/℃");
|
||||||
@ -166,7 +172,9 @@ void CentralWidget::slotRecvAnalysisFileName(const QString &fileName)
|
|||||||
|
|
||||||
void CentralWidget::slotAnalysisSettingApply()
|
void CentralWidget::slotAnalysisSettingApply()
|
||||||
{
|
{
|
||||||
|
double x = _line1->point1->coords().x();
|
||||||
|
|
||||||
|
drawText(x,"11111");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CentralWidget::slotAnalysisSettingConfirm()
|
void CentralWidget::slotAnalysisSettingConfirm()
|
||||||
@ -174,6 +182,21 @@ void CentralWidget::slotAnalysisSettingConfirm()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CentralWidget::slotAnalysisSettingUndo()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CentralWidget::slotAnalysisSettingCancel()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CentralWidget::slotAnalysisSettingLineXPoint(const int index, const double)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void CentralWidget::timerEvent(QTimerEvent *event)
|
void CentralWidget::timerEvent(QTimerEvent *event)
|
||||||
{
|
{
|
||||||
// key的单位是秒
|
// key的单位是秒
|
||||||
@ -216,3 +239,50 @@ void CentralWidget::setEventHandlerEnable(const bool flag)
|
|||||||
}
|
}
|
||||||
_customPlot->replot();
|
_customPlot->replot();
|
||||||
}
|
}
|
||||||
|
void CentralWidget::drawText(const double x, const QString text)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
// 创建标注文字(QCPItemText)
|
||||||
|
QCPItemText *textLabel = new QCPItemText(_customPlot);
|
||||||
|
textLabel->setPositionAlignment(Qt::AlignBottom|Qt::AlignHCenter); // 对齐方式
|
||||||
|
textLabel->position->setType(QCPItemPosition::ptPlotCoords); // 使用数据坐标
|
||||||
|
textLabel->position->setCoords(x,
|
||||||
|
_graph->data()->at(x)->value + 0.5); // 假设标注在 x=5 的点上方
|
||||||
|
textLabel->setText("标注文字");
|
||||||
|
textLabel->setFont(QFont("Arial", 10));
|
||||||
|
textLabel->setPen(QPen(Qt::black)); // 文字边框
|
||||||
|
textLabel->setBrush(Qt::white); // 文字背景
|
||||||
|
|
||||||
|
// 创建指向点的线段(QCPItemLine)
|
||||||
|
QCPItemLine *arrow = new QCPItemLine(_customPlot);
|
||||||
|
arrow->start->setParentAnchor(textLabel->bottom); // 线段起点绑定到标注文字底部
|
||||||
|
arrow->end->setCoords(x, _graph->data()->at(x)->value); // 线段终点绑定到数据点
|
||||||
|
arrow->setHead(QCPLineEnding::esSpikeArrow); // 添加箭头
|
||||||
|
arrow->setPen(QPen(Qt::red, 2));
|
||||||
|
#endif
|
||||||
|
if (!_graph || !_customPlot) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 创建标注文字(QCPItemText)
|
||||||
|
QCPItemText *textLabel = new QCPItemText(_customPlot);
|
||||||
|
textLabel->setPositionAlignment(Qt::AlignBottom|Qt::AlignHCenter); // 对齐方式
|
||||||
|
textLabel->position->setType(QCPItemPosition::ptPlotCoords); // 使用数据坐标
|
||||||
|
|
||||||
|
// 查找最接近 x 的数据点
|
||||||
|
auto it = _graph->data()->findBegin(x);
|
||||||
|
if (it != _graph->data()->end()) {
|
||||||
|
double y = it->value + 0.5;
|
||||||
|
textLabel->position->setCoords(x, y);
|
||||||
|
textLabel->setText(text);
|
||||||
|
textLabel->setFont(QFont("Arial", 10));
|
||||||
|
textLabel->setPen(QPen(Qt::black)); // 文字边框
|
||||||
|
textLabel->setBrush(Qt::white); // 文字背景
|
||||||
|
|
||||||
|
// 创建指向点的线段(QCPItemLine)
|
||||||
|
QCPItemLine *arrow = new QCPItemLine(_customPlot);
|
||||||
|
arrow->start->setParentAnchor(textLabel->bottom); // 线段起点绑定到标注文字底部
|
||||||
|
arrow->end->setCoords(x, it->value); // 线段终点绑定到数据点
|
||||||
|
arrow->setHead(QCPLineEnding::esSpikeArrow); // 添加箭头
|
||||||
|
arrow->setPen(QPen(Qt::red, 2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -18,6 +18,7 @@ public:
|
|||||||
NumericalLabel,
|
NumericalLabel,
|
||||||
StartPoint,
|
StartPoint,
|
||||||
StopPoint,
|
StopPoint,
|
||||||
|
PeakSynthesisAnalysis
|
||||||
};
|
};
|
||||||
CentralWidget(QWidget *parent = nullptr);
|
CentralWidget(QWidget *parent = nullptr);
|
||||||
~CentralWidget();
|
~CentralWidget();
|
||||||
@ -31,14 +32,17 @@ public slots:
|
|||||||
void slotRecvCommonData(const CommonData&);
|
void slotRecvCommonData(const CommonData&);
|
||||||
void slotRecvAnalysisFileName(const QString&);
|
void slotRecvAnalysisFileName(const QString&);
|
||||||
//analysis setting
|
//analysis setting
|
||||||
|
void slotAnalysisSettingLineXPoint(const int index,const double);
|
||||||
void slotAnalysisSettingApply();
|
void slotAnalysisSettingApply();
|
||||||
void slotAnalysisSettingConfirm();
|
void slotAnalysisSettingConfirm();
|
||||||
|
void slotAnalysisSettingUndo();
|
||||||
|
void slotAnalysisSettingCancel();
|
||||||
protected:
|
protected:
|
||||||
void timerEvent(QTimerEvent* event);
|
void timerEvent(QTimerEvent* event);
|
||||||
void contextMenuEvent(QContextMenuEvent *event);
|
void contextMenuEvent(QContextMenuEvent *event);
|
||||||
private:
|
private:
|
||||||
void setEventHandlerEnable(const bool);
|
void setEventHandlerEnable(const bool);
|
||||||
|
void drawText(const double,const QString);
|
||||||
private:
|
private:
|
||||||
AnalysisMode _nanlysisMode;
|
AnalysisMode _nanlysisMode;
|
||||||
QCustomPlot *_customPlot;
|
QCustomPlot *_customPlot;
|
||||||
|
|||||||
@ -3,20 +3,29 @@
|
|||||||
DragLineHandler::DragLineHandler(QCustomPlot *plot, QCPItemStraightLine *line1,
|
DragLineHandler::DragLineHandler(QCustomPlot *plot, QCPItemStraightLine *line1,
|
||||||
QCPItemStraightLine *line2, QCPGraph*graph,
|
QCPItemStraightLine *line2, QCPGraph*graph,
|
||||||
QObject *parent)
|
QObject *parent)
|
||||||
: QObject(parent), mPlot(plot), mLine1(line1), mLine2(line2),mGraph(graph)
|
: QObject(parent), _plot(plot), _line1(line1), _line2(line2),_graph(graph)
|
||||||
,_enableFlag(false)
|
,_enableFlag(false)
|
||||||
{
|
{
|
||||||
mPlot->setInteractions(QCP::iSelectItems);
|
_plot->setInteractions(QCP::iSelectItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
DragLineHandler::~DragLineHandler()
|
||||||
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DragLineHandler::eventFilter(QObject *obj, QEvent *event)
|
bool DragLineHandler::eventFilter(QObject *obj, QEvent *event)
|
||||||
{
|
{
|
||||||
if(!_enableFlag){
|
if(!_enableFlag){
|
||||||
qDebug()<<"_enableFlag false.";
|
qDebug()<<"_enableFlag false.";
|
||||||
return false;
|
#if 0
|
||||||
|
if(mPlot){
|
||||||
|
mPlot->setCursor(Qt::ArrowCursor);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return QObject::eventFilter(obj, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (obj == mPlot)
|
if (obj == _plot)
|
||||||
{
|
{
|
||||||
if (event->type() == QEvent::MouseMove)
|
if (event->type() == QEvent::MouseMove)
|
||||||
{
|
{
|
||||||
@ -26,33 +35,33 @@ bool DragLineHandler::eventFilter(QObject *obj, QEvent *event)
|
|||||||
QPoint mousePos = mouseEvent->pos();
|
QPoint mousePos = mouseEvent->pos();
|
||||||
qDebug()<<"x:"<<mousePos.x();
|
qDebug()<<"x:"<<mousePos.x();
|
||||||
|
|
||||||
bool nearLine1 = isNearLine(mLine1, mousePos);
|
bool nearLine1 = isNearLine(_line1, mousePos);
|
||||||
bool nearLine2 = isNearLine(mLine2, mousePos);
|
bool nearLine2 = isNearLine(_line2, mousePos);
|
||||||
|
|
||||||
if (nearLine1 || nearLine2)
|
if (nearLine1 || nearLine2)
|
||||||
{
|
{
|
||||||
mPlot->setCursor(Qt::SplitHCursor);
|
_plot->setCursor(Qt::SplitHCursor);
|
||||||
|
|
||||||
qDebug()<<"mIconLabel visiable.";
|
// qDebug()<<"mIconLabel visiable.";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qDebug()<<"mIconLabel not visiable.";
|
// qDebug()<<"mIconLabel not visiable.";
|
||||||
|
|
||||||
mPlot->setCursor(Qt::ArrowCursor);
|
_plot->setCursor(Qt::ArrowCursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mDraggingLine)
|
if (_draggingLine)
|
||||||
{
|
{
|
||||||
double x = mPlot->xAxis->pixelToCoord(mousePos.x());
|
double x = _plot->xAxis->pixelToCoord(mousePos.x());
|
||||||
if(mDraggingLine == mLine1){
|
if(_draggingLine == _line1){
|
||||||
emit sigSendLineXCoord(1,x);
|
emit sigSendLineXCoord(1,x);
|
||||||
}else{
|
}else{
|
||||||
emit sigSendLineXCoord(2,x);
|
emit sigSendLineXCoord(2,x);
|
||||||
}
|
}
|
||||||
mDraggingLine->point1->setCoords(x, mPlot->yAxis->range().lower);
|
_draggingLine->point1->setCoords(x, _plot->yAxis->range().lower);
|
||||||
mDraggingLine->point2->setCoords(x, mPlot->yAxis->range().upper);
|
_draggingLine->point2->setCoords(x, _plot->yAxis->range().upper);
|
||||||
mPlot->replot();
|
_plot->replot();
|
||||||
updateSelectedRegion();
|
updateSelectedRegion();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -64,24 +73,24 @@ bool DragLineHandler::eventFilter(QObject *obj, QEvent *event)
|
|||||||
if (mouseEvent->button() == Qt::LeftButton)
|
if (mouseEvent->button() == Qt::LeftButton)
|
||||||
{
|
{
|
||||||
QPoint mousePos = mouseEvent->pos();
|
QPoint mousePos = mouseEvent->pos();
|
||||||
if (isNearLine(mLine1, mousePos))
|
if (isNearLine(_line1, mousePos))
|
||||||
{
|
{
|
||||||
mDraggingLine = mLine1;
|
_draggingLine = _line1;
|
||||||
mLine1->setSelected(true);
|
_line1->setSelected(true);
|
||||||
}
|
}
|
||||||
else if (isNearLine(mLine2, mousePos))
|
else if (isNearLine(_line2, mousePos))
|
||||||
{
|
{
|
||||||
mDraggingLine = mLine2;
|
_draggingLine = _line2;
|
||||||
mLine2->setSelected(true);
|
_line2->setSelected(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (event->type() == QEvent::MouseButtonRelease)
|
else if (event->type() == QEvent::MouseButtonRelease)
|
||||||
{
|
{
|
||||||
if (mDraggingLine)
|
if (_draggingLine)
|
||||||
{
|
{
|
||||||
mDraggingLine->setSelected(false);
|
_draggingLine->setSelected(false);
|
||||||
mDraggingLine = nullptr;
|
_draggingLine = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -91,21 +100,21 @@ bool DragLineHandler::eventFilter(QObject *obj, QEvent *event)
|
|||||||
bool DragLineHandler::isNearLine(QCPItemStraightLine *line, const QPoint &pos)
|
bool DragLineHandler::isNearLine(QCPItemStraightLine *line, const QPoint &pos)
|
||||||
{
|
{
|
||||||
double lineX = line->point1->coords().x();
|
double lineX = line->point1->coords().x();
|
||||||
int linePixelX = mPlot->xAxis->coordToPixel(lineX);
|
int linePixelX = _plot->xAxis->coordToPixel(lineX);
|
||||||
return qAbs(pos.x() - linePixelX) < 5;
|
return qAbs(pos.x() - linePixelX) < 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DragLineHandler::updateSelectedRegion()
|
void DragLineHandler::updateSelectedRegion()
|
||||||
{
|
{
|
||||||
double x1 = mLine1->point1->coords().x();
|
double x1 = _line1->point1->coords().x();
|
||||||
double x2 = mLine2->point1->coords().x();
|
double x2 = _line1->point1->coords().x();
|
||||||
if (x1 > x2)
|
if (x1 > x2)
|
||||||
std::swap(x1, x2);
|
std::swap(x1, x2);
|
||||||
|
|
||||||
// 获取曲线数据
|
// 获取曲线数据
|
||||||
QVector<double> xData, yData;
|
QVector<double> xData, yData;
|
||||||
// mGraph->data()->data(xData, yData);
|
// mGraph->data()->data(xData, yData);
|
||||||
auto dataContainer = mGraph->data();
|
auto dataContainer = _graph->data();
|
||||||
for (auto it = dataContainer->begin(); it != dataContainer->end(); ++it)
|
for (auto it = dataContainer->begin(); it != dataContainer->end(); ++it)
|
||||||
{
|
{
|
||||||
xData.append(it->key);
|
xData.append(it->key);
|
||||||
|
|||||||
@ -17,6 +17,8 @@ public:
|
|||||||
DragLineHandler(QCustomPlot *plot, QCPItemStraightLine *line1, QCPItemStraightLine *line2,
|
DragLineHandler(QCustomPlot *plot, QCPItemStraightLine *line1, QCPItemStraightLine *line2,
|
||||||
QCPGraph*graph,QObject *parent);
|
QCPGraph*graph,QObject *parent);
|
||||||
|
|
||||||
|
~DragLineHandler();
|
||||||
|
|
||||||
void setEnable(const bool flag){_enableFlag = flag;}
|
void setEnable(const bool flag){_enableFlag = flag;}
|
||||||
signals:
|
signals:
|
||||||
void sigSendLineXCoord(const int,const double);
|
void sigSendLineXCoord(const int,const double);
|
||||||
@ -28,10 +30,10 @@ private:
|
|||||||
bool isNearLine(QCPItemStraightLine *line, const QPoint &pos);
|
bool isNearLine(QCPItemStraightLine *line, const QPoint &pos);
|
||||||
private:
|
private:
|
||||||
bool _enableFlag;
|
bool _enableFlag;
|
||||||
QCustomPlot *mPlot;
|
QCustomPlot *_plot;
|
||||||
QCPItemStraightLine *mLine1, *mLine2;
|
QCPItemStraightLine *_line1,*_line2;
|
||||||
QCPItemStraightLine *mDraggingLine = nullptr;
|
QCPItemStraightLine *_draggingLine = nullptr;
|
||||||
QCPGraph *mGraph;
|
QCPGraph *_graph;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user