#include "MCustomPlot.h" MCustomPlot::MCustomPlot(QWidget *parent) :QCustomPlot(parent) ,m_isShowTracer(false) ,m_xTracer(Q_NULLPTR) ,m_yTracer(Q_NULLPTR) // ,m_dataTracers(QList()) ,m_lineTracer(Q_NULLPTR) { } void MCustomPlot::mouseMoveEvent(QMouseEvent *event) { QCustomPlot::mouseMoveEvent(event); if(m_isShowTracer) { //当前鼠标位置(像素坐标) int x_pos = event->pos().x(); int y_pos = event->pos().y(); //像素坐标转成实际的x,y轴的坐标 float x_val = this->xAxis->pixelToCoord(x_pos); float y_val = this->yAxis->pixelToCoord(y_pos); if(Q_NULLPTR == m_xTracer) m_xTracer = new MTracer(this, MTracer::XAxisTracer);//x轴 m_xTracer->updatePosition(x_val, y_val); if(Q_NULLPTR == m_yTracer) m_yTracer = new MTracer(this, MTracer::YAxisTracer);//y轴 m_yTracer->updatePosition(x_val, y_val); if(Q_NULLPTR == m_lineTracer) m_lineTracer = new MTraceLine(this,MTraceLine::Both);//直线 m_lineTracer->updatePosition(x_val, y_val); int nCurveCount = this->plottableCount(); /* for (int i = 0; i< nCurveCount; ++i) { MTracer *tracer = new MTracer(this, MTracer::DataTracer); tracer->setVisible(true); tracer->setPen(this->plottable(i)->pen()); tracer->setBrush(Qt::NoBrush); if(this->plottable(i)->name() != "" && this->plottable(i)->name() != "") { QCPGraph * pgraph = (QCPGraph *) this->plottable(i); QCPPlottableLegendItem * item = this->legend->itemWithPlottable(pgraph); MTracer *tracer = new MTracer(this, MTracer::DataTracer); tracer->setVisible(true); tracer->setPen(this->plottable(i)->pen()); tracer->setBrush(Qt::NoBrush); tracer->m_tracer->setGraph(pgraph); tracer->m_tracer->setGraphKey(x_val); tracer->m_tracer->setInterpolating(false); tracer->setLabelPen(this->plottable(i)->pen()); auto iter = this->plottable(i)->interface1D()->findBegin(x_val); auto yiter = this->plottable(i)->interface1D()->dataMainValue(iter); auto xiter = this->plottable(i)->interface1D()->dataMainKey(iter); tracer->updatePosition(x_val, y_val); tracer->m_label->setText(QString("x:%1,y:%2,t:%3,k:%4,v:%5").arg(x_val).arg(y_val).arg(iter).arg(xiter).arg(yiter)); if(item->selected() || pgraph->selected()) { item->setSelected(true); QPen pen; pen.setWidth(10); pen.setColor(Qt::blue); pgraph->selectionDecorator()->setPen(pen); qDebug()<setSelection(QCPDataSelection(pgraph->data()->dataRange())); } tracer->deleteLater(); }else if(0){ //显示curve曲线 //获取实部y轴的显示范围 // double y_range = (this->yAxis->range().size()) / 50; // double x_range = (this->xAxis->range().size()) / 50; int pointCount = this->plottable(i)->interface1D()->dataCount(); //曲线上所有数据点个数 if(pointCount) { double x,y; double xNearlest = 999; double yNearlest = 999; double xDistance; double yDistance; double xTmp = 999; double yTmp = 999; int t_index; for(int j =0; j < pointCount; j++) { double nearindex = this->plottable(i)->interface1D()->findBegin(j); double x_line = this->plottable(i)->interface1D()->dataMainKey(nearindex); double y_line = this->plottable(i)->interface1D()->dataMainValue(nearindex); xDistance = abs(x_val - x_line); yDistance = abs(y_val - y_line); if( xDistance <= xTmp && yDistance <= yTmp) { t_index = nearindex; xTmp = xDistance; yTmp = yDistance; xNearlest = x_line; yNearlest = y_line; } } MTracer *tracer = new MTracer(this, MTracer::DataTracer); tracer->setVisible(true); tracer->setPen(this->plottable(i)->pen()); tracer->setBrush(Qt::NoBrush); tracer->updatePosition(xNearlest, yNearlest); tracer->deleteLater(); } } } */ this->replot();//曲线重绘 } }