Qt实现无边框窗体的移动

本文内容,基本参考自互联网,所以定义为转载。

我们知道360安全卫士的界面是没有外边框的,去除外边框


setWindowFlags(Qt::FramelessWindowHint);

 但是去除边框之后,无法移动整个窗体,为了实现这个移动效果,需要重新实现三个函数

    void mousePressEvent(QMouseEvent * e);
    void mouseReleaseEvent(QMouseEvent * e);
    void mouseMoveEvent(QMouseEvent * e);

对应的实现如下

void FramelessMoveWindow::mousePressEvent(QMouseEvent *e)
{
    if (e->button() == Qt::LeftButton) {
        mMousePoint = e->globalPos() - this->pos();
        e->accept();
        mDragWindow = true;
    }
}

void FramelessMoveWindow::mouseReleaseEvent(QMouseEvent */*e*/)
{
    mDragWindow = false;
}

void FramelessMoveWindow::mouseMoveEvent(QMouseEvent *e)
{
    if (mDragWindow && (e->buttons() && Qt::LeftButton)) {
        this->move(e->globalPos() - mMousePoint);
        e->accept();
    }
}
有人可能觉得只实现下面两个函数也是可以的
    void mousePressEvent(QMouseEvent * e);
    void mouseMoveEvent(QMouseEvent * e);

但是当你窗体上有别的控件接收了press事件的话,会出现窗体闪烁的情况

在构造函数里添加代码

    QPushButton *button = new QPushButton(this);
    button->setText("Button");

当你点击这个button的话,会发现只实现press函数和move函数,是有问题的。


关于左键单击的判断和左键移动的判断的条件处理

//左键单击 
if (e->button() == Qt::LeftButton) {
       
    }
//左键移动
if (e->buttons() && Qt::LeftButton) {

    }
为什么两次判断左键的方式不一样呢?

因为在

void mouseMoveEvent(QMouseEvent *e)


里面e->button()返回的一直是QT::NoButton

你可能感兴趣的:(Qt实现360安全卫士的GUI)