Qt自定义事件

先看下官方的文档:(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

你可能感兴趣的:(自定义)