#include "MTracer.h" MTracer::MTracer(QCustomPlot *_plot, TracerType _type, QObject *parent) : QObject(parent), m_plot(_plot), m_type(_type) { m_visible = true; m_tracer = Q_NULLPTR;// 跟踪的点 m_label = Q_NULLPTR;// 显示的数值 m_arrow = Q_NULLPTR;// 箭头 if (m_plot) { QColor clrDefault(Qt::red); QBrush brushDefault(Qt::NoBrush); QPen penDefault(clrDefault); // penDefault.setBrush(brushDefault); penDefault.setWidthF(0.5); m_tracer = new QCPItemTracer(m_plot); m_tracer->setStyle(QCPItemTracer::tsCircle); m_tracer->setPen(penDefault); m_tracer->setBrush(brushDefault); m_label = new QCPItemText(m_plot); m_label->setLayer("overlay"); m_label->setClipToAxisRect(false); m_label->setPadding(QMargins(5, 5, 5, 5)); m_label->setBrush(brushDefault); m_label->setPen(penDefault); m_label->position->setParentAnchor(m_tracer->position); // m_label->setFont(QFont("宋体", 8)); m_label->setFont(QFont("Arial", 8)); m_label->setColor(clrDefault); m_label->setText(""); m_arrow = new QCPItemLine(m_plot); QPen arrowPen(clrDefault, 1); m_arrow->setPen(penDefault); m_arrow->setLayer("overlay"); m_arrow->setClipToAxisRect(false); m_arrow->setHead(QCPLineEnding::esSpikeArrow);//设置头部为箭头形状 switch (m_type) { case XAxisTracer: { m_tracer->position->setTypeX(QCPItemPosition::ptPlotCoords); m_tracer->position->setTypeY(QCPItemPosition::ptAxisRectRatio); m_tracer->setSize(7); m_label->setPositionAlignment(Qt::AlignTop | Qt::AlignHCenter); m_arrow->end->setParentAnchor(m_tracer->position); m_arrow->start->setParentAnchor(m_arrow->end); m_arrow->start->setCoords(0, 20);//偏移量 break; } case YAxisTracer: { m_tracer->position->setTypeX(QCPItemPosition::ptAxisRectRatio); m_tracer->position->setTypeY(QCPItemPosition::ptPlotCoords); m_tracer->setSize(7); m_label->setPositionAlignment(Qt::AlignRight | Qt::AlignHCenter); m_arrow->end->setParentAnchor(m_tracer->position); m_arrow->start->setParentAnchor(m_label->position); m_arrow->start->setCoords(-20, 0);//偏移量 break; } case DataTracer: { m_tracer->position->setTypeX(QCPItemPosition::ptPlotCoords); m_tracer->position->setTypeY(QCPItemPosition::ptPlotCoords); m_tracer->setSize(5); m_label->setPositionAlignment(Qt::AlignLeft | Qt::AlignVCenter); m_arrow->end->setParentAnchor(m_tracer->position); m_arrow->start->setParentAnchor(m_arrow->end); m_arrow->start->setCoords(20, 0); break; } default: break; } setVisible(false); } } MTracer::~MTracer() { if(m_plot) { if (m_tracer) m_plot->removeItem(m_tracer); if (m_label) m_plot->removeItem(m_label); if (m_arrow) m_plot->removeItem(m_arrow); } } void MTracer::setPen(const QPen &pen) { if(m_tracer) m_tracer->setPen(pen); if(m_arrow) m_arrow->setPen(pen); } void MTracer::setBrush(const QBrush &brush) { if(m_tracer) m_tracer->setBrush(brush); } void MTracer::setLabelPen(const QPen &pen) { if(m_label) { m_label->setPen(pen); m_label->setBrush(Qt::NoBrush); m_label->setColor(pen.color()); } } void MTracer::setText(const QString &text) { if(m_label) m_label->setText(text); } void MTracer::setVisible(bool vis) { m_visible = vis; if(m_tracer) m_tracer->setVisible(m_visible); if(m_label) m_label->setVisible(m_visible); if(m_arrow) m_arrow->setVisible(m_visible); } void MTracer::updatePosition(double xValue, double yValue) { if (!m_visible) { setVisible(true); m_visible = true; } if (yValue > m_plot->yAxis->range().upper) yValue = m_plot->yAxis->range().upper; switch (m_type) { case XAxisTracer: { m_tracer->position->setCoords(xValue, 1); m_label->position->setCoords(0, 15); m_arrow->start->setCoords(0, 15); m_arrow->end->setCoords(0, 0); setText(QString::number(xValue)); break; } case YAxisTracer: { m_tracer->position->setCoords(0, yValue); m_label->position->setCoords(-20, 0); // m_arrow->start->setCoords(20, 0); // m_arrow->end->setCoords(0, 0); setText(QString::number(yValue)); break; } case DataTracer: { m_tracer->position->setCoords(xValue, yValue); m_label->position->setCoords(20, 0); setText(QString("x:%1,y:%2").arg(xValue).arg(yValue)); break; } default: break; } } MTraceLine::MTraceLine(QCustomPlot *_plot, LineType _type, QObject *parent) : QObject(parent), m_type(_type), m_plot(_plot) { m_lineV = Q_NULLPTR; m_lineH = Q_NULLPTR; initLine(); } MTraceLine::~MTraceLine() { if(m_plot) { if (m_lineV) m_plot->removeItem(m_lineV); if (m_lineH) m_plot->removeItem(m_lineH); } } void MTraceLine::initLine() { if(m_plot) { QPen linesPen(Qt::red, 1, Qt::DashLine); if(VerticalLine == m_type || Both == m_type) { m_lineV = new QCPItemStraightLine(m_plot);//垂直线 m_lineV->setLayer("overlay"); m_lineV->setPen(linesPen); m_lineV->setClipToAxisRect(true); m_lineV->point1->setCoords(0, 0); m_lineV->point2->setCoords(0, 0); } if(HorizonLine == m_type || Both == m_type) { m_lineH = new QCPItemStraightLine(m_plot);//水平线 m_lineH->setLayer("overlay"); m_lineH->setPen(linesPen); m_lineH->setClipToAxisRect(true); m_lineH->point1->setCoords(0, 0); m_lineH->point2->setCoords(0, 0); } } } void MTraceLine::updatePosition(double xValue, double yValue) { if(VerticalLine == m_type || Both == m_type) { if(m_lineV) { m_lineV->point1->setCoords(xValue, m_plot->yAxis->range().lower); m_lineV->point2->setCoords(xValue, m_plot->yAxis->range().upper); } } if(HorizonLine == m_type || Both == m_type) { if(m_lineH) { m_lineH->point1->setCoords(m_plot->xAxis->range().lower, yValue); m_lineH->point2->setCoords(m_plot->xAxis->range().upper, yValue); } } }