赞
踩
事件(event)是由系统或者Qt本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,如键盘事件等。另一些事件则是由系统自动发出,如计时器事件。
当事件发生时,Qt将创建一个事件对象。Qt中所有的事件类都继承于QEvent。在事件对象创建完毕后,Qt将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)
帮助手册,搜索QEvent。查看Type。
这里面包含许多事件,我们以鼠标的事件为例,鼠标事件全部继承于QMouseEvent类。
再去找enterEvent,类型为虚函数,所以可以被重写,来实现事件的回调处理。
- 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,添加,提升。
- 运行,实验现象:
除此之外,Label中还有很多事件可以重写:红框框中的是Label中鼠标的事件。
重写后,实验现象:(注意:移动必须要在鼠标按下时才能触发,可以通过更改属性修改为放置就会触发)
如果我们要获取鼠标的xy坐标:对应这几个参数。
x/y():鼠标相对于控件的坐标像素。
globalX/globalY():鼠标相对于整个屏幕的坐标像素。
打印鼠标坐标:
- Qt的格式化字符串:
QString str = QString("鼠标按下了 x=%1 y=%2").arg(ev->x()).arg(ev->y());
以上的显示鼠标移动,左键可以触发,右键、中键同样也可以触发。如果只想获取左键按下事件,需要对event的鼠标输入参数 QMouseEvent进行选择。
Qt::MouseButton的枚举值
如果想限定鼠标左键按下,需要限定事件,由 ev->button() 改为 ev->buttons(),并且事件要 &而不是 ==
由于鼠标移动事件是默认需要鼠标按下的。如需要不按下,通过代码在构造函数中设置鼠标追踪属性。
setMouseTracking(true);
GitHub源码仓库:QT学习例程
视频P31,这节内容比较多有些杂。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。