当前位置: 首页 > article >正文

QT 窗口A覆盖窗口B时,窗口B接受不到鼠标事件

一、问题

        在项目的需求中,地图A上面需要叠放一个任务窗口B,B覆盖了A,导致A接受不到鼠标及滚轮事件。

二、解决方案

        1、Qt::WA_TransparentForMouseEvents 是 Qt 框架中的一个属性,用于使指定的控件及其子控件不响应鼠标事件。当启用此属性时,鼠标事件将传递给其他控件,就像这些控件及其子控件不存在于控件层次结构中一样

        2、利用postEvent给指定控件发送事件。 重载上面widget的事件处理函数,利用postEvent发送事件,让事件分发给下面的窗口

三、案例

//上层窗口
void Widget::mousePressEvent(QMouseEvent *event)
{
    QWidget::mousePressEvent(event);
    postMouseEventToSlibings(event);
    qDebug() << "widget mousePressEvent";
}

void Widget::postMouseEventToSlibings(QMouseEvent *event)
{
    if (this->parentWidget())
    {
        this->setAttribute(Qt::WA_TransparentForMouseEvents, true);
        auto point = this->mapTo(parentWidget(), event->pos());
        auto widget = parentWidget()->childAt(point);
        if (widget)
        {
            point = widget->mapFrom(parentWidget(), point);
            auto e = new QMouseEvent(event->type(), point, event->button(),
                                     event->buttons(), event->modifiers());
            QApplication::postEvent(widget, e);
        }
    }

    setAttribute(Qt::WA_TransparentForMouseEvents, false);
}


http://www.kler.cn/a/535956.html

相关文章:

  • unity学习32:角色相关1,基础移动控制
  • Python设计模式 - 原型模式
  • GB/T28181 开源日记[8]:国标开发速知速会
  • RabbitMQ 从入门到精通:从工作模式到集群部署实战(三)
  • 013-51单片机红外遥控器模拟控制空调,自动制冷制热定时开关
  • 02vue3实战-----项目目录详解
  • AJAX 详细教程
  • 导入了fastjson2的依赖,但却无法使用相关API的解决方案
  • 二、0-1搭建springboot+vue3前后端分离-登录页面
  • 【Redis实战】投票功能
  • 深度剖析思科安全产品的特征以及技术特点
  • 【DeepSeek】DeepSeek小模型蒸馏与本地部署深度解析DeepSeek小模型蒸馏与本地部署深度解析
  • 【Elasticsearch】multi terms aggregation
  • 蓝桥杯字串简写(二分)
  • 火语言RPA--JSON提取
  • Go语言中的高阶函数
  • 【MySQL】centos 7 忘记数据库密码
  • Maven 构建生命周期与阶段详解
  • Redis存储⑤Redis五大数据类型之 List 和 Set。
  • Java面试场景题分享
  • stm32生成hex文件详解
  • 如何在 Kivy 中从按钮更新选项卡内容
  • 【重生之学习C语言----水仙花篇】
  • PostgreSQL:数据库迁移与版本控制
  • 【Unity3D小功能】Unity3D中实现超炫按钮悬停效果
  • Golang 并发机制-6:掌握优雅的错误处理艺术