某对象在发送一个事件的时候,使用sendEvent()或者postEvent()函数进行事件的发送操作。查看发送事件的两个函数源代码:
//sendEvent()
inline bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event){
if (event) event->spont = false; return self ? self->notifyInternal(receiver, event) : false;
}//事件要在栈上分配,不走事件队列,只支持同步操作
其中notifyInternal(receiver, event)调用notify(receiver, event)调用notify_helper(receiver, event){
if (sendThroughApplicationEventFilters(receiver, event)) return true;if (sendThroughObjectEventFilters(receiver, event)) return true;return receiver->event(event);//这就是我们需要处理的事件}
//postEvent()
void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority){if (receiver == 0) {qWarning("QCoreApplication::postEvent: Unexpected null receiver");delete event;return;}
QThreadData * volatile * pdata = &receiver->d_func()->threadData;QThreadData *data = *pdata;if (!data) {delete event;return;}
data->postEventList.mutex.lock();
QMutexUnlocker locker(&data->postEventList.mutex);if (receiver->d_func()->postedEvents&& self && self->compressEvent(event, receiver, &data->postEventList)) {return;}
if (event->type() == QEvent::DeferredDelete && data == QThreadData::current()) {static_cast<QDeferredDeleteEvent *>(event)->level = data->loopLevel;}
QScopedPointer<QEvent> eventDeleter(event);data->postEventList.addEvent(QPostEvent(receiver, event, priority));eventDeleter.take();
event->posted = true;++receiver->d_func()->postedEvents;
data->canWait = false;locker.unlock();
QAbstractEventDispatcher* dispatcher = data->eventDispatcher.loadAcquire();if (dispatcher)dispatcher->wakeUp();}//由此可以看出,事件要在堆上分配,用接收端线程事件队列postEventList进行维护,立即返回,支持异步操作;引用原文:When control returns to mainevent loop , all events that are storeed in the queue will be sent using the notify(receive, event) funcation