QCustomPlot中用直线标示曲线的值

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

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

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路边闲人2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值