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

在 Qt 中获取 MouseMove 事件

在编写 Qt 程序时,我希望在鼠标移动时(即使鼠标在另一个窗口上)能够调用 mouseMoveEvent(QMouseEvent* event) 方法。目前,在我的 mainwindow.cpp 文件中,我有如下代码:

void MainWindow::mouseMoveEvent(QMouseEvent* event) {qDebug() << QString::number(event->pos().x());qDebug() << QString::number(event->pos().y());
}

但这段代码似乎只在鼠标按下并拖动时才会被调用,而且仅限于在窗口上方。我尝试在 MainWindow 的构造函数中调用 setMouseTracking(true);,但这并没有产生任何不同的效果(只能在按住鼠标按钮时调用 mouseMoveEvent,无论鼠标位于何处)。那么,如何实现全局追踪鼠标位置呢?

解决方法

通过在应用程序上使用事件过滤器可以解决这个问题。

步骤一:定义并实现事件过滤器

MainWindow 类中定义并实现 eventFilter(QObject*, QEvent*) 方法。例如:

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{if (event->type() == QEvent::MouseMove){QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);statusBar()->showMessage(QString("Mouse move (%1,%2)").arg(mouseEvent->pos().x()).arg(mouseEvent->pos().y()));}return false;
}

步骤二:安装事件过滤器

MainWindow 的构造函数中安装事件过滤器。例如:

MainWindow::MainWindow(...)
{...qApp->installEventFilter(this);...
}

通过以上两步操作,我们可以在应用程序窗口内实现鼠标移动状态的持续更新。

拓展:全局鼠标事件捕捉

如果需要追踪应用程序窗口之外的鼠标移动,需要使用 QWidget::grabMouse() 方法。这会导致所有鼠标事件都被发送给捕获鼠标的窗口,从而阻止正常的窗口间交互。因此,可以在鼠标离开窗口时捕获鼠标(在 leaveEvent() 中调用 grabMouse()),并在鼠标进入窗口时释放鼠标(在 enterEvent() 中调用 releaseMouse())。

然而,这种方法也可能带来一些负面影响。另一种替代方案是使用 QTimer 定时轮询鼠标位置,可以通过 QCursor::pos() 获取当前鼠标位置。

其他方案

如果只需要在应用程序的某特定部件内追踪鼠标移动,可以调用该部件的 setMouseTracking(true) 方法,例如:

this->viewport()->setMouseTracking(true);

然后重载 mouseMoveEvent 而不是创建和安装事件过滤器。

这种方法更为简单,不需要自定义事件过滤器,但需要将 setMouseTracking(true) 调用在正确的部件(如 viewport)上,而非主窗口本身。

总结

通过事件过滤器可以实现应用程序窗口内的鼠标移动状态更新,而通过捕捉鼠标或定时轮询的方法可以实现更广泛的鼠标位置追踪。根据具体需求选择合适的方法,以实现最佳效果。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • mysql中where与on区别
  • python 爬虫技术 第04节 函数和模块
  • 与大数据相关的 Python 第三方库和工具
  • MATLAB基础:数据和变量
  • 基于TensorFlow.js和COCO-SsD模型的实时目标检测网络应用程序
  • Python从0到100(四十六):实现管理员登录及测试功能
  • Vue--解决error:0308010C:digital envelope routines::unsupported
  • CTF ssti零基础(一) 模块注入的payload
  • 【大数据专题】Flink题库
  • unplugin-vue-components 的作用是什么
  • 数据结构——栈(顺序结构)
  • Visual Studio Code + vue快速安装配置Node.js+Vue+webpack+vscode
  • 【Java25】内部类
  • Ubuntu20.04安装Elasticsearch
  • 【STM32 HAL库】ADC
  • 分享的文章《人生如棋》
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • iOS编译提示和导航提示
  • java概述
  • Node + FFmpeg 实现Canvas动画导出视频
  • Python语法速览与机器学习开发环境搭建
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Vue.js 移动端适配之 vw 解决方案
  • Webpack 4 学习01(基础配置)
  • XML已死 ?
  • 记录一下第一次使用npm
  • 理解在java “”i=i++;”所发生的事情
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • ​字​节​一​面​
  • #Linux(权限管理)
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (4) PIVOT 和 UPIVOT 的使用
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (k8s中)docker netty OOM问题记录
  • (windows2012共享文件夹和防火墙设置
  • (八十八)VFL语言初步 - 实现布局
  • (二)原生js案例之数码时钟计时
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (六)软件测试分工
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (一)SvelteKit教程:hello world
  • (转)http协议
  • .naturalWidth 和naturalHeight属性,
  • .NET C# 配置 Options
  • .net6 webapi log4net完整配置使用流程
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET技术成长路线架构图
  • .NET连接MongoDB数据库实例教程
  • @ConditionalOnProperty注解使用说明
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @Slf4j idea标红Cannot resolve symbol ‘log‘
  • @我的前任是个极品 微博分析
  • [Algorithm][综合训练][体育课测验(二)][合唱队形][宵暗的妖怪]详细讲解
  • [Android 13]Input系列--获取触摸窗口