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

1. event简介

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

当事件发生时,Qt将创建一个事件对象。Qt中所有的事件类都继承于QEvent。在事件对象创建完毕后,Qt将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)

 

帮助手册,搜索QEvent。查看Type。

 

这里面包含许多事件,我们以鼠标的事件为例,鼠标事件全部继承于QMouseEvent类。

 

再去找enterEvent,类型为虚函数,所以可以被重写,来实现事件的回调处理。

 

2. Event示例 - enterEvent、leaveEvent

  • GitHub源码仓库:QT学习例程
  • 示例:新建一个label,鼠标进入/退出会触发事件,用户对捕获的事件进行打印处理。

新建widget工程。拖入Label控件。

 

为方便观察,添加上边框,右下角属性,QFrame,frameShape,选择Box。

 

因为我们要对原有的Label功能做一些改动,添加事件处理,属于自定义控件。

但由于这个控件的外观没什么变化,所以不需要重新创建控件,只需创建类。

 

添加自定义控件:

工程 , Add New... , C++ , C++ Class,填入控件名称myLabel,基类选择QWidget,下一步,完成。

之后就完成了新建一个类,多出了myLabel.c与myLabel.h。

对 [virtual protected] void QWidget::enterEvent(QEvent *event)进行重写。

.h文件中声明函数名称,.cpp文件中实现函数。virtual可加可不加,.h中不要有作用域。

 

自定义控件由于创建的时候继承的是QWidget,而我们调用的控件为Label。所以将继承的父类修改为为 QLabel。

 

回到UI,选择刚刚拖入的Label控件,右键,提升为,myLabel,添加,提升。

  • 运行,实验现象:

 

3. 其他鼠标事件 - 移动mouseMoveEvent

除此之外,Label中还有很多事件可以重写:红框框中的是Label中鼠标的事件。

 

重写后,实验现象:(注意:移动必须要在鼠标按下时才能触发,可以通过更改属性修改为放置就会触发)

 

4. 其他鼠标事件 - 获取鼠标坐标位置

如果我们要获取鼠标的xy坐标:对应这几个参数。

x/y():鼠标相对于控件的坐标像素。

globalX/globalY():鼠标相对于整个屏幕的坐标像素。

 

打印鼠标坐标:

  • Qt的格式化字符串:

QString str = QString("鼠标按下了 x=%1 y=%2").arg(ev->x()).arg(ev->y());

 

5. 其他鼠标事件 - 限定鼠标左键触发/无条件触发

以上的显示鼠标移动,左键可以触发,右键、中键同样也可以触发。如果只想获取左键按下事件,需要对event的鼠标输入参数 QMouseEvent进行选择。

Qt::MouseButton的枚举值

 

如果想限定鼠标左键按下,需要限定事件,由 ev->button() 改为 ev->buttons(),并且事件要 &而不是 ==

 

由于鼠标移动事件是默认需要鼠标按下的。如需要不按下,通过代码在构造函数中设置鼠标追踪属性。

setMouseTracking(true);

 

GitHub源码仓库:QT学习例程​​​​​​​

视频P31,这节内容比较多有些杂。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值