1.功能说明
上一个blog中(https://www.jianshu.com/p/5f48eaff0088)我已经实现了图像缩放,平移,自动大小及鼠标跟随来显示坐标。今天要实现2条测试线,吸附图像坐标,并且在右下角可以显示坐标差值的功能。
2.效果图
效果图.png3.gif动图
游标测量.gif4.关键代码
void MainWindow::mymouseMove(QMouseEvent *event)
{
if(mydrag)
{
double x = ui->widget->xAxis->pixelToCoord(event->pos().x());
double traceX=0;
double traceY=0;
mytrace->setGraph(ui->widget->graph(0));//设置游标吸附在traceGraph这条曲线上
mytrace->setGraphKey(x);//设置游标的X值(这就是游标随动的关键代码)
traceX = mytrace->position->key();
traceY = mytrace->position->value();
if(leftlineSelected)
{
// 将直线吸附到坐标点上
left_line->point1->setCoords(traceX, 0);
left_line->point2->setCoords(traceX, 1);
left_line_posX = traceX;
left_line_posY = traceY;
distX = right_line_posX - left_line_posX;
distY = right_line_posY - left_line_posY;
label->setBrush(QBrush(QColor(199,99,188,80)));
label->setText(tr("X:%1\nY:%2\ndelX:%3s\ndelY:%4M").arg(QString::number(traceX, 'f', 2)).arg(QString::number(traceY, 'f', 2))
.arg(QString::number(distX, 'f', 2)).arg(QString::number(distY, 'f', 2)));
// 重绘
ui->widget->replot();
}
else if(rightlineSelected)
{
// 将直线吸附到坐标点上
right_line->point1->setCoords(traceX, 0);
right_line->point2->setCoords(traceX, 1);
right_line_posX = traceX;
right_line_posY = traceY;
distX = right_line_posX - left_line_posX;
distY = right_line_posY - left_line_posY;
label->setBrush(QBrush(QColor(199,99,23,80)));
// 仅显示2位
label->setText(tr("X:%1\nY:%2\ndelX:%3s\ndelY:%4M").arg(QString::number(traceX, 'f', 2)).arg(QString::number(traceY, 'f', 2))
.arg(QString::number(distX, 'f', 2)).arg(QString::number(distY, 'f', 2)));
// 重绘
ui->widget->replot();
}
else
{
}
}
}
5.总结遇到的问题
- 如何判断正在拖动。后来网上查了思路通过press和relese来设置标志位,在move中判断标注位即可判断出当前属于鼠标拖动状态。
- 如何判断选择到了测量线。后来通过看官网的api及直接看源码,使用selectTest来判断当前鼠标按下的点,到测试对象的距离小于5则判断选中了此测量线。另外selectEvent和deselectEvent是虚方法,所以无法使用。
6.残留问题
第一次显示的delta不正确,原因是有一根线没有移动过。解决方法我也有了。初始化的时候2根线应该放到图像坐标的极限位置。另外一种解决方法是判断若为第一次拖动(及坐标变量未赋值时)则不显示delta差即可。
之后我还会做个完整版及多条图像同时处理的版本,到时候一起解决。先记录下。
网友评论