一、QMouseEvent的详细描述

首先请注意,Qt中的QMouseEvent一般只涉及鼠标左键或右键的单击、释放等操作,而对鼠标滚轮的响应则通过QWheeEvent来处理。

QMouseEvent类包含了用于描述鼠标事件的参数。

当在一个窗口里按住鼠标按键、或移动、或释放就会产生鼠标事件QMouseEvent。

鼠标移动事件只会在按下鼠标按键的情况下才会发生,除非通过显式调用QWidget::setMouseTracking()函数来开启鼠标轨迹,这种情况下只要鼠标指针在移动,就会产生一系列的QT鼠标事件;

在一个窗口中,当鼠标按键被按下时,QT会自动捕捉鼠标轨迹,鼠标指针所在的父窗口会继续接受鼠标事件,直到最后一个鼠标按键被释放。

二、QMouseEvent的传递

一个鼠标事件包含一些指定的接受标志flag用于指出该事件是否会被接收和处理 ,如果鼠标指针所在的父窗口不接收该事件则可以调用函数ignore()予以忽略;

多个重叠的窗口在实现里好比一个递归的倒立树,鼠标事件会沿着鼠标指针所在的父窗口的链表向上传递,直到某个窗口调用accept()函数进行事件处理,否则该事件将被过滤销毁掉;

如果一个鼠标事件传递给鼠标指针所在的窗口,而该窗口的QT::WA_NoMousePropagation位置为TRUE,则该事件不会通过父窗口继续向上传递。

可以通过函数pos()、x()、y()得知鼠标事件发生时鼠标指针相对于窗口的位置。

如果把移动窗口作为一次鼠标事件,可以通过函数globalPos()返回的全局坐标值避免窗口的抖动。

可以使用QWidget::setEndabled()来开启/关闭对应的窗口是否接受键盘和鼠标事件。

需要对鼠标事件进行处理时,通常要重新实现以下几个鼠标事件处理函数:

QWidget::mousePressEvent()
QWidget::mouseReleaseEvent()
QWidget::mouseDoubleClickEvent()
QWidget::mouseMoveEvent()

三、鼠标事件

鼠标事件使用的时候,加头文件

#include <QMouseEvent>

1.鼠标按下事件

void Widget::mousePressEvent(QMouseEvent *event)
{// 如果是鼠标左键按下if(event->button() == Qt::LeftButton){···}// 如果是鼠标右键按下else if(event->button() == Qt::RightButton){···}
}

2.鼠标移动事件 默认情况下,触发事件需要点击一下,才能触发。可设置为自动触发:setMouseTracking(true);

void Widget::mouseMoveEvent(QMouseEvent *event)
{// 这里必须使用buttons()if(event->buttons() & Qt::LeftButton) //进行的按位与{ ···}
}

3.鼠标释放事件

void Widget::mouseReleaseEvent(QMouseEvent *event)
{···
}

4.鼠标双击事件

void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{// 如果是鼠标左键按下if(event->button() == Qt::LeftButton){···}
}

5.滚轮事件

void Widget::wheelEvent(QWheelEvent *event)
{if(event->delta() > 0)// 当滚轮远离使用者时{···}else//当滚轮向使用者方向旋转时{···}
}

四、键盘事件

键盘事件使用时,加头文件

#include <QKeyEvent>

1.键盘按下事件

void Widget::keyPressEvent(QKeyEvent *event)
{// 是否按下Ctrl键      特殊按键if(event->modifiers() == Qt::ControlModifier){// 是否按下M键    普通按键  类似if(event->key() == Qt::Key_M)···}else QWidget::keyPressEvent(event);   //保存默认事件//如果是处理两个普通按键,得避免自动重复,释放中也要处理if(event->key() == Qt::Key_Up){// 按键重复时不做处理if(event->isAutoRepeat())   return;// 标记向上方向键已经按下keyUp = true;}else if(event->key() == Qt::Key_Left){if(event->isAutoRepeat()) return;keyLeft = true;}
}

2.按键释放事件

void Widget::keyReleaseEvent(QKeyEvent *event)
{···//如果是处理两个普通按键,得避免自动重复if(event->key() == Qt::Key_Up){if(event->isAutoRepeat()) return;···       }else if(event->key() == Qt::Key_Left){if(event->isAutoRepeat()) return;···}
}

五、常用公有成员函数

1.globalPos()、globalX()、globalY()这三个函数返回的是鼠标指针的全局坐标。


const QPoint & QMouseEvent::globalPos () const
返回鼠标指针的全局坐标值,对于异步窗口系统例如X11这是一个很重要的特性,无论何时移动窗口作为对鼠标事件的响应时,globalPos()返回的当前鼠标指针坐标值和QCursor::pos()的返回值是有区别的,可以通过调用QWidget::mapToGlobal(pos())在窗口坐标和全局坐标系之间进行转换。


int QMouseEvent::globalX () const
返回鼠标事件发生时鼠标指针全局坐标的X值,相当于globalPos.x();


int QMouseEvent::globalY () const
返回鼠标事件发生时鼠标指针全局坐标的Y值,相当于globalPos.y()。


2.pos()、posF()、x()、y()这四个函数返回的是鼠标指针在当前接收鼠标事件的窗口中的位置。


const QPoint & QMouseEvent::pos () const
返回鼠标指针和接受该鼠标事件窗口的相对位置,其中的坐标值为整型;


