先看下官方的文档:(google translation)
QCoreApplication::postEvent:添加事件的事件,作为事件接收对象,接收器,一个事件队列并立即返回。事件必须在堆上分配的,因为后事件队列将事件的所有权和删除已发布一次。它是不是安全的访问后,它已发布的事件。当控制权返回到主事件循环,使用notify()函数,存储在队列中的所有事件将被发送。事件是在发布的顺序处理。对于更多的处理顺序控制,使用postEvent()重载下面的,这需要一个优先级参数。此功能的所有文章与一个Qt事件:NormalEventPriority。
QCoreApplication::sendEvent :直接发送事件的事件接收器接收,使用notify()函数。返回的是从事件处理程序返回的值。已发送事件时,该事件不会被删除。正常的做法是在栈上创建的事件
总结:
postEvent:由Qt或应用程序产生,放入消息队列,其event 必须分配在 heep 上。用完后会被Qt自动删除
sendEvent:由Qt或应用程序产生,不放入队列,直接被派发和处理,其event 必须分配在 stack 上。
重绘事件处理函数 paintEvent(), 当我们调用 update() 时,产生的是 Posted 事件,当我们调用 repaint() 时,产生的是 Sent 事件
customevent.h
#ifndef CUSTOMEVENT_H
#define CUSTOMEVENT_H
#include <QtGui/QWidget>
#include <QtCore/QEvent>
#include "ui_customevent.h"
enum MyEvent{
TESTEVENT1 = QEvent::User,
TESTEVENT2
};
class customEvent : public QWidget
{
Q_OBJECT
public:
customEvent(QWidget *parent = 0, Qt::WFlags flags = 0);
~customEvent();
private:
Ui::customEventClass ui;
};
#endif // CUSTOMEVENT_H
customevent.cpp
#include "customevent.h"
#include "getEvent.h"
customEvent::customEvent(QWidget *parent, Qt::WFlags flags)
: QWidget(parent, flags)
{
ui.setupUi(this);
QEvent *event1 = new QEvent(static_cast<QEvent::Type>(TESTEVENT1));
QEvent *event2 = new QEvent(static_cast<QEvent::Type>(TESTEVENT2));
getEvent *get = new getEvent;
QApplication::postEvent(get,event1);
QApplication::sendEvent(get,event2);
}
customEvent::~customEvent()
{
}
getEvent.h
#ifdef GETEVENT_H
#endif GETEVENT_H
#include <QObject>
#include <QEvent>
#include <QDebug>
#include "customevent.h"
class customEvent;
class getEvent:public QObject{
public:
getEvent(){}
~getEvent(){}
bool event(QEvent *e){
switch (e->type())
{
case TESTEVENT1:
qDebug() << "get the test event1";
break;
case TESTEVENT2:
qDebug() << "get the test event2";
break;
default:
break;
}
return true;
}
};
get the test event2
get the test event1