Qt实现 可移动的无边框窗口

本文介绍如何在Qt中创建无边框窗口,并通过重写鼠标事件实现窗口的拖动功能。通过设置窗口标志和重写mousePressEvent、mouseMoveEvent、mouseReleaseEvent,可以实现自定义标题栏的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

日常开发中,因为需要自定义标题栏来实现更好的效果,所以经常需要隐藏窗口自带的标题栏。

在Qt中,通过setWindowFlags(Qt::FramelessWindowHint)函数对当前窗口设置无边框,但是这样存在一个问题,

就是窗口无法被鼠标拖动了,所以这时候就需要重写一下事件,来实现窗口的移动。

先看代码实现:

#include "widget.h"
#include "ui_widget.h"
#include <QMouseEvent>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    this->setWindowFlags(Qt::FramelessWindowHint);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::mouseMoveEvent(QMouseEvent *e)
{
    QPoint y = e->globalPos();
    QPoint x= y - m_zPos;
    this->move(x);
}

void Widget::mousePressEvent(QMouseEvent *e)
{
    QPoint y = e->globalPos();
    QPoint x = this->geometry().topLeft();
    m_zPos = y-x;
}

void Widget::mouseReleaseEvent(QMouseEvent *e)
{
    m_zPos = QPoint();
}


void Widget::on_btn_clos_clicked()
{
    this->close();
}

void Widget::on_btn_max_clicked()
{
    if(this->isMaximized())
    {
        this->showNormal();
        return;
    }
    this->showMaximized();
}

void Widget::on_btn_min_clicked()
{
    this->showMinimized();
}

我们需要在头文件中重写以下3个鼠标事件,

//鼠标移动事件
void mouseMoveEvent(QMouseEvent *event);

//鼠标释放事件
void mouseReleaseEvent(QMouseEvent *event);

//鼠标按下事件
void mousePressEvent(QMouseEvent *event);

通过鼠标按下,进入mousePressEvent函数,获取到当前相对窗口的坐标,

当鼠标拖动时,在mouseMoveEvent会进行响应,然后通过调用move函数,来实现窗口的移动。

当拖动结束后,鼠标释放,不再按下,会进入mouseReleaseEvent,这时候将上次鼠标按下的坐标赋值置空。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值