| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- #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);
- }
- }
- }
|