最近用Qt软件界面,需要用到mouseMoveEvent,研究了下,发现些问题,分享一下。

在Qt中要捕捉鼠标移动事件需要重写MouseMoveEvent,但是MouseMoveEvent为了不太耗资源在默认状态下是要鼠标按下才能捕捉到。要想鼠标不按下时的移动也能捕捉到,需要setMouseTracking(true)。

bool mouseTracking

这个属性保存的是窗口部件跟踪鼠标是否生效。

如果鼠标跟踪失效(默认),当鼠标被移动的时候只有在至少一个鼠标按键被按下时,这个窗口部件才会接收鼠标移动事件。

如果鼠标跟踪生效,如果没有按键被按下,这个窗口部件也会接收鼠标移动事件。

QWidget中使用是没有问题的,但是,对于QMainWindow即使使用了setMouseTracking(true)依然无法捕捉到鼠标没有按下的移动,只有在鼠标按下是才能捕捉。

解决办法:要先把QMainWindow的CentrolWidget使用setMouseTracking(true)开启移动监视。然后在把QMainWindow的setMouseTracking(true)开启监视。之后就一切正常了。

原因:CentrolWIdget是QMainWindow的子类,你如果在子类上响应鼠标事件,只会触发子类的mouseMoveEvent,根据C++继承和重载的原理,所以子类也要setMouseTracking(true); 所以如果你想响应鼠标事件的控件被某个父控件包含,则该控件及其父控件或容器也需要setMouseTracking(true);

ui->centralWidget->setMouseTracking(true);

    setMouseTracking(true);  //这是激活整个窗体的鼠标追踪
    ui->pBtnMenu->setMouseTracking(true); //进入某个按钮时,鼠标追踪属性失效,因此我们也需要激活该按钮的鼠标追踪功能
    ui->pBtnTest->setMouseTracking(true);

//然后再实现mouseMoveEvent()事件

void MainWindow::mouseMoveEvent(QMouseEvent *e)
{
    qDebug()<<"mouse move ";
   e->accept();
   if(enterBtn(e->pos(),ui->pBtnMenu))
       //Qlab_context->setText("这是第一个按钮");
       qDebug()<<"menu";
   if(enterBtn(e->pos(),ui->pBtnTest))
       qDebug()<<"test";
       //Qlab_context->setText("这是第二个按钮");
}
//这里我使用另一个函数来完成判断鼠标是否在一个按钮区域内,如果在区域内只返回真,否则返回假
bool MainWindow::enterBtn(QPoint pp, QPushButton *btn)
{
   int height = btn->height();
   int width = btn->width();
   QPoint btnMinPos = btn->pos();
   QPoint btnMaxPos = btn->pos();
   btnMaxPos.setX(btn->pos().x()+width);
   btnMaxPos.setY(btn->pos().y()+height);
   if(pp.x() >= btnMinPos.x() && pp.y() >= btnMinPos.y()
       && pp.x() <= btnMaxPos.x() && pp.y() <= btnMaxPos.y())
       return true;
   else
       return false;
}

