基本信息
源码名称:QCustomPlot动态绘图
源码大小:11.66M
文件格式:.rar
开发语言:C/C++
更新时间:2021-02-07
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 10 元×
微信扫码支付:10 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
QCustomPlot动态绘图,解决CPU占用内存高问题
Qt动态实时绘图
QCustomPlot动态绘图,解决CPU占用内存高问题
Qt动态实时绘图
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); } } }