窗口重叠之鼠标事件透传

目的

Qt webview在下层展示url,上层覆盖最小化等按钮,支持大小拖拽,窗口移动。

如下图,除红框部分,其余异形部分作为url展示区

构想

想要实现该效果,需要在webview窗口上方动态创建两个窗口,手动实现拖动、拖拽、以及拖拽带来的位置问题。

1、拖动问题:在上方红框窗口实现拖动效果,接收到鼠标拖动时,动态设置主窗口位置。

2、拖拽问题:由于标题栏需要自己实现,所以需要设置setWindowFlags(Qt::FramelessWindowHint);以去除边框,那么需要自己实现大小拖拽。在下方红框窗口最右边添加图标,鼠标进入时变化为拖拽样式,接收到鼠标拖拽时,动态设置主窗口大小。类似Qt designer的这个角。

3、位置问题:代码创建上下红框的两个窗口,在resizeEvent事件中,动态调整位置,使其始终靠右,且宽度随主窗口的放大缩小同比例变换。

问题

实践后发现,在拖拽过程中,上方的红框窗口,可能会挡住webview的鼠标事件,因此就引出该文的鼠标透传事件。

实现

既然都需要透传事件了,那动态创建窗口就没必要了,之间选择窗口覆盖。

   窗口框架

    利用QStackedLayout的setStackingMode(QStackedLayout::StackAll);实现窗口覆盖,实现参考。 WidgetB即红框窗口,WidgetA表示webview,使用pushbutton判断 鼠标事件是否透传成功。

  鼠标事件透传

第一反应是,由于QMouseEvent类只有位置和鼠标类型信息,与父窗口无关。 在WidgetB的mouseEvent事件中,将该event传递给WidgetA。

void WidgetB::mousePressEvent(QMouseEvent* event) {if (Qt::LeftButton == event->button()) {if (event->pos().y() < 40) {move_ = true;}else {move_ = false;}point_start_ = event->globalPos();}widget_a_->MouseEventHandle(event, WidgetA::MouseEventType::MousePress);
}void WidgetB::mouseMoveEvent(QMouseEvent* event) {if (event->buttons() & Qt::LeftButton && !point_start_.isNull() & move_) {QPoint move_point = event->globalPos() - point_start_;point_start_ = event->globalPos();auto widget = parentWidget();widget->move(widget->pos().x() + move_point.x(), widget->pos().y() + move_point.y());}widget_a_->MouseEventHandle(event, WidgetA::MouseEventType::MouseMove);
}
void WidgetB::mouseReleaseEvent(QMouseEvent* event) {move_ = false;widget_a_->MouseEventHandle(event, WidgetA::MouseEventType::MouseRelease);
}

该方法确实可以将鼠标事件传给WigetA,但由于事件先到控件再到父窗口, 因此事件无法传递给WidgetA上的各个控件。

参考鼠标事件透传

每一次鼠标事件触发后,根据位置计算出对应WidgetA上的控件。直接利用QApplication::postEvent(w, event);,将事件传递给该控件,后续是否传递给父窗口(WidgetA由控件判定)。

void WidgetB::mousePressEvent(QMouseEvent* event) {if (Qt::LeftButton == event->button()) {if (event->pos().y() < 40) {move_ = true;}else {move_ = false;}point_start_ = event->globalPos();}PostMouseEventToSiblings(event);
}void WidgetB::mouseMoveEvent(QMouseEvent* event) {if (event->buttons() & Qt::LeftButton && !point_start_.isNull() & move_) {QPoint move_point = event->globalPos() - point_start_;point_start_ = event->globalPos();auto widget = parentWidget();widget->move(widget->pos().x() + move_point.x(), widget->pos().y() + move_point.y());}PostMouseEventToSiblings(event);
}void WidgetB::mouseReleaseEvent(QMouseEvent* event) {move_ = false;PostMouseEventToSiblings(event);
}void WidgetB::PostMouseEventToSiblings(QMouseEvent* e) {if (this->parentWidget()) {this->setAttribute(Qt::WA_TransparentForMouseEvents, true);QPoint pt = this->mapTo(this->parentWidget(), e->pos());QWidget* w = this->parentWidget()->childAt(pt);if (w) {pt = w->mapFrom(this->parentWidget(), pt);QMouseEvent* event = new QMouseEvent(e->type(), pt, e->button(),e->buttons(), e->modifiers());QApplication::postEvent(w, event);}this->setAttribute(Qt::WA_TransparentForMouseEvents, false);}
}

