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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值