Qt实现 可移动的无边框窗口
发布日期:2021-09-25 21:40:41 浏览次数:15 分类:技术文章

本文共 1305 字,大约阅读时间需要 4 分钟。

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

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

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

先看代码实现:

#include "widget.h"#include "ui_widget.h"#include 
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,这时候将上次鼠标按下的坐标赋值置空。

转载地址:https://blog.csdn.net/c_shell_python/article/details/106065883 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Qt实现 文件比较工具
下一篇:pugi xml读与写接口

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月07日 01时19分57秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章