qt允许创建自定义的事件,这在多线程中尤其有用。
为什么使用事件而不是信号槽?主要原因是,事件分发既可以同步,也可以异步,且事件可以使用事件过滤器而函数的调用或者说槽的回调只能是同步的
qt中自定义事件就是继承一个类进行扩展。这里要继承的类是QEvent,继承QEvent时要提供一个QEvent::type类型的参数,作为自定义事件的类型值。这里的QEvent::type是QEvent里的enum值。可以传递一个int值。重要的是你的事件类型不能和已经存在的type值重复,否则会有错误发生,因为系统把你定义的事件当作系统事件进行分发和调用。QT中,系统保留0-999的值,自定义的事件的type要在QEvent::User(1000)和QEvent::User(65535)之间。这只能保证自定义事件不覆盖系统事件,而不能保证自定义事件之间不覆盖。为解决这个问题,qt提供 registerEventType()来用于自定义事件的注册。这个函数是static,可以通过QEvent直接调用它
事件的发送:qt中提供2中方式:
QCoreApplication::sendEvent()and QCoreApplication::postEvent()(spontaneous() returns false)(自定义事件),窗口系统事件:spontaneous() returns true,即应用程序之外的事件
如果要处理自定义的函数,重写 QObject::customEvent()函数