QPointF QMouseEvent::posF () const
返回鼠标指针在接受该鼠标事件窗口的相对位置,该坐标值用float类型表示可以增加精确度;


int QMouseEvent::x () const
返回鼠标事件发生时,鼠标指针在当前接收鼠标事件的窗口中位置的x坐标值,相当与pos().x();


int QMouseEvent::y () const
返回鼠标事件发生时,鼠标指针在当前接收鼠标事件的窗口中位置的y坐标值,相当于pos().y()。

QMouseEvent鼠标事件简介相关推荐

  1. qt linux 鼠标事件,QT学习笔记5:QMouseEvent鼠标事件简介

    一.QMouseEvent的详细描述 首先请注意,Qt中的QMouseEvent一般只涉及鼠标左键或右键的单击.释放等操作,而对鼠标滚轮的响应则通过QWheeEvent来处理. QMouseEvent ...

  2. 【转】QMouseEvent鼠标事件简介

    首先请注意, Qt中的QMouseEvent一般只涉及鼠标左键或右键的单击.释放等操作 ,而对 鼠标滚轮的响应则通过QWheeEvent来处理 . 以下内容来自QMouseEvent的API文档. 1 ...

  3. QT 事件系统之QMouseEvent鼠标事件

    概述 在Qt中,鼠标事件被封装成.QMouseEvent对象,QMouseEvent中包含一些参数,用描述鼠标事件. 在QT中,鼠标事件包含:鼠标按键按下,鼠标按键释放,鼠标双击事件,鼠标移动事件. ...

  4. 鼠标事件:QMouseEvent

    #include<QMouseEvent> 鼠标无论是点击,移动,双击,松开都由鼠标的左右键区别而有区别,所以,严谨的来使用就是如mousePressEvent一样来通过按下的键来区别对待 ...

  5. 【Qt教程】3.1 - Qt5 event事件、Label控件的鼠标事件捕获

    1. event简介 事件(event)是由系统或者Qt本身在不同的时刻发出的.当用户按下鼠标.敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件.一些事件在对用户操作做出响应时发出,如键 ...

  6. QT mouseMoveEvent事件(qmainwindow内追踪鼠标事件事件)

    最近用Qt软件界面,需要用到mouseMoveEvent,研究了下,发现些问题,分享一下. 在Qt中要捕捉鼠标移动事件需要重写MouseMoveEvent,但是MouseMoveEvent为了不太耗资 ...

  7. [css] 鼠标事件css的:hover和js的mouseover有什么区别?

    [css] 鼠标事件css的:hover和js的mouseover有什么区别? JavaScript中鼠标事件有:onmouseover和onmouseout: 当鼠标移入和移出时触发事件onmous ...

  8. 2、Qt Project之鼠标事件监控

    鼠标事件监控: 对于鼠标时间监控的相关操作,我们在简历工程的时候需要选择的是QWidget基类,不选择QMainWindow基类,如下所示: Base class:QWidget Step1:我们首先 ...

  9. linux下arm架构中,触摸屏下没有鼠标事件,采用qtouchevent事件来代替,左右滑动显示完文本

    有个这样的需求,我打算用qlabel显示文本,但是发现文本太长之后,显示不全,或者显示不完,最后就有2个方法: 第一就是滚屏显示,整个文本滚屏完成,再重新从左边开始滚屏. 第二就是鼠标实现一个自定义基 ...

最新文章

  1. TVM开发三个示例分析
  2. 第3关:4位快速加法器设计
  3. Hash+哈希表+HashMap+HashSet
  4. 辛巴巴巴鲁比啦音乐计算机版,辛巴巴巴鲁给啦是什么歌 辛巴巴巴鲁比啦歌曲介绍...
  5. AngularJs angular.bind、angular.bootstrap、angular.copy
  6. tx2 刷机, cudnn安装失败,手动安装
  7. .net Core使用RabbitMQ
  8. 282.给表达式添加运算符
  9. 【java】超市购物小程序
  10. 百数巡检领域系统能力展示
  11. 两台笔记本之间投屏扩展/投影到此电脑的选项是灰色教程
  12. 用react-custom-scrollbars插件美化 Ant Design Table 滚动条
  13. 深光标准技术:谷歌GMS认证是什么?谷歌AER认证是什么?GMS认证的费用跟周期是多少??
  14. ElasticSearch 一文读懂
  15. 计算机打字测速,电脑的打字测速软件分享
  16. 那周余嘉熊掌将得队对男上加男,强人所男、修!咻咻! 团队的Beta产品测试报告...
  17. 数仓4.0(三)------数据仓库系统(续)
  18. Vue SPA项目SEO优化之预渲染Prerender-spa-plugin
  19. vue3+ant design vue 动态加载Icon图标
  20. Adobe国际认证|面向大学生和青少年的数字安全提示

热门文章

  1. boost::sort模块实现使用最坏情况分布进行扩展排序的排序示例
  2. boost::io::ostream_put用法的测试程序
  3. boost::geometry::centroid用法的测试程序
  4. GDCM:gdcm::IconImageGenerator的测试程序
  5. ITK:处理矢量图像的N个分量
  6. VTK:可视化算法之CutWithCutFunction
  7. VTK:绘图之SurfacePlot
  8. 嵌入式Linux的Qt
  9. OpenGL normalviewer普通视图的实例
  10. C++演示std :: sort(),std :: reverse()的函数(附完整源码)