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

Qt 界面无边框 拖拽移动 问题处理:setMouseTracking(true)无法跟踪鼠标事件

问题1: setMouseTracking(true)无法跟踪鼠标事件

问题原因:

底层界面widgetA, 在此之上 要搭建很多顶层界面, 比如: 最顶层导航栏WidgetB, 左边导航栏widgetC, 中间界面WIdgetD,并且这些界面完全覆盖了底层界面, 就会导致鼠标移动事件被拦截。
【当然距离底层界面四周有一定的间距 不影响, 有些gitee github 上提供的代码 是用 setMouseTracking(true) 实现无边框拖拽, 最终发现四周的边框间距 都有一定的间距 至少1px】

解决方法:

 setAttribute(Qt::WA_Hover);  //代替 setMouseTracking(true) 
 bool DSMainWindow::event(QEvent *event)
{

    if (event->type() == QEvent::HoverMove)
    {
        QHoverEvent *hoverEvent = static_cast<QHoverEvent *>(event);
        ...
        ...
    }


    return QWidget::event(event);
}

具体问题原因分析:(猜测)

控件 vs 窗体的作用域(可能原因):

  • setMouseTracking(true) 是控件的属性,因此它只会影响 当前控件 的事件处理。如果控件被遮挡,事件就会被拦截到上层控件,导致底层控件无法接收到鼠标移动事件。它依赖于控件的 层级顺序 和事件传递规则。
  • setAttribute(Qt::WA_Hover) 是一种 窗体控件属性,它决定了控件是否会接收悬停事件(QEvent::HoverMove)。即使上层控件遮挡了底层控件,只要上层控件没有显式地处理悬停事件(例如没有拦截 QEvent::HoverMove),事件就会继续传递到底层控件。

事件的传递与拦截(可能原因):

  • setMouseTracking(true)QMouseEvent 是直接相关的,事件的捕获是基于控件的层级(Z 顺序)。当控件被上层控件遮挡时,上层控件拦截了事件,事件就不会传递到底层控件。
  • setAttribute(Qt::WA_Hover) 启用的是 悬停事件,即使控件被遮挡,只要上层控件没有拦截悬停事件(QEvent::HoverMove),事件就能继续传递到底层控件。

问题2: 多人远程操作同一台电脑,导致界面发生抢占

问题原因:

当员工A 鼠标长按 放置在界面顶部, 或者一直拖动移动, 员工B远程进来也在操作界面,会发生界面跟随员工B 的鼠标移动。 因为前者员工A 鼠标长按 Pressed 标志置位true, 后者员工B 进来虽然是悬浮移动, 但是Pressed 仍是True, 就导致界面跟随鼠标悬浮移动。

解决方法:

//鼠标 悬浮进入 或者离开 Pressed 都为false 只有按压才为true。员工B 操作的时候,检测到悬浮进入 Pressed 至为false 
if (event->type() == QEvent::HoverEnter || event->type() == QEvent::HoverLeave)
    {
        pressed_flag = false;
    }
    if (event->type() == QEvent::HoverMove)
    {
        QHoverEvent *hoverEvent = static_cast<QHoverEvent *>(event);
        QMouseEvent mouseEvent(QEvent::MouseMove, hoverEvent->pos(),
                               Qt::NoButton, Qt::NoButton, Qt::NoModifier);
        if (!pressed_flag)
        {
            CalculateBorder(mouseEvent.pos());
        }
    }

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

相关文章:

  • qt QProcess详解
  • Node.js笔记
  • 【C#设计模式(8)——过滤器模式(Adapter Pattern)】
  • ubuntu ros 解决建完图后 保存的地图非常小的问题
  • AtomicInteger 和 AtomicIntegerFieldUpdater的区别
  • 【STM32】基于SPI协议读写SD,详解!
  • <项目代码>YOLOv8 玉米地杂草识别<目标检测>
  • unity3d————四元数,欧拉角的互相转换的初步了解
  • 【bayes-Transformer-GRU多维时序预测】多变量输入模型。matlab代码,2023b及其以上
  • Bert框架详解(上)
  • EM是什么?如何修复EM violation?
  • arm中内存读取延迟性能测试
  • goframe开发一个企业网站 rabbitmq队例15
  • 【网络面试篇】TCP 相关——重传机制、滑动窗口、流量控制、拥塞控制、Keep-Alive、KeepAlive
  • 优选算法 - 1 ( 双指针 移动窗口 8000 字详解 )
  • SpringFramework
  • VMware调整窗口为可以缩小但不改变显示内容的大小
  • 如何基于redis记录调用大模型问答的统一注册服务
  • Vue3 实现拖拽小图片覆盖大图片并下载合并后的图片
  • Flutter运行App时出现“Running Gradle task ‘assembleDebug“问题解决
  • Vue2 doc、excel、pdf、ppt、txt、图片以及视频等在线预览
  • 信创异构环境下审视云原生二层和三层容器网络
  • 共享汽车管理:SpringBoot框架的高效实现
  • Ubuntu 18在线安装Docker 实战 2024年11月
  • 访谈Sam Altman:他再次阐述对一个人AI公司的定义以及GPT系列规划
  • Java项目实战II基于Spring Boot的光影视频平台(开发文档+数据库+源码)