在使用Qt进行画图时,默认画图的点为以左上角点为起始点,该图元的范围包括该点的左上角点+自定义图元的长,以及该点的左上角点+自定义图元的宽,以该区域范围标记该图元。
在QGraphicsScene中的
QGraphicsItem *itemAt(const QPointF &pos, const QTransform &deviceTransform)中去找该图元时,图元在该范围内都可以找到,但是遇到了一种偶现性Bug,就是按照画图点的左上角坐标去在场景中去找,找不到该场景信息,得到的QGraphicsItem*指针也不为空指针,Qt内部将该指针指向了场景上所在的其中一个图元,导致后续标记图元有误。
以下是出现bug的代码以及相关打印
QTransform transform;
QGraphicsItem *itemTmp = ScenePtr->itemAt(start_Point,transform);
该打印是在对图元进行设置坐标点之后,并且是按坐标点去找的图元名称,在设置时图元坐标以及图元名称是正常的,找到的时就有误差了。本以为设置的坐标点有误,但实际打印出设置的坐标点是正常的。
以上证明在寻找坐标时找的不对,后来对按照坐标找图元的代码返回的图元信息进行打印,如下代码片段所示:
QGraphicsItem *itemTmp = ScenePtr->itemAt(start_Point,transform);
qDebug() << "X Pos:" << itemTmp->x();
qDebug() << "Y Pos:" << itemTmp->y();
发现打印出的坐标点均为0,证明在此处坐标点没找到图元,事实坐标点是正确的,并且即使没找到图元程序内存也没置空,也没出现崩溃的状况,证明Qt内部对此进行了优化,将没找到的坐标点返回的图元信息从内存中取了一个图元信息进行返回,导致后续程序运行结果与期望不一致情况。
针对此问题解决方案为:在进行按照坐标寻找图元时将坐标点进行偏移少量像素点,即使偏移,该item依旧能找到,而不是按照之前的左上角坐标进行寻找,此时找到的图元为预期图元。有可能在Qt进行图元绘制时有偏差,导致寻找该节点时也会造成找不到的现象。因此对要寻找的坐标进行偏移设置代码如下。
QTransform transform;
start_Point.setX(start_Point.x() + 2);
start_Point.setY(start_Point.y() + 2);
QGraphicsItem *itemTmp = getScenePtr->itemAt(start_Point,transform);