Qt事件系统之二:鼠标事件和滚轮事件
一、 QMouseEvent的详细描述
QMouseEvent 类用来表示一个鼠标事件,当在窗口部件中按下鼠标、释放鼠标和移动鼠标指针时,都会产生鼠标事件 QMouseEvent。利用 QMouseEvent 类可以获知鼠标是哪个键按下释放了、鼠标指针的当前位置等信息。通常是重定义窗口部件的鼠标事件处理函数来进行一些自定义的操作。
- Qt中的QMouseEvent一般只涉及按下鼠标、释放鼠标和移动鼠标指针等操作,而对鼠标滚轮的响应则通过QWheeEvent来处理。
- 鼠标移动事件只会在按下鼠标按键的情况下才会发生,除非通过显式调用。
- QWidget::setMouseTracking()函数来开启鼠标轨迹,这种情况下只要鼠标指针在移动,就会产生一系列的Qt鼠标事件。
二、 QMouseEvent的传递
多个重叠的窗口在实现里好比一个递归的倒立树,鼠标事件会沿着鼠标指针所在的父窗口的链表向上传递,直到某个窗口调用accept()函数进行事件处理,否则该事件将被过滤销毁掉。
- 如果想要鼠标指针所在的父窗口不接收该事件,则可以调用函数ignore()予以忽略。
- 如果一个鼠标事件传递给鼠标指针所在的窗口,而该窗口的QT::WA_NoMousePropagation位置为TRUE,则该事件不会通过父窗口继续向上传递。
- 可以使用QWidget::setEnabled()来开启/关闭对应的窗口是否接受键盘和鼠标事件。
三、鼠标事件实例
鼠标事件使用的时候,加头文件:
#include <QMouseEvent>
3.1 鼠标按下事件 mousePressEvent()
mousePressEvent() 函数可以区分出鼠标按下时是左键还是右键,以及获取鼠标按下时的坐标值等。
所以我们可以在头文件中重写这个函数:
protected:
//鼠标按下事件
void mousePressEvent(QMouseEvent * event);
然后就是在源文件中去实现具体的逻辑了:
//鼠标按下事件
void MainWindow::mousePressEvent(QMouseEvent * event)
{
if(event->button() == Qt::LeftButton)
{
qDebug() << "左键按下" ;
}
else if(event->button() == Qt::RightButton)
{
qDebug() << "右键按下" ;
}
//获取按下时的鼠标指针坐标
qDebug() << event->x() << ":" << event->y();
}
这样我们就能知道你按下时是左键还是右键,以及获取你按下时的鼠标指针坐标。运行程序,在窗口左键点击一下,右键点击一下,输出如下所示:
15:49:08: Starting F:\Project\C++ Project\Qt\build-myMouseEvent-Desktop_Qt_5_9_7_MinGW_32bit-Debug\debug\myMouseEvent...
左键按下
press: 96 75
右键按下
press: 249 159
3.2 鼠标释放事件 mouseReleaseEvent()
mousePressEvent() 函数可以区分出鼠标释放时是左键还是右键,以及获取鼠标释放时的坐标值等。
所以我们可以在头文件中重写这个函数:
//鼠标释放事件
void mouseReleaseEvent(QMouseEvent *event);
然后就是在源文件中去实现具体的逻辑了:
//鼠标释放事件
void myMouseEvent::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
qDebug() << "左键释放" ;
}
else if(event->button() == Qt::RightButton)
{
qDebug() << "右键释放" ;
}
//获取释放时的鼠标指针坐标
qDebug() << "release:" << event->x() << " " << event->y();
}
这样我们就能知道你释放时是左键还是右键,以及获取你释放时的鼠标指针坐标。运行程序,在窗口左键按下鼠标移动一些距离再释放,右键同理,输出如下所示:
15:50:05: Starting F:\Project\C++ Project\Qt\build-myMouseEvent-Desktop_Qt_5_9_7_MinGW_32bit-Debug\debug\myMouseEvent...
左键释放
release: 100 98
右键释放
release: 257 206
3.3 鼠标移动事件 mouseMoveEvent()
mouseMoveEvent() 函数默认情况下,触发事件需要点击一下,才能触发。可设置为自动触发:setMouseTracking(true)。
所以我们可以在头文件中重写这个函数:
//鼠标移动事件
void mouseMoveEvent(QMouseEvent *event);
然后就是在源文件中去实现具体的逻辑了:
//鼠标移动事件
void myMouseEvent::mouseMoveEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
qDebug() << "左键移动" ;
}
else if(event->button() == Qt::RightButton)
{
qDebug() << "右键移动" ;
}
//获取移动过程中的鼠标指针坐标
qDebug() << "move:" << event->x() << " " << event->y();
}
该函数无法区分移动的是左键还是右键。运行程序,在窗口左键移动鼠标,输出如下所示:
16:07:31: Starting F:\Project\C++ Project\Qt\build-myMouseEvent-Desktop_Qt_5_9_7_MinGW_32bit-Debug\debug\myMouseEvent...
move: 75 81
move: 76 81
move: 77 81
move: 78 81
move: 79 81
还有一个鼠标双击事件 mouseDoubleClickEvent() ,与鼠标按下事件大同小异,这里就不再详细讲解了。
四、QMouseEvent常用成员函数
4.1 globalPos()、globalX()、globalY()
const QPoint & QMouseEvent::globalPos () const
返回鼠标指针的全局坐标值(类型为QPoint),即相对于PC屏幕的坐标值,而不是相对于当前打开窗口。
int QMouseEvent::globalX () const
返回鼠标事件发生时鼠标指针全局坐标的X值。
int QMouseEvent::globalY () const
返回鼠标事件发生时鼠标指针全局坐标的Y值。
4.2 pos()、posF()、x()、y()
const QPoint & QMouseEvent::pos () const
返回鼠标指针和接受该鼠标事件窗口的相对位置,其中的坐标值为整型。
QPointF QMouseEvent::posF () const
返回鼠标指针在接受该鼠标事件窗口的相对位置,该坐标值用float类型表示可以增加精确度。
int QMouseEvent::x () const
返回鼠标事件发生时,鼠标指针在当前接收鼠标事件的窗口中位置的x坐标值。
int QMouseEvent::y () const
返回鼠标事件发生时,鼠标指针在当前接收鼠标事件的窗口中位置的y坐标值。
五、QWheelEvent的详细描述
QWheelEvent 类用来表示鼠标滚轮事件,包含用于描述鼠标滑轮事件的相关参数。
头函数:#include<QWheelEvent>,继承至:QInputEvent。
函数原型:
QWheelEvent::QWheelEvent(const QPoint &pos, int delta, Qt::MouseButtons buttons,Qt::KeyboardModifiers modifiers, Qt::Orientation orient = Qt::Vertical )
功能与参数:
/*** 创建一个wheelEvent对象, ***/
(1)参数pos代表鼠标指针在窗口中的当前位置,通常用globalPos()初始化QCursor::pos(),但并不总是正确的。如果需要显示指定一个全局位置,可以用其他的构造函数;
(2)参数button用于描述在鼠标事件过程中鼠标按键的状态(state);
(3)delta()可以返回滑动的距离,正数值表示滑轮相对于用户在向前滑动,相反,负数值表示滑轮相对于用户是向后滑动的。;
(4)参数modifiers用于描述在鼠标事件中鼠标状态位改变时的参数值(比如鼠标的左中右按键的切换);
(5)参数orient用于指示鼠标滑轮滚动的方向(水平或者垂直)。
六、滚轮事件实例
//滚轮事件
void myMouseEvent::wheelEvent(QWheelEvent *event)
{
if(event->delta() > 0) //当滚轮向上滑,远离使用者
{
ui->textEdit->zoomIn(); //进行放大,textEdit的光标和字体都放大
}
else //当滚轮向下滑,靠近使用者
{
ui->textEdit->zoomOut(); //进行缩小,textEdit的光标和字体都缩小
}
}
用户向上滑动鼠标,则放大;而向下滑动鼠标,则缩小。
参考:
Qt事件系统之二:鼠标事件和滚轮事件的更多相关文章
- JavaScript焦点事件、鼠标事件和滚轮事件使用详解
网址:http://www.jb51.net/article/78094.htm
- 鼠标滚轮事件MouseWheel
其实在大多数浏览器(IE6, IE7, IE8, Opera 10+, Safari 5+,Chrome)中,都提供了 "mousewheel" 事件.但杯具的是 Firefox ...
- Javascript鼠标和滚轮事件
(转自:http://www.cnblogs.com/MrBackKom/archive/2012/06/25/2562920.html) a)鼠标事件 鼠标事件也许是web页面当中最常用到的事件,因 ...
- Qt事件机制---信号通过事件实现,事件可以过滤,事件更底层,事件是基础,信号是扩展。
转:http://www.cnblogs.com/findumars/p/8001484.html Qt事件机制(是动作发生后,一种通知对象的消息,是被动与主动的总和.先处理自己队列中的消息,然后再处 ...
- JS滚轮事件onmousewheel
典型的应用时鼠标滚轮滚动控制图片或者文字的大小,例如此类的转动鼠标滚轮实现缩放等等交互效果中,会用到 Mousewheel 事件.在大多数浏览器(IE6, IE7, IE8, Opera 10+, S ...
- Qt编程之通过鼠标滚轮事件缩放QGraphicsView里面的Item
首先自己subclass QGraphicsView的一个类,叫DiagramView,然后重新实现它的滚轮事件函数,然后发送一个缩放信号: oid DiagramView::wheelEvent(Q ...
- Qt中隐藏滚动条重新实现鼠标滚轮事件wheelEvent
delta()已经被弃用了,QT5中用的是angleDelta(),计算的时候取angleDelta().y()值. #重载方法wheelEvent(self,event),即滚轮事件方法 #---- ...
- JS鼠标滚轮事件解析
一.不同浏览器的鼠标滚轮事件 首先,不同的浏览器有不同的滚轮事件.主要是有两种,onmousewheel(IE/Opera/Chrome支持,firefox不支持)和DOMMouseScroll(只有 ...
- js中的鼠标滚轮事件
## 事件对象 event 1 event事件对象,表示用来获取事件的详细信息,比如得到鼠标的横坐标:事件对象.clientX(clientX是可视区坐标) window.onclick = func ...
随机推荐
- 【转载】Unix设计哲学 & 回车换行八卦 & EOF八卦 & UNIX目录结构八卦
昨天看了这篇文章 <关于Unix哲学> 首先用了两个例子,用风扇吹出空肥皂盒 和 太空铅笔,来说明简单设计也能派上作用吧. Unix哲学,Wikipedia上列出了好几个版本,不同的人有不 ...
- mysql中“Table ‘’ is read only”的解决办法
之前是在linux下面直接Copy的data下面整个数据库文件夹,在phpMyAdmin里面重新赋予新用户相应权限后,drupal成功连接上数据库.但出现N多行错误提示,都是跟Cache相关的表是‘R ...
- Android Service 不被杀死并提高优先级
Android Service 不被杀死有两种思路,一种是将APP设置为系统应用.还有一种是增强service的生命力.即使屏幕背光关闭时也能执行. 因为设置为系统应用须要root.所以一般使用后一种 ...
- (原创)EasyUI中datagrid的行编辑模式中,找到特定的Editor,并为其添加事件
有时候在行编辑的时候,一个编辑框的值要根据其它编辑框的值进行变化,那么可以通过在开启编辑时,找到特定的Editor,为其添加事件 // 绑定事件, index为当前编辑行 var editors = ...
- IOS开发之----常用的基本GDB命令【转】
原文地址:http://blog.sina.com.cn/s/blog_71715bf801016d2y.html gdb不是万能的,可是没有gdb却是万万不能的.这里给大家简单介绍下iOS开发中最基 ...
- python itertools
1 product 1.1 一个generator函数 因此它的返回值是一个iterator,可以用for遍历. 1.2 计算product的参数分类 1.2.1 dict和list 只用了dict的 ...
- envoy
微服务意味着网络更加依赖于服务抽象边界. 随着相互依赖的服务数量日渐增长,系统100%没问题的时间会变少,整个系统经常有部分功能处于降级状态.
- 鉴权应用服务器 app客户端 web服务端 安全令牌(SecurityToken)、临时访问密钥(AccessKeyId, AccessKeySecret)
设置EndPoint和凭证 移动终端是一个不受信任的环境,把AccessKeyId和AccessKeySecret直接保存在终端用来加签请求,存在极高的风险.建议只在测试时使用明文设置模式,业务应用推 ...
- 原创教程之——reactjs 组件入门教程
在学习react之前,希望你有以下准备: react的安装ECMAScript 6基础 本文不讲解react的安装步骤,若需了解请移步官方网站(https://reactjs.org/),那里讲解非常 ...
- mysql04--存储过程
过程:若干语句,调用时执行封装的体.没有返回值的函数. 函数:是一个有返回值的过程 存储过程:把若干条sql封装起来,起个名字(过程),并存储在数据库中. 也有不存储的过程,匿名过程,用完就扔(mys ...