Qt实现无边框窗体的移动

来源:互联网 发布:法国兴业银行巨亏数据 编辑:程序博客网 时间:2024/05/06 13:45

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

我们知道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

0 0