实现逻辑
先来了解下面这个图,箭头表示鼠标,中间的方框表示窗口,最大的边框表示屏幕。
在移动窗口时,鼠标位于窗口的位置始终不变,也叫表示z向量是不变的。所以我们只需要计算出z向量
,z = y - x
;然后在鼠标移动时获取到鼠标相对于桌面左上角位置也就是y向量。即可计算出窗口左上角的位置:x = y - z
;
具体代码
我们需要对鼠标移动、点击、释放事件进行重写。
virtual void mouseMoveEvent(QMouseEvent *event); virtual void mousePressEvent(QMouseEvent *event); virtual void mouseReleaseEvent(QMouseEvent *event);
定义一个成员变量用来记录鼠标相对于窗口的位置。
QPoint z;
我们需要在鼠标按下时计算出鼠标相对于窗口的位置并保存,在鼠标移动时实时更新当前窗口的位置。
void Widget::mouseMoveEvent(QMouseEvent *event) { QWidget::mouseMoveEvent(event); QPoint y = event->globalPos(); // 鼠标相对于桌面左上角位置 QPoint x = y - this->z; this->move(x); } void Widget::mousePressEvent(QMouseEvent *event) { QWidget::mousePressEvent(event); QPoint x = this->geometry().topLeft(); // 窗口左上角相对于桌面左上角位置 QPoint y = event->globalPos(); // 鼠标相对于桌面左上角位置 this->z = y - x; // 这是个定值 } void Widget::mouseReleaseEvent(QMouseEvent *event) { QWidget::mouseReleaseEvent(event); this->z = QPoint(); }