Qt实战:万能的无边框窗口(FramelessWindow)

之前也看了不少Qt实现FramelessWindow的例子,不是很复杂就是不通用。通过上面的实现,现在已完成了一个通用的版本,只要将自己的窗口设置到ContentWidget即可。界面的分层,感兴趣的朋友可以尝试下,如果没有XWidget这一层会有什么效果,ContentWidget边框效果会失效,这样当然就达不到预期结果了;启用了WA_Hover鼠标悬浮追踪,如果不启用,鼠标的移动事件可能会被子控件覆盖,这样就不会知道鼠标是否到达边框位置,从而无法正确设置鼠标的形状;
摘要由CSDN通过智能技术生成

文章转自博客园(Qt小罗):Qt实战6.万能的无边框窗口(FramelessWindow) - Qt小罗 - 博客园

 

1 需求描述

  1. 实现一个Qt无边框窗口,自定义最大化、最小化、关闭按钮;
  2. 窗口支持任意拉伸、移动,支持边框阴影;
  3. 窗口能够集成任意其它窗口到内部形成一个整体。

2 设计思路

最初实现无边框的目标只有一个,即简单好用。所有实现基于Qt本身,现将窗口分为三层,如图:

本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓ 


外层和内容层均使用垂直布局,使窗口拉伸时能够自动适应大小。下面对每一层做个简单说明。

2.1 XWidget

作为窗口的最外层,设置为透明,为内层ContentWidget边框设置、阴影显示提供支持。同时根据位置设置光标形状(CursorShape),实现窗口的任意拉伸。

2.2 ContentWidget

作为内容包含层,可设置边框颜色、宽度、圆角、阴影等效果,同时增加最大化、最小化、关闭按钮,以及logo、软件名称显示部件。

2.3 CentralWidget

作为外部嵌入层,XWidget提供一个接口void setCentralWidget(QWidget *widget),将其它窗口集成到ContentWidget内部形成一个整体,这个与QMainWindow类似。

3 代码实现

  1. 首先,隐藏标题栏、启用样式表,XWidget背景透明,代码如下:
setWindowFlags(Qt::FramelessWindowHint);    //隐藏标题栏(无边框)
setAttribute(Qt::WA_StyledBackground);      //启用样式背景绘制
setAttribute(Qt::WA_TranslucentBackground); //背景透明
  1. 为了实现鼠标的位置信息获取不受子控件的影响,启动鼠标悬浮追踪,代码如下:
setAttribute(Qt::WA_Hover);
  1. 随后便可以在event事件处理函数中获取到悬浮事件,将其转换为鼠标移动事件进行统一处理,代码如下:
bool XWidget::event(QEvent *event)
{
    if (event->type() == QEvent::HoverMove) {
        QHoverEvent *hoverEvent = static_cast<QHoverEvent *>(event);
        QMouseEvent mouseEvent(QEvent::MouseMove, hoverEvent->pos(),
                               Qt::NoButton, Qt::NoButton, Qt::NoModifier);
        mouseMoveEvent(&mouseEvent);
    }
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值