QCustomPlot中用直线标示曲线的值

QCustomPlot中用直线标示曲线的值QCustomPlot是一个非常好用的曲线控件,详细的介绍可以参见:https://www.cnblogs.com/swarmbees/p/6060473.html要实现随着鼠标的移动,显示一条竖线并标明曲线的数值。源码是参考https://blog.csdn.net/sunnyloves/article/details/82344815添加了一些个性化。一、使用1….

大家好,欢迎来到IT知识分享网。

QCustomPlot是一个非常好用的曲线控件,详细的介绍可以参见:https://www.cnblogs.com/swarmbees/p/6060473.html

要实现随着鼠标的移动,显示一条竖线并标明曲线的数值。

源码是参考了 https://blog.csdn.net/sunnyloves/article/details/82344815 添加了一些个性化。

QCustomPlot中用直线标示曲线的值

 

一、使用

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 下载

源码的效果如下: 实现的功能是在图上添加了一条竖线和两个值指示器,随鼠标的移动而移动。

QCustomPlot中用直线标示曲线的值

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/21802.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信