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

1. event简介

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

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

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

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

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

扫描二维码关注公众号,回复: 12161832 查看本文章

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,这节内容比较多有些杂。

猜你喜欢

转载自blog.csdn.net/Mark_md/article/details/108866006
Qt5