QT 实现无边框可伸缩变换有阴影的QDialog弹窗

在这里插入图片描述

  • 实现无标题栏窗口的拖拽移动、调节窗口大小以及边框阴影效果。
  • 初始化时进行位或操作,将这些标志合并为一个值,并将其设置为窗口的标志。这些标志分别表示这是一个对话框、无边框窗口、有标题栏、有最小化按钮和最大化按钮。
    setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint | Qt::WindowTitleHint | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint);setAttribute(Qt::WA_TranslucentBackground);
  • 重写绘制paintEvent函数
void FramelessWindow::paintEvent(QPaintEvent *event)
{QDialog::paintEvent(event);if (!_shadeEnabled){return;}// 先将窗口背景刷新为白色QPainterPath path;path.setFillRule(Qt::WindingFill);QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);if (this->isMaximized() || this->isFullScreen()) // 最大化或全屏下刷新整个窗口为白色,且让子窗口填充满{QLayout *layout = this->layout();if (layout != NULL)layout->setContentsMargins(0, 0, 0, 0);path.addRect(this->rect());painter.fillPath(path, QBrush(Qt::white));return;}else // 正常大小显示,让主窗口布局四周空出阴影所需宽度。{QLayout *layout = this->layout();if (layout != NULL)layout->setContentsMargins(BoardShadeWidth, BoardShadeWidth, BoardShadeWidth, BoardShadeWidth);path.addRect(BoardShadeWidth, BoardShadeWidth,this->width() - BoardShadeWidth * 2,this->height() - BoardShadeWidth * 2);painter.fillPath(path, QBrush(Qt::white));}painter.drawPath(path);
}
  • 此类实现有2种方案
  1. 定义Platform_Win,此类仅支持windows系统,可以移动和改变大小;无法跨平台,效率高
  2. 非定义Platform_Win,支持跨平台,但是仅能实现移动,无法改变大小,效率低
  • 定义Platform_Win方式需要重写nativeEvent函数
    /*** 处理原生事件,用于实现无边框窗口的自定义拖动和缩放逻辑。** @param eventType 事件类型。* @param message 事件的详细信息。* @param result 用于返回事件处理结果。* @return 如果事件被处理,则返回true;否则返回false。*/
bool FramelessWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
#ifdef Platform_Winif (!_resizeEnabled){ // 如果禁止了缩放,则将事件传递给父类处理return QDialog::nativeEvent(eventType, message, result);}Q_UNUSED(eventType);MSG *msg = reinterpret_cast<MSG *>(message);switch (msg->message){case WM_NCHITTEST:// 计算鼠标位置相对于窗口的坐标int xPos = GET_X_LPARAM(msg->lParam) - this->frameGeometry().x();int yPos = GET_Y_LPARAM(msg->lParam) - this->frameGeometry().y();// 如果鼠标位置上有控件,则不处理if (this->childAt(xPos, yPos) != NULL){return false;}// 判断鼠标位置是否在伪标题栏区域,以及在哪个边缘或角落// 鼠标位置上没有控件,先判断是否位于伪标题栏QRect rect = this->rect();rect.setHeight(_doubleClickHeight);if (rect.contains(QPoint(xPos, yPos))) // 鼠标位置位于伪标题栏区域内{*result = HTCAPTION;}// 判断鼠标是否在窗口的四个边或四个角落上if (xPos > BoardStartPix && xPos < BoardEndPix)*result = HTLEFT;if (xPos > (this->width() - BoardEndPix) && xPos < (this->width() - BoardStartPix))*result = HTRIGHT;if (yPos > BoardStartPix && yPos < BoardEndPix)*result = HTTOP;if (yPos > (this->height() - BoardEndPix) && yPos < (this->height() - BoardStartPix))*result = HTBOTTOM;if (xPos > BoardStartPix && xPos < BoardEndPix && yPos > BoardStartPix && yPos < BoardEndPix)*result = HTTOPLEFT;if (xPos > (this->width() - BoardEndPix) && xPos < (this->width() - BoardStartPix) && yPos > BoardStartPix && yPos < BoardEndPix)*result = HTTOPRIGHT;if (xPos > BoardStartPix && xPos < BoardEndPix && yPos > (this->height() - BoardEndPix) && yPos < (this->height() - BoardStartPix))*result = HTBOTTOMLEFT;if (xPos > (this->width() - BoardEndPix) && xPos < (this->width() - BoardStartPix) && yPos > (this->height() - BoardEndPix) && yPos < (this->height() - BoardStartPix))*result = HTBOTTOMRIGHT;return true;}return false;
#else// 在非Windows平台上,将事件传递给父类处理return QDialog::nativeEvent(eventType, message, result);
#endif
}
  • 阴影效果可以使用软件的方式绘制,也可以使用图片的方式,在paintEvent函数实现,相对复杂,不在此描述,可看源码。
  • 知识理应共享,源码在此。
  • 这个demo也是学习的,使用了很多比较专的宏与函数,加的注释尽量写了用途,不清楚的自己去查吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/789498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MCU配置的1106模块与1102模块功能差异分析

