Qt按住鼠标窗体随之移动

声明:仅个人记录

Qt 中,鼠标事件函数提供有:
1. 鼠标按压事件
void mousePressEvent(QMouseEvent * event);
鼠标按压的时候会产生一个鼠标按压事件,然后该事件就会被事件系统分发给这个函数来处理。
2.鼠标移动事件
void mouseMoveEvent(QMouseEvent * event);
这个稍微多扯点:
文档上提到:
If mouse tracking is switched off, mouse move events only occur if a mouse button is pressed while the mouse is being moved. If mouse tracking is switched on, mouse move events occur even if no mouse button is pressed.
如果鼠标跟踪被关闭了,鼠标移动事件仅当一个鼠标按键被按下的时候才产生一个鼠标移动事件;如果鼠标跟踪开启,那么即使没有鼠标按键被按下,同样会产生鼠标移动事件。
什么是鼠标跟踪呢?鼠标跟踪就是这个函数: void setMouseTracking(bool enable); 功能: 通俗的说就是掌管着是否发送鼠标移动事件

实现: 按压着鼠标拖动的时候窗体跟着鼠标移动的效果

为了实现这样的效果,我们要做的就是使得:
1.“鼠标的移动量”等于 “窗体的移动量”
2. 在移动的过程中,鼠标和窗体之间保持相对禁止

移动过程中,鼠标位置值和窗体位置值之间遵守这样的规则:
xWindow = xMouse - xOffset
yWindow = yMouse - yOffset
我采用的方案如下:
一、鼠标的移动量获取:
执行顺序必然是,先有鼠标按压事件产生,然后产生鼠标移动事件。
所以我在有鼠标键按下的时候,保存当前鼠标和窗体之间的相对距离之,移动的时候显示鼠标位置值发生变化,我们根据鼠标位置值来设置窗体的位置值。实现的方式: 重写mousePressEvent(QMouseEvent * event)函数,函数内容就是将当前鼠标的位置值和窗体的位置值做差并保存,也保存鼠标和窗体之间的固定距离。
重写mouseMoveEvent(QMouseEvent * event)函数,函数内容就是获取到当前鼠标的位置值,根据上面提及的公式使用move(x,y)函数移动窗体.

void Dialog::mousePressEvent(QMouseEvent *event)
{// this->xOffset 和 this->yOffset 是成员变量,因为mouseMoveEvent函数也要用到
    this->xOffset = event->globalPos().rx() - this->pos().rx();
    this->yOffset = event->globalPos().ry() - this->pos().ry();
}

void Dialog::mouseMoveEvent(QMouseEvent * event)
{
  if (event->buttons() == Qt::LeftButton) {// 这个if 判断只是为了保证是按压鼠标左键移动产生窗体拖动效果
        this->move(event->globalX()-this->xOffset,event->globalY()-this->yOffset);
 }
}

2016年8月10日 12:50:43 By Jack Lu

你可能感兴趣的:(Qt)