窗口重叠之鼠标事件透传

目的

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);
  }
}

效果



代码链接

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大型零售企业总部到分公司数据发放,有没有更优化的方案?

大型零售企业在市场经济中扮演重要角色&#xff0c;是保证基础商品生产、流通和供给的重要一环。随着企业发展&#xff0c;很多大型零售企业都会在全国、乃至全球各地开设分公司&#xff0c;用以降低生产和运营成本&#xff0c;更好地提供本地化服务。 为了保证总部与分公司间信…

探索魁北克:IT专业人士的移民新天地

在这个数字化飞速发展的时代&#xff0c;IT专业人士无疑是推动社会进步的关键力量。魁北克省&#xff0c;作为加拿大的科技与文化中心&#xff0c;正以其开放的姿态和优越的移民政策&#xff0c;吸引着全球IT精英的目光。今天&#xff0c;让我们一起探索魁北克省为IT专业人士量…

25地信考研必看:含择校、备考、夏令营攻略资料分享

25考研学子们&#xff0c;考研准备要赶早&#xff0c;这里小编给大家整合准备了25考研需要关注的几个重要内容&#xff0c;需要的宝子收藏起来。 一、25地信考研的时间线&#xff1a; 大三&#xff1a; 择校、开始复习 大三暑假&#xff1a; 参加高校组织的夏令营&#xf…

Docker基础篇之Docker常规软件安装

文章目录 1. 总体步骤2. 安装tomcat3. 安装Mysql4. 安装Redis 1. 总体步骤 安装软件的总体步骤如下所示&#xff1a; 搜索镜像拉取镜像查看镜像启动镜像停止容器移除容器 2. 安装tomcat docker hub上查找tomcat镜像 或者使用一下命令查找&#xff1a; docker search tomca…

映射网络驱动器自动断开的解决方法

如果将驱动器映射到网络共享&#xff0c;映射的驱动器可能会在定期处于非活动状态后断开连接&#xff0c;并且 Windows 资源管理器可能会在映射驱动器的图标上显示红色 X。&#xff0c;出现此行为的原因是&#xff0c;系统可以在指定的超时期限后断开空闲连接&#xff0c; (默认…

echarts 交错柱状图, 对向柱状图, 双柱状图横向

