原文:http://blog.csdn.net/michealtx/article/details/6866094html
初学Qt,用了Qt自带的事件,而后想怎么才能定义本身的事件呢?又如何使用自定义事件呢?看了篇文章,说先要子类化QEvent,而后定义本身的QEvent::Type,而后重写QWidget::event()函数,而后就能够调用QCoreApplication::sendEvent()或者QCoreApplication:;postEvent()发送事件就行了。但我比较笨,仍是云山雾罩,不知道怎么下手。java
怎么子类化QEvent?在哪里定义本身的QEvent::Type?在哪里重写QWidget::event()函数?在哪里调用QCoreApplication::sendEvent()或者QCoreApplication:;postEvent()发送事件?函数
在百度里搜索开了篇文章对我有启发http://bluemask.net/p/1215/ ,在google中搜索how to subclass QEvent也搜到一篇对我有启发的http://www.java2s.com/Code/Cpp/Qt/SubclassQEvent.htm 。(google的英文搜索真不错!)post
后来我就想,那Qt的发明人是怎么定义事件的呢?其实站在Qt发明人的角度,QEvent就是他们的“自定义事件”!Ok!这就好办了!看看Qt发明人怎么定义的QEvent,看看他们怎么用本身定义的QEvent,不就回答了文章开头的俩问题了嘛!O(∩_∩)O~ui
我把整个过程总结为“长官定义事件”----->“信使传递事件”---->“军队接收并响应事件”。google
我经过Qt Assistant查找那些与事件相关的类,总结以下:spa
QEvent的任务就是定义一些事件类型Type,它们都定义在了一个enum里。这就是教程中告诉咱们的要子类化QEvent,派生出MyEvent,而后在MyEvent中定义事件类型QEvent::Type。.net
咱们子类化的时候模仿一个QEvent就行了,并且是继承,好些都不用子类作了,看一下QEvent类中的成员变量和成员函数,就这些东西:htm
好了,咱们经过子类化QEvent,把派生出来的MyEvent看作长官,它定义了具体某个事件。下面看谁是信使。blog
咱们看看QCoreApplication中定义的一些函数,这些函数就是咱们常常遇到的那些与传递事件和过滤事件有关的函数,见下图:
Public Functions:
因此,到这里咱们就能够明确了,你要用QCoreApplication的static public类型的函数入sendEvent或postEvent函数来传递送信,要注意:当使用sendEvent时,你的事件要在栈上创建,sendEvent会直接调用notify把事件传递给士兵,不走事件队列;而用postEvent时,你的事件要在堆上创建,即要用new来建立,postEvent会把你的事件追加进事件队列(详细过程请看http://blog.csdn.net/michealtx/article/details/6865891)。你还能够经过重载notify来影响送信过程。
咱们看看QWidget中与事件有关的成员:
看到了吗?这些就是event handler,即事件处理函数,这是干活的那帮人。里面有咱们熟悉的mousePressEvent()、keyPressEvent()等经常使用的事件处理函数,它们都是protected virtual 类型的,能够重载。因此呀,咱们能够子类化QWidget,从而继承获得好些个event handler,固然也能够本身定义event handler!至关于本身创造士兵来响应事件。经过山寨QWidget,就能够创造本身的军队!
还有一点就是,当事件到达军队的时候,要先审查再分发,审查就是要通过事件过滤,分发就是经过对通过审查的事件进行判断再把它分给那个相应的士兵这就又涉及到一个类QObject,这是Qt的万类之母,这个类中有两个函数一个是eventFilter(),另外一个是event()。要先子类化QObject来建立一个监控者,这个监控者重载eventFilter(),来为军队过滤事件。而后还要在军队(QWidget)经过调用installEventFilter ( QObject * filterObj )来安装过滤器,参数中的filterOb即为监控者。最后在军队(QWidget)中重载event()来分发事件,把事件分给对应会干这个活的士兵(event handler)。
好了,我理解的大致过程就是这样,我是Qt新手,可能有错的地方,但愿路过的大牛能给与指正,我将不胜感激!
什么话也不如来个例程给力!:
我创建的是Qt Console Application,工程叫MyEvent,下面是main.cpp中的代码:
运行结果: