大家好,欢迎来到IT知识分享网。
QCustomPlot是一个非常好用的曲线控件,详细的介绍可以参见:https://www.cnblogs.com/swarmbees/p/6060473.html
要实现随着鼠标的移动,显示一条竖线并标明曲线的数值。
源码是参考了 https://blog.csdn.net/sunnyloves/article/details/82344815 添加了一些个性化。
一、使用
1.在初始化函数中new几个tracer,分别是XAxisTracer,DataTracer,CrossLine。
//跟踪器
plot.m_xTracer = new MyTracer(plot.m_custPlot, MyTracer::XAxisTracer, plot.m_custPlot);//x轴
plot.m_tracer1 = new MyTracer(plot.m_custPlot, MyTracer::DataTracer, plot.m_custPlot);
plot.m_tracer2 = new MyTracer(plot.m_custPlot, MyTracer::DataTracer, plot.m_custPlot);
plot.m_lineTracer = new MyTracer(plot.m_custPlot, MyTracer::CrossLine, plot.m_custPlot);//直线
2.添加对鼠标移动事件的响应
connect(m_custPlot, SIGNAL(mouseMove(QMouseEvent*)), this, SLOT(myMouseMoveEvent(QMouseEvent*)));
3.实现响应函数myMouseMoveEvent
其中pixelToCoord将鼠标的位置转换成具体的坐标系下的值
m_plot.m_custPlot->graph(0)->data()->findBegin(x_val);获取第一条曲线上相应的值。
EMSTabPage.m_plot.m_tracer1->updatePosition(x_val, value1);更新tracer的值
最后replot()就可以了。
void MEMSCurve::myMouseMoveEvent(QMouseEvent* event)
{
int x_pos = event->pos().x();
int y_pos = event->pos().y();
float x_val = EMSTabPage.m_plot.m_custPlot->xAxis->pixelToCoord(x_pos);
float y_val = EMSTabPage.m_plot.m_custPlot->yAxis->pixelToCoord(y_pos);
EMSTabPage.m_plot.m_xTracer->updatePosition(x_val, y_val);
auto iter = EMSTabPage.m_plot.m_custPlot->graph(0)->data()->findBegin(x_val);
double value1 = iter->mainValue();
iter = EMSTabPage.m_plot.m_custPlot->graph(1)->data()->findBegin(x_val);
double value2 = iter->mainValue();
EMSTabPage.m_plot.m_tracer1->updatePosition(x_val, value1);
EMSTabPage.m_plot.m_tracer2->updatePosition(x_val, value2);
EMSTabPage.m_plot.m_lineTracer->updatePosition(x_val, y_val);
ui->custPlot->replot();//曲线重绘
}
代码实现:
在MyTracer中主要看updatePosition这个函数。
void MyTracer::updatePosition(double xValue, double yValue)
{
if (!visible)
{
setVisible(true);
visible = true;
}
if (yValue > plot->yAxis->range().upper)
yValue = plot->yAxis->range().upper;
switch (type) {
case XAxisTracer:
{
tracer->position->setCoords(xValue, 1);
label->position->setCoords(0, 15);
arrow->start->setCoords(0, 15);
arrow->end->setCoords(0, 0);
setText(toQString(MStrTools::Time2String(xValue)));
break;
}
case YAxisTracer:
{
tracer->position->setCoords(0, yValue);
label->position->setCoords(-60, 0);
//arrow->start->setCoords(-20, 0);
//arrow->end->setCoords(0, 0);
setText(QString::number(yValue, 'f', 1));
break;
}
case DataTracer:
{
tracer->position->setCoords(xValue, yValue);
label->position->setCoords(25, 0);
//setText(toQString(MStrTools::Time2String(xValue)) + "\n "+ QString::number(yValue, 'f', 1));
setText( QString::number(yValue, 'f', 1));
break;
}
case CrossLine:
{
line->point1->setCoords(xValue, yValue);
line->point2->setCoords(xValue, yValue - 1000.0);
break;
}
default:
break;
}
源码可以在https://download.csdn.net/download/v6543210/11987418 下载
源码的效果如下: 实现的功能是在图上添加了一条竖线和两个值指示器,随鼠标的移动而移动。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/21802.html