效果



代码链接

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

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

相关文章

四川古力未来科技抖音小店创新经营,引领电商新潮流

在数字化浪潮的推动下&#xff0c;电商行业蓬勃发展&#xff0c;抖音小店作为新兴的电商平台&#xff0c;正以其独特的魅力和优势吸引着越来越多的消费者。四川古力未来科技&#xff0c;作为抖音小店的经营者之一&#xff0c;凭借其可靠的经营模式和创新的经营理念&#xff0c;…

医用腕带朔源用的条形码与二维码如何选择

在医疗环境中的医用腕带作为患者身份识别和管理的重要工具&#xff0c;做为条形码和二维码腕带上的溯源技术&#xff0c;更是为患者信息快速获取、准确传递的保障&#xff0c;实现更加高效和准确的患者身份识别和管理&#xff0c;这种技术可以大大提高医疗服务的效率和质量&…

React路由(React笔记之五)

本文是结合实践中和学习技术文章总结出来的笔记(个人使用),如有雷同纯属正常((✿◠‿◠)) 喜欢的话点个赞,谢谢! React路由介绍 现在前端的项目一般都是SPA单页面应用,不再是以前多个页面多套HTML代码项目了,应用内的跳转不需要刷新页面就能完成页面跳转靠的就是路由系统 R…

小米路由器如何设置去广告功能,如何设置小米路由器的自定义Hosts(小米路由器如何去除小米广告、去除小米电视盒子开屏广告、视频广告)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 实现方案 📒📝 操作步骤📝 注意事项⚓️ 相关链接 ⚓️📖 介绍 📖 小米设备的广告一直是用户头疼的问题,无论是开屏广告、应用内广告还是系统广告,都影响了用户体验。本文将详细介绍如何通过小米路由器实现去除广告…

阿里云 查询封禁原因并申请解封 违规网站屏蔽访问违规URL整改通知 抱歉!该站点已经被管理员停止运行,请联系管理员了解详情!

原因网站被挂马或入侵 特别是织梦项目&#xff0c;已经100%难以使用。必然会被入侵。 要完全消除漏洞或防止被挂马&#xff0c;目前要么买安全服务&#xff0c;还没有别的好办法。 备份 恢复 项目做完后&#xff0c;先备份一个。被挂马能直接恢复。 每次修改后把权限全改为…

使用Nginx正向代理让内网主机通过外网主机访问互联网

目录 环境概述 流程说明 在外网服务器上安装部署nginx 安装前准备 下载nginx 编译安装nginx 开始配置正向代理 创建systemd服务单元文件&#xff0c;用于管理Nginx服务的启动、停止和重新加载 启动nginx 代理服务器本地验证 内网服务器验证 将代理地址添加到环境变量中…

比瓴科技以何魅力吸引安全大牛?

今年4月&#xff0c;专注于软件供应链安全的行业领导厂商比瓴科技宣布&#xff0c;与元豚科技战略合并&#xff0c;元豚科技创始人唐誉聪加入比瓴&#xff0c;担任合伙人及研发副总裁一职。唐誉聪表示&#xff0c;将携手比瓴共同推动持续应用安全平台(ASPM)的发展&#xff0c;将…

linux查看磁盘类型命令

在Linux中&#xff0c;有多种方法可以查看磁盘是固态硬盘&#xff08;SSD&#xff09;还是机械硬盘&#xff08;HDD&#xff09;。以下是一些常用的方法&#xff1a; 查看/sys/block/目录 /sys/block/目录包含了系统中所有块设备的信息。你可以查看这个目录中的设备属性来判断…

Tomcat概述及部署

