代码拉取完成,页面将自动刷新
#include "LXTracer.h"
LXTracer::LXTracer(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);
}
}
LXTracer::~LXTracer()
{
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 LXTracer::setPen(const QPen &pen)
{
if(m_tracer)
{
m_tracer->setPen(pen);
}
if(m_arrow)
{
m_arrow->setPen(pen);
}
}
void LXTracer::setBrush(const QBrush &brush)
{
if(m_tracer)
{
m_tracer->setBrush(brush);
}
}
void LXTracer::setLabelPen(const QPen &pen)
{
if(m_label)
{
m_label->setPen(pen);
m_label->setBrush(Qt::NoBrush);
m_label->setColor(pen.color());
}
}
void LXTracer::setText(const QString &text)
{
if(m_label)
{
m_label->setText(text);
}
}
void LXTracer::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 LXTracer::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;
}
}
LXTraceLine::LXTraceLine(QCustomPlot *_plot, LineType _type, QObject *parent)
: QObject(parent),
m_type(_type),
m_plot(_plot)
{
m_lineV = Q_NULLPTR;
m_lineH = Q_NULLPTR;
initLine();
}
LXTraceLine::~LXTraceLine()
{
if(m_plot)
{
if (m_lineV)
{
m_plot->removeItem(m_lineV);
}
if (m_lineH)
{
m_plot->removeItem(m_lineH);
}
}
}
void LXTraceLine::initLine()
{
if(m_plot)
{
QPen linesPen(Qt::red, 1, Qt::SolidLine);
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 LXTraceLine::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);
}
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。