Qt中mouseMoveEvent在MainWindow中使用相关推荐

  1. Qt中mouseMoveEvent(QmouseEvent *event)使用探讨

    Qt中mouseMoveEvent(QmouseEvent *event)使用探讨 在学习网络教程过程中,尝试使用Qpainter制作一个涂鸦板,需要使用QmouseEvent ,按照教程,涂鸦板不能 ...

  2. 【Qt】Qt学习笔记(更新中)

    文章目录 0x00 前言 0x01 Qt简介 1.1 Qt是什么 1.2 Qt发展史 1.3 Qt支持的平台 1.4 使用Qt开发的软件 1.5 Qt的优点 1.6 其它 0x02 创建Qt项目 2. ...

  3. Qt的日常编程过程中遇见的问题和使用

    Qt的日常编程过程中遇见的问题和注意 Qt的日常编程过程中遇见的问题 1.QString和String的转化的格式问题,中文转化过程中会出现问题. 2.使用qcustomplot的时候出现错误:LIN ...

  4. 在Qt for Python应用程序中使用Designer UI文件

    在Qt for Python应用程序中使用Designer UI文件 在Qt for Python应用程序中使用Designer UI文件 将表单转换为Python代码 UiTools方法 在Qt f ...

  5. Qt Creator在问题窗格中显示任务列表文件

    Qt Creator在问题窗格中显示任务列表文件 在问题窗格中显示任务列表文件 管理任务列表条目 任务列表文件格式 在问题窗格中显示任务列表文件 您可以使用代码扫描和分析工具来检查源代码.这些工具报告 ...

  6. Qt Creator在3D编辑器中工作

    Qt Creator在3D编辑器中工作 在3D编辑器中工作 控制3D编辑器相机 使用全局和局部方向 使用编辑灯 选择项目 移动项目 旋转项目 缩放项目 在3D编辑器中工作 编辑3D场景时,可以在3D编 ...

  7. Qt学习之安装过程中各种问题的解决

    Qt的安装之路真的坎坷,也许是我电脑太难了吧,不过,还是在不断尝试中一个一个解决了全部问题,下面就来看看Qt安装过程中这些问题到底要怎么解决吧. 这里写目录标题 版本选择 问题一--win10系统Qt ...

  8. Qt QImage scaled方法缩放中的问题

    最近在某些测试中发现,QImage 先按照一定的比例进行缩放,在对QImage对象进行绘制等操作后,使用以下的方式将其恢复到其原来的尺寸. 为了后面在可能在绘制的过程中让成员变量尽量的少,我定义了一个 ...

  9. QT中QDatetime中文系统中获取英文系统的结果

    QT中QDatetime中文系统中获取英文系统的结果 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 我们在中文系统下开发QT程序,如 ...

  10. Qt(C++)项目中使用 Basler 工业相机(1)

    Qt(C++)项目中使用 Basler 工业相机(1 枚举相机) 最近的一个项目中用到Basler 的GigE 接口的工业相机.为此花了好几天时间研究了pylon 的用法.本文就是学习过程中做的笔记. ...

最新文章

  1. 阿里云LinkIOTEdge物理边缘计算流程
  2. 乐Phone:还原联想的联想
  3. [PHP] 现代化PHP之路:composer的镜像站设置
  4. vector作为参数传递到dll问题
  5. sed 第n行后加入_【高新课堂】第一百三十九期Liunx运维17个实用技巧
  6. 面试分享系列 | 17道Python面试题,让你在求职中无往不利
  7. d3d9 抓取windows屏幕
  8. memcached一致性哈希及php客户端实现
  9. ubuntu 10.10下面添加samba实现和windows共享文件
  10. Atitit node.js的缺点 优缺点 和php比较 1. 门槛比较 php简单,node麻烦 1 1.1. php的优势是语法简单易学,学习曲线平滑度可能居所有语言之首 2 1.2. 当用N
  11. c++股票数据接口逻辑是什么
  12. NS3:FlowMonitor设计讲解
  13. 牢记公式,ardupilot EKF2就是纸老虎(五)!
  14. 张小平,海底捞,比特大陆
  15. Microsoft Sync Framework Runtime 简介(一篇非常好的MSF介绍文章)
  16. python如何抓取图片数据_python 的简单抓取图片
  17. 乡愁!根之所在,情之所系!
  18. Java网络爬虫基础概述
  19. Intellij IDEA中push代码到github中引发的部分报错 解决思路
  20. 赛尔号找不到服务器ip,赛尔号互通版

热门文章

  1. 六步学会github入门使用
  2. 远程控制计算机显示为什么不能满屏,win7远程桌面不能全屏显示怎么办-处理win7远程桌面不能全屏显示的方法 - 河东软件园...
  3. 做问卷调查最基本的注意事项
  4. 传言阿里P10赵海平,被P11多隆判定3.25离职,如何评价阿里 P10 赵海平对王垠的面试?
  5. 关于IllegalArgumentException occurred while calling setter for property
  6. 在谷歌搜索框内不显示搜索记录
  7. scratch经典游戏主题源码分享,包含了20多款经典游戏
  8. PCB贴片元器件手工焊接技巧及要点
  9. C/C++ C语言定义结构体的几种方法
  10. ONVIF系列——海康摄像头设置onvif协议开启