在现代工业自动化和智能控制领域&#xff0c;微控制器(MCU)扮演着至关重要的角色。而在MCU的配置中&#xff0c;选择适合的传感器采集模块是确保数据采集准确性和多样性的关键。其中&#xff0c;1106模块和1102模块作为两种常见的采集模块&#xff0c;各自具有独特的功能特点和…

sdrangel使用说明

使用说明 首先找一个usrp设备&#xff0c;我找到的是b205进行连接。打开生成的sdrangel.exe&#xff0c;第一次打开会出现空白界面 点击Add Rx Device按钮。 然后会弹出一个设备刷新窗口&#xff0c;选择你需要的设备 点击OK后&#xff0c;会响应一段时间&#xff0c;然后弹…

孙崧-回归祖国的数学天才谈国外学习研究感受

孙崧&#xff0c;这位37岁的美国加州大学伯克利分校数学系教授&#xff0c;今年正式回归祖国&#xff0c;担任浙江大学数学高等研究院杜建英讲席教授、博士生导师。在此&#xff0c;知识人网小编就经历过国外就读、从事博士后研究及任教的这位数学天才是怎么说的&#xff0c;或…

【三十二】【算法分析与设计】深搜(2),98。 验证二叉搜索树,不同方式定义递归函数,230。 二叉搜索树中第 K 小的元素,257。 二叉树的所有路径

98. 验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左 子树 只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。…

小程序 两页面间数据传递

页面1 页面2 实现效果&#xff1a;点击页面1 可以直接跳进页面2 实现过程&#xff1a; xhtml <view class"rank" wx:for"{{rankList}}" data-ids"{{item.id}}" data-names"{{item.name}}" data-description"{{item.descri…

行测——言语分析

行测——言语分析 1. 全文概括题1.1 做题思路1.2 例子1.2.1 概括内容1.2.2 标题类 2.中心理解题2.1 做题思路2.2 例子2.2.1 关键词清晰2.2.2 关键词不清晰 3. 逻辑顺序题3.1 做题思路3.2 例子3.2.1 划线部分填什么句子3.2.2 句子排序3.2.3 下一段讲什么3.2.4 细节分析题 4. 逻辑…

Oracle基础-PL/SQL编程 备份

1、PL/SQL简介 PL/SQL块结构 约定&#xff1a;为了方便&#xff0c;本文后面把PL/SQL简称PL。 PL程序都是以块&#xff08;BLOCK&#xff09;为基本单位&#xff0c;整个PL块分三部分&#xff1a;声明部分&#xff08;使用DECLARE开头&#xff09;、执行部分(以BEGIN开头)和异…

数字人视频合成平台推荐

数字人讲解视频和全景作品的结合是一种全新的数字交互方式&#xff0c;可为用户提供更加直观和具有沉浸感的内容展示和交互体验&#xff0c;从而适用于诸如旅游、展览、博物馆、教育培训、泛房地产、以及娱乐和文化等应用场景。 当前数字人合成视频技术已经发展至日益成熟的阶…

SSL通配符证书怎么选?看这里

通配符证书&#xff0c;作为一种特殊的数字证书类型&#xff0c;以其独特的优势在网络安全领域扮演着重要角色。相较于传统的单一域名证书&#xff0c;通配符证书能够为同一主域名下的所有子域名提供安全保护&#xff0c;显著提升管理效率&#xff0c;简化证书部署流程&#xf…

