一个很傻的错误
要写一个很简单的软件,界面完全定制,没有标题栏,所以需要自己实现窗口拖动,然后我写下了一段很傻的代码
QPoint m_lastPos;
virtual void mousePressEvent(QMouseEvent *event)
{
m_lastPos = event->pos();
QMainWindow::mousePressEvent(event);
}
virtual void mouseMoveEvent(QMouseEvent *event)
{
QPoint winPos = this->pos();
QPoint pos = event->pos();
winPos.setX(winPos.x() + pos.x() - m_lastPos.x());
winPos.setY(winPos.y() + pos.y() - m_lastPos.y());
this.setPos(winPos);
QMainWindow::mouseMoveEvent(event);
}
本来我以为event的pos返回的是坐标是鼠标相对于屏幕左上角的,但是按照屏幕坐标系的话这个逻辑是不对的,但是其实pos函数返回的鼠标是相对于当前要拖动的窗口左上角的位置 ,阴差阳错的在windows下表现的很正常,打印日志后发现过程应该是这样的:
加入按下鼠标时,鼠标相对于当前窗口的位置是100,100,也就是说m_lastPos的值是[100,100],鼠标向右移动1个像素,那么mouseMoveEvent中event的pos返回的位置就是[101,100],此时按照以上逻辑计算后会将窗口向右移动1个像素,这样鼠标相对于窗口的位置就回到了鼠标按下时的位置,也就是仍然为[100,100],此时m