1.事件是怎么产生的
事件一般是由用户的动作作用于窗口系统,或者是Qt自身或者系统独立产生的。
2.事件和信号又有什么区别
事件和信号在初看的时候确实很容易混淆,但是这两者是不同的概念,
事件的产生者是窗口系统或者系统内部,但是信号的产生者一般是对象。
在普通的GUI编程中往往不需要考虑事件,在使用窗口部件的时候,我们用的是信号,而在实现窗口部件的时候往往一般要考虑事件。
同时事件是非阻塞的只要把事件交到事件队列中就可以继续事件后的代码段,但是信号往往是阻塞的,一般要等到程序从槽函数退出时候才能往下执行。
3.事件的整个工作机制:(怕麻烦也为了直观,就以一个图来描述了)
补充:主事件循环队列通过调用QCoreApplication::exec()启动,随着QCoreApplication::exit()结束。本地事件是通过QEventLoop创建。
4.事件的监控和过滤
一个对象可以通过调用被监控对象的QObject::installEVentFilter()来实现对某个对象的监控,以便可以对事件作出响应,监控对象的QObject ::EventFilter()会在受监控对象接收事件之前被调用。
同时可以通过事件过滤器来对事件进行过滤,这个过滤器可以安装在QApplication唯一实例中也可以安装在任意窗口部件中,系统会先调用前者的过滤器对应用程序的全部事件进行过滤,在通过调用其他窗口部件的过滤器对事件进行过滤。
重载QCoreApplication::notify()函数可以在事件处理器之前获得所有事件,但是因为一个应用程序只有一个notify函数,所以每次只能有一个子类被激活,实现上面的功能
这个也相当于在一个激活子类之前安装事件过滤器一样。
通过QCoreApplication::instance()在唯一的Application对象上安装事件过滤器,事件发送到其他事件过滤器之前都必须先发送到这个事件过滤器上。
重载QObject::event()函数,可以在事件到达特定事件处理器前处理Tab事件。
在特定的对象上安装事件过滤器当一个对象用intallEventFilter()注册之后,所有发送到该对象的事件都会经过监测它的事件过滤器,如果同时安装多个,这些安装的过滤器从最后安装的开始到第一个被安装的过滤器。