问题描述:
在窗口拖动的过程中刚开始可以流畅的拖动窗口,但是一小会儿之后出现窗口拖不动的现象,或者按下鼠标在拖动区域内可以流畅拖动,但是按下鼠标朝一个方向拖动后,释放鼠标,按照此操作操作几次后,出现窗口拖不动的情况,但是过一会儿后窗口又可以被拖动。
发生问题的环境介绍:
在窗口中创建了一个场景qgraphicsScene,此场景为自定义场景,在自定义场景的构造函数中创建一个图形项,设置此图形项的属性:画笔的粗细,颜色等。在自定义场景中重写鼠标的按下,移动,释放事件。通过鼠标事件的响应可以实现场景中图形项的移动。
解决的方法:
通过输出信息判断图形项的rect其虽然在窗口中移动,但是其位置坐标变为了负值,此时便会出现拖不动的情况,另外,鼠标按下的点的坐标出现负值时也会出现上述拖不动的现象。故位置坐标有问题,由于是在一个窗口中拖动坐标,位置又出现负值,因此添加拖动过程中对边界的限制以及对鼠标按下的点的位置设置。
其添加的设置代码如下:
if(ptTopLeft.x() < 0){ptTopLeft.setX(0);}if(ptTopLeft.y() < 0){ptTopLeft.setY(0);}if(ptTopLeft.x() > SMALL_W - m_rectSaved.width()){ptTopLeft.setX(SMALL_W - m_rectSaved.width());}if(ptTopLeft.y() > SMALL_H - m_rectSaved.height()){ptTopLeft.setY(SMALL_H - m_rectSaved.height());}
ptTopLeft是被拖动的图形项的左上角坐标,对其位置做出限制,避免了其值为负,场景移动的过程中越过其所在窗口边界。
对于鼠标按下的点的设置和上面基本差不多。
if(mouseEvent->scenePos().x() < 0){mouseEvent->scenePos().setX(0);}if(mouseEvent->scenePos().y() < 0){mouseEvent->scenePos().setY(0);}if(mouseEvent->scenePos().x() > SMALL_W){mouseEvent->scenePos().setX(SMALL_W);}if(mouseEvent->scenePos().y() > SMALL_H){mouseEvent->scenePos().setY(SMALL_H);}
scenePos()获取的是按下点的场景坐标,当然在拖动过程中图形项和按下的点的坐标类型都为场景坐标,其中宏SMALL_H及SMALL_W为窗口的大小。
只做记录。