目录 一、Tomcat概述 1.Tomcat的简介 2.Tomcat 核心的三个组件 3.应用场景 4.Tomcat 请求过程 二、部署安装Tomcat 三、Tomcat 虚拟主机配置 四、Tomcat多实例部署 一、Tomcat概述 1.Tomcat的简介 Tomcat 是 Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开…

eNSP学习——RIP路由协议基础配置

目录 主要命令 原理概述 实验内容 实验目的 实验拓扑 实验编址 实验步骤 1、基本配置 2、使用RIPv1搭建网络 开启 RIP调试功能 3、使用RIPv2搭建网络 RIPv1和RIPv2的不同 需要eNSP各种配置命令的点击链接自取&#xff1a;华为&#xff45;NSP各种设备配置命令大全PD…

yolov5的口罩识别系统+GUI界面 (附代码)

基于YOLOv5模型的口罩识别系统&#xff0c;结合了GUI界面&#xff0c;旨在帮助用户快速、准确地识别图像或视频中佩戴口罩的情况。YOLOv5是一种流行的目标检测模型&#xff0c;具有高效的实时检测能力&#xff0c;而GUI界面则提供了友好的用户交互界面&#xff0c;使得整个系统…

在VSCode中安装python

引言 Python 是一种广泛使用的高级编程语言&#xff0c;因其易学、易用、强大而受到欢迎。它由 Guido van Rossum 于 1991 年首次发布&#xff0c;并以简洁的语法和丰富的库生态系统而著称。 以下是 Python 的一些关键特点和优势&#xff1a; 关键特点 易于学习和使用&#x…

操作系统 重点知识总结 习题集

文章目录 一、操作系统概述&#x1f496; 1000题集&#x1f341; 单选题&#x1f341; 综合应用题1. 单道与多道批处理系统的特点及优缺点。3. 试在交互性、及时性和可靠性方面&#xff0c;将分时系统与实时系统进行比较。4. 说明实时任务的类型和实时系统的类型。5. 处理机管理…

华媒舍:海外公司申请注册和国内市场的差异

伴随着经济全球化的加快推进&#xff0c;更多的企业开始把发展趋势目光投向国外市场。海外公司申请注册推广是涉足国际性市场的重要一环&#xff0c;但是中国市场与国外市场存在明显的差别。本文将在客户满意度、市场市场竞争、法律合规及其文化冲突等多个方面讨论海外公司申请…

Java操作Excel大全(持续更新)

文章目录 一、根据Excel模板导出1、POI2、Freemarker 二、EasyExcel1、导包2、官网 一、根据Excel模板导出 1、POI 需要poi的包。 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency><groupId>org.apache.poi</groupId>…

使用Django JWT实现身份验证

文章目录 安装依赖配置Django设置创建API生成和验证Token总结与展望 在现代Web应用程序中&#xff0c;安全性和身份验证是至关重要的。JSON Web Token&#xff08;JWT&#xff09;是一种流行的身份验证方法&#xff0c;它允许在客户端和服务器之间安全地传输信息。Django是一个…

Spring Boot前后端简单集成MinIo开发

Spring Boot前后端简单集成MinIo开发 源码地址重要配置和代码MinIO配置核心代码 最终效果 源码地址 minioStudy 重要配置和代码 MinIO配置 pom文件引入依赖 <!-- minio --> <dependency><groupId>io.minio</groupId><artifactId>minio</ar…

【C语言之排序】-------六大排序

作者主页&#xff1a;作者主页 数据结构专栏&#xff1a;数据结构 创作时间 &#xff1a;2024年5月18日 前言&#xff1a; 今天我们就给大家带来几种排序的讲解&#xff0c;包括冒泡排序&#xff0c;插入排序&#xff0c;希尔排序&#xff0c;选择排序&#xff0c;堆排序&…

揭秘成都跃享未来教育:安全靠谱,打造教育新未来?

在当今这个信息爆炸的时代&#xff0c;教育行业的变革日新月异&#xff0c;各种教育机构如雨后春笋般涌现。其中&#xff0c;成都跃享未来教育咨询有限公司以其独特的教育理念和创新的教学模式&#xff0c;吸引了众多家长和学生的目光。那么&#xff0c;这家公司到底安不安全&a…