日常开发中,因为需要自定义标题栏来实现更好的效果,所以经常需要隐藏窗口自带的标题栏。
在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,这时候将上次鼠标按下的坐标赋值置空。