Qt中拖拽窗口以改变位置的实现

来源:互联网 发布:行业分析知乎 编辑:程序博客网 时间:2024/04/29 06:05

首先,要创建一个继承自QWidget的类.因为你要实现鼠标事件处理器,而只有QWidget有这类虚函数.

class name:public QWidget

{

private:

bool shouldMove;//看是否应该改变窗口的位置

QPoint *formerMainPos;//移动前窗口的位置

QPoint *formerMousePos;//第一次按下左键时鼠标的位置

}

其次,重载mouseMoveEvent,mousePressEvent和mouseReleaseEvent这三个虚函数.想法是这样,任何一个时刻,鼠标事件只能有一种发生(系统这样想).那么,拖拽这个事件就可以想成是一个以点左键开头的,以松开左键结束的鼠标移动事件.所以,在鼠标左键按下的时候就可以假设一个拖拽事件刚开始,当松开的时候,拖拽事件结束.在这两个事件中间发生的鼠标移动事件就将触发自己设定的窗口移动函数.剩下的就是怎么实现了.给整个窗口设一个属性来表示当前是否正处于拖拽事件中(shouldMove),两个数据成员,一个代表拖拽事件开始时窗口的坐标(formerMainPos),一个表示拖拽事件开始时鼠标的坐标(formerMousePos).这两个坐标就可以供我们来设置发生拖拽事件后窗口的坐标,这个就很简单了,看下面代码就可以.

    void mousePressEvent (QMouseEvent *event)
    {
        if (event->button()!=Qt::LeftButton) return;
        shouldMove = true;
        *formerMainPos = this->pos();
        *formerMousePos = event->globalPos();
    }

    void mouseReleaseEvent(QMouseEvent *event)
    {
        if (event->button()!=Qt::LeftButton) return;
        shouldMove = false;
    }

    void mouseMoveEvent ( QMouseEvent * event )
    {
        QPoint pos = event->globalPos();

        if (shouldMove)
        {
            int x = pos.x()-formerMousePos->x();
            int y = pos.y()-formerMousePos->y();
            move(formerMainPos->x()+x,formerMainPos->y()+y);
        }
    }

代码没运行,不保证正确性.不过无所谓,知道是怎么回事就行了.

忘了一点,这个类要能实现这个功能,还要执行一下setMouseTracking(true)这个函数,不然不会监听鼠标移动这个事件.