设计图样式 上代码 父组件 <bar-chart :option"energyOption"></bar-chart>initChart() {//上周能耗排行榜this.black_label ["漫张农污处理设施","邓庄农污处理设施","王桥农污处理设施","甲庄农污处理设施"…

做抖音小店卖什么最赚钱?精准锁定爆款的技巧!新手商家必看

哈喽~我是电商月月 做抖音小店的核心就是选品&#xff0c;商品好&#xff0c;出单的几率就多&#xff0c;那么怎么选中一个好的商品&#xff0c;就是每个商家必须细琢的一个技巧&#xff01; 为了解答这个疑惑&#xff0c;今天月月就给大家介绍几个赚钱的类别&#xff0c;并教…

目标检测数据集 - 打架检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;打架检测数据集&#xff0c;真实监控场景高质量打架图片数据&#xff0c;涉及场景丰富&#xff0c;比如街道场景打架数据、酒吧场景打架数据、商店场景打架数据、公交车场景打架数据、监狱场景打架数据、空旷地打架数据、两人打架数据、多人群殴数据等。…

用cocos2d-python绘制游戏开发的新篇章

用cocos2d-python绘制游戏开发的新篇章 第一部分&#xff1a;背景 在游戏开发的世界中&#xff0c;寻找一个强大而灵活的框架至关重要。cocos2d-python是一个Python游戏开发框架&#xff0c;它提供了一套丰富的功能&#xff0c;用于创建2D游戏、图形和交互式应用。基于流行的c…

企业办公网安全管控挑战与解决方案

在数字化浪潮的推动下&#xff0c;企业正经历前所未有的变革。然而&#xff0c;随之而来的是一系列复杂的网络安全风险和挑战。我们的网络边界不再清晰&#xff0c;各种设备轻松接入企业网络&#xff0c;这不仅带来了便利&#xff0c;也极大地增加了安全风险。想象一下&#xf…

面试被问准备多久要孩子?这样回答

听说有人面试被问到多久要孩子的问题&#xff0c;当时觉得很尴尬&#xff0c;不知如何回答&#xff0c;怕回答的不好不被录用&#xff0c;其实你可以这样回答&#xff0c;让面试官心满意足。 A 面试官&#xff1a;结婚了吗&#xff1f; 我&#xff1a;结婚了 面试官&#xff1…

innovus:max_delay与path adjustment

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 一些过约束的path&#xff0c;比如端口in/out上的时序&#xff0c;我们需要让它更乐观以免过修浪费资源&#xff0c;反而让需要clean的path没修干净。这时候我们常用set_path_a…

数据中心综合解决方案

安科瑞电气股份有限公司 祁洁 acrelqj 一、方案介绍 安科瑞电气紧跟数据中心发展形式&#xff0c;推出数据中心综合解决方案&#xff0c;集成了变配电监测、电源备自投、电气接点测温、智能照明控制、电能质量监测及治理、蓄电池在线监测、精密配电监控、智能母线监控以及消…

pdf文件太大如何变小,苹果电脑压缩pdf文件大小工具软件

压缩PDF文件是我们在日常办公和学习中经常会遇到的需求。PDF文件由于其跨平台、保持格式不变的特点&#xff0c;被广泛应用于各种场合。然而&#xff0c;有时候我们收到的PDF文件可能过大&#xff0c;不便于传输和存储&#xff0c;这时候就需要对PDF文件进行压缩。下面&#xf…

通过ssr-echarts,服务端生成echarts图

ssr-echarts &#xff1a;一个开源项目&#xff0c;它能够服务端渲染 ECharts 图表&#xff0c;并直接生成 PNG 图片返回。该项目提供了多种主题&#xff0c;并且支持 GET 和 POST 请求。如果参数较多&#xff0c;建议使用 POST 方法。用户可以自己部署这个服务。 1. 服务端安装…

Codeforces Round 948 (Div. 2) A~D

A. Little Nikita &#xff08;思维&#xff09; 题意&#xff1a; 小 A A A决定用一些立方体建一座塔。一开始&#xff0c;塔上没有任何立方体。在一次移动中&#xff0c;小 A A A要么正好把 1 1 1 个立方体放到塔顶&#xff0c;要么正好从塔顶移走 1 1 1 个立方体。存不存…

目标检测数据集 - 城市道路行驶车辆检测数据集下载「包含VOC、COCO、YOLO三种格式」

​​​数据集介绍&#xff1a;城市道路行驶车辆检测数据集&#xff0c;真实监控场景高质量图片数据&#xff0c;涉及场景丰富&#xff0c;比如城市道路快速行驶车辆、城市道路慢速行驶车辆、城市道路密集行驶车辆、城市道路夜间低光行驶车辆数据等。数据集标注标签划分为 "…

Qt报错:libvlc开发的程序,出现Direct3D output全屏窗口

问题描述&#xff1a; 在qt中开发重播模块时&#xff0c;第一次在窗口正常播放&#xff0c;点击重播按钮后会弹出新的Direct3D output窗口播放视频 分析&#xff1a; 因为libvlc_media_player_set_hwnd 这个函数 设置了不存在的窗口句柄&#xff0c;导致vlc视频播放窗口没有嵌…

python-题库篇-为什么数组下标从0 开始而不是 1

为什么很多编程语言要把 0 作为第一个下标索引&#xff0c;而不是直观的 1 呢&#xff1f; 这个问题 Dijkstra 已经解答过了&#xff0c;没错&#xff0c;就是你知道的 Dijkstra&#xff0c;Dijkstra 最短路径算法&#xff0c;荷兰语全名是 Edsger Wybe Dijkstra&#xff0c;于…