第六章 事件系统

2019-9-12

  1. 事件
一个事件会有多个事件类型
处理事件的方法:
1)重新实现事件处理函数,只能用来处理特定部件的特定事件
2)重新实现notify函数,一次只能处理一个事件
3)向QApplication安对象装事件过滤器,可以同时处理多个事件
4)重新实现event函数
5)在对象上安装事件过滤器
事件传递:
exec函数使应用程序进入事件循环->QEvent子类表示->传递给QObject对象或其子对象

这里采用第一种事件处理方法
事件是先传递给指定窗口部件、如果忽略,就会传递给其父部件
QLineEdit::keyPressEvent(event);          // 执行QLineEdit类的默认事件处理
//一般都是调用父类的相应事件处理函数来实现默认操作
event->ignore();                          // 忽略该事件
事件过滤器:
eventFilter(QObject *obj, QEvent *event) // 事件过滤器
obj是被监视的事件,安装了事件过滤器之后,就能对指定的事件进行自己想要的处理,返回true的
话,就可以使一个对象不响应某个事件
lineEdit->installEventFilter(this);   // 在Widget上为lineEdit安装事件过滤器
这样我们就将事件过滤器安装到了this之上,以后在this上发生的事件都会经过eventFilter过滤
在本部件上监视lineEdit部件
事件过滤器,焦点部件的event函数,焦点部件的事件处理函数,父部件的事件处理函数
  1. 鼠标事件和滚轮事件
event->globalPos():是鼠标指针在桌面上的位置
pos():窗口在桌面上的位置,窗口不动的时候,即使鼠标动,它的值也是一样的
  1. 键盘事件
if(event->modifiers() == Qt::ControlModifier)  // 是否按下Ctrl键
if(event->key() == Qt::Key_M)              // 是否按下M键
按键的自动重复就是说这个按键在一直被按下,我们需要避免这种情况
我们这里可以捕捉到最后一次按下!
  1. 定时器事件与随机数

  2. 事件过滤器和事件发送

事件过滤器可以方便的处理多个部件的多个事件,如果不用它的话,还要子类化不同的部件,
重新实现它们对应的各个事件处理函数。
还提供了发送事件的功能。
发布了179 篇原创文章 · 获赞 79 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_34600424/article/details/100770885