Qt设置窗口可拖动

  • Post author:
  • Post category:其他




实现逻辑

先来了解下面这个图,箭头表示鼠标,中间的方框表示窗口,最大的边框表示屏幕。

在这里插入图片描述

在移动窗口时,鼠标位于窗口的位置始终不变,也叫表示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();
}



版权声明:本文为qq_45254369原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。