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