LandCover数据介绍与下载

一、LC介绍 土地覆盖&#xff08;Land Cover&#xff0c;LC&#xff09;是自然营造物和人工建筑物所覆盖的地表诸多要素的综合体。土地覆盖指地表所属的植被覆盖物(森林、草原、耕作植被等)或非植被覆盖物(冰雪、建筑物等)的具体类型&#xff0c;侧重描述地球表面的自然属性&a…

02 - 全加器和加法器

---- 整理自B站UP主 踌躇月光 的视频 1. 全加器 用门电路实现两个二进制数相加并求出和的组合线路&#xff0c;称为一位全加器。一位全加器可以处理低位进位&#xff0c;并输出本位加法进位。全加器比半加器多了一位进位。 1.1 实验 1&#xff1a;通过两个半加器设计全加器 1.…

IDEA无法连接虚拟机中的Redis的解决方案,无法连接Jedis,无法ping通虚拟机的解决方案

首先&#xff0c;笔者先说明一下自身的情况&#xff0c;怎么连接都连不上&#xff0c;网上的教程全部都看了一遍&#xff0c;基本上没用得上的&#xff0c;这篇文章里面的解决方案包括了笔者能在网上找到了最全面的办法总结&#xff0c;最后终于是连上了 目录 一.连接Jedis出错…

Linux初学(十一)中间件

一、web服务 1.1 中间件简介 中间件其实就是一类软件&#xff0c;中间件的作用是让用户可以看到一个网页 总结&#xff1a;客户端可以向服务端发送请求&#xff0c;服务器端会通过中间件程序来接收请求&#xff0c;然后处理请求&#xff0c;最后将处理结果返回给客户端 1.2 中…

自动驾驶的世界模型:综述

自动驾驶的世界模型&#xff1a;综述 附赠自动驾驶学习资料和量产经验&#xff1a;链接 24年3月澳门大学和夏威夷大学的论文“World Models for Autonomous Driving: An Initial Survey”。 在快速发展的自动驾驶领域&#xff0c;准确预测未来事件并评估其影响的能力对安全性…

C++ 2024-4-2 作业

1.模板类实现顺序栈 #include <iostream> #define MAX 8 using namespace std; template<typename T> class stack {T data[MAX];int top; public:stack():top(-1){}bool empty_stack();bool full_stack();void push_stack(T data);void pop_stack();void show();…

OpenMLDB vs Redis 内存占用量测试报告

1. 背景 OpenMLDB 是一款开源的高性能全内存 SQL 数据库&#xff0c;在时序数据存储、实时特征计算等方面都有很多创新和优化。Redis 是业界最流行的内存存储数据库&#xff0c;广泛应用于缓存等高性能在线场景。虽然二者应用场景不尽相同&#xff0c;但作为都是使用内存作为存…

docker容器之etcd安装

一、etcd介绍 1、etcd是什么 etcd是CoreOS团队于2013年6月发起的开源项目&#xff0c;它的目标是构建一个高可用的分布式键值(key-value)数据库。 2、etcd特点 简单的接口&#xff0c;通过标准的HTTP API进行调用&#xff0c;也可以使用官方提供的 etcdctl 操作存储的数据。…

使用Vue实现CSS过渡和动画

01-初识动画和过渡 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>使用vue实现css过渡和动画&l…

MMU关闭时Cache的缓存策略是怎样的

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; 在学习MMU章节时&#xff0c;我们发现在页表的entry中&#xff0c;BIT[4:2]指向了MAIR寄存器&#xff0c;该寄存器描述了内存属性&#xff0c;其实就是cache的缓存策略属性&#…

高性价比的挂耳式耳机哪个好用?五大高口碑品牌深度测评严选!

入耳式耳机虽然普及度极高&#xff0c;但其缺点也不容忽视。首先&#xff0c;长时间佩戴可能导致耳朵不适&#xff0c;甚至影响听力健康。其次&#xff0c;入耳式耳机往往因为隔音效果过好&#xff0c;导致用户与周围环境脱节&#xff0c;失去了一定的生活便利性。相比之下&…