详解关于Qt中Event事件处理流程

移动开发 iOS
Qt中Event处理流程是本文要介绍的内容,主要是来了解Event事件的处理。在Qt/Embedded中,鼠标事件来自于触摸屏设备。

QtEvent处理流程是本文要介绍的内容,主要是来了解Event事件的处理。在Qt/Embedded中,鼠标事件来自于触摸屏设备。在使用select读取触摸屏设备中的数据后(即采样,压力达到一定阈值),处理些采样点后得到一个物理设备坐标点,然后用QCoreApplication的sendEvent活postEvent将其发送出去,于是Event的处理流程就开始了。

首先,QCoreApplication::notify将event直接传递给接受者。重新实现它,可以截取系统所有需要处理的事件。

其次,在使用notify通知接受者处理后,可以为application的实例qApp安装一个event filter,它将处理应用程序范围内的事件。

第三,event在经过application的处理后,到达QObject的event filter列表,为接收者者们安装event filter,将只处理发给自己的各个事件。

第四,在经过上述处理后,event到达QObject的event函数。该函数处理发送给自己的event,如QWidget中它按照event类型分发给自己的各个event Handler,如MouseReleaseEvent,KeyPressEvent等。

***,是处理不同类型event的event handler。这也是经常使用的,它只处理自己的event。 

过程如下:

  1. bool QCoreApplication::notify (   
  2. QObject   
  3. * receiver, QEvent   
  4. * event   
  5. )  
  6. ->qApp  
  7. 的  
  8. event filters->object  
  9. 的  
  10. event filter->object  
  11. 的event()  
  12. 函数->object  
  13. 的各  
  14. event handler  
  15.  

在以上处理过程中,返回true表示中止事件的处理,返回false则继续。

父子窗体传递关系:

对于构成parent-child关系的QWidget,事件将首先传递给child,在子窗体做出ignore后将继续传递给父窗体,若是accept,将终止传
递。若我们想截获发给父窗体容器中的各个子(孙)窗体的event,可以使用QObject::findChildren查找出child列表,为其安装event filter。比如自己重载eventfilter函数,然后安装它就行了。当然,也可以在继承的子类的event handler中ignore后让父窗体继续处理,但这不是截获。
 
注意:根据Qt文档,安装的event filter不支持另外一个线程中执行的object。

应用实例:
 
FileBrowser中包含有多个QPushButton和一个QFrame,QFrame包含一个QStackedWidget,后者包含一个QListView和一个QTreeView两个widget(它们是)。Filebrowser实现了eventFilter,并在FileBrowser的构造函数中安装它们:   

  1. this->installEventFilter(this);  
  2. listView->installEventFilter(this);//not work,why?  
  3. treeView->installEventFilter(this);//not work,why?  
  4. QList<QPushButton*> allButtons = this->findChildren<QPushButton *>();  
  5. foreach(QPushButton* button, allButtons)  
  6.  button->installEventFilter(this);  

运行结果如下:

  1. obj name1:FileBrowserListView, type: 8  
  2. event filter: pid=6273 tid=-1208457520  
  3. ListView::mouseReleaseEvent: pid=6273 tid=-1208457520 

问题:

前两行为eventfilter中的输出结果:表示截取到了发往ListView的事件(类型为8,FocusIn事件)。而第三行则是listView的event handler的输出,它能够处理mouse、release事件,但event filter并未捕获到它,但可以捕获到焦点的得失事件。输出的线程号也是相同的。

为什么event filter不能捕获两个view上的鼠标点击事件,但可以获取其它事件如FocusIn与FocusOut呢?

其中输出log的代码是:

  1. #include<unistd.h>   
  2. //#include<sys/types.h> 
  3. #include <pthread.h> 
  4. ...  
  5.  fprintf(stderr, "ListView::mouseReleaseEvent: pid=%d tid=%d\n",::getpid(), (unsigned int)::pthread_self()/*::gettid()*/); 

小结:详解关于QtEvent处理流程的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-07-04 14:50:49

QT Event 事件

2011-06-23 14:05:32

Qt 事件机制

2011-06-29 16:14:59

Qt 事件 过滤器

2010-08-09 11:14:36

Flex事件处理

2011-07-01 14:20:59

Qt 事件

2011-07-01 14:14:34

Qt 事件

2021-02-06 10:27:45

C#函数参数

2015-11-06 13:59:01

JavaScript事件处理

2011-08-29 11:25:29

QTWebKit鼠标

2011-06-28 13:38:15

Arm linux QT

2011-08-23 17:06:03

2010-10-09 10:30:03

JS event

2011-08-22 10:49:42

Cocos2d 开发CCLayerTouch事件

2011-07-04 14:38:43

QT Qevent

2017-01-11 18:44:43

React Nativ触摸事件Android

2011-06-14 11:48:38

Webkit QT

2010-01-05 10:29:43

.NET Framew

2009-10-27 11:39:03

VB.NET事件处理程

2023-02-26 10:59:51

2023-02-19 12:44:07

领域事件DDD
点赞
收藏

51CTO技术栈公众号