最近在重新学习Qt的时候,因为要涉及到子线程与主线程传递消息,所以便琢磨了一下,顺便把实用的记录下来,方便自己以后查询及各位同仁的参考!
特此声明,本篇博文主要讲述实用的,也就是直接说明怎么实现,就不打算陈述一大堆理论啦,不过,还是建议大家去查查相应的理论比较好,这样能对Qt的消息传送机制的理解更加深入!
根据网上大多数人的资料,要实现自定义消息,需要从QEvent 派生一个自定义的事件;其实也可以不需要,只要使用QEvent::Type自定义一个事件就行了。在这里,本人把两种实现方法都在这里讲述一下!
一、这里先讲述使用 QEvent::Type 定义一个自定义事件
1、新建一个新的工程 “myEvent” ,在 ui 界面添加一个按钮,并未按钮添加 onclick() 响应函数。
2、在 widget.h 头文件使用 QEvent::Type 定义两个自定义事件。
3、重新实现 event() 虚函数
bool event(QEvent* e);
4、添加 #include<QEvent>
整个头文件如下:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QEvent>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
bool event(QEvent* e);
private slots:
void on_pushButton_clicked();
private:
Ui::Widget *ui;
QEvent::Type myEvent1;
QEvent::Type myEvent2;
};
#endif // WIDGET_H
5、使用QEvent::registerEventType() 静态函数为刚才两个自定义事件注册值。
6、重新实现 event() 函数 。
7、在 按钮响应函数里面发送时间消息。
widget.cpp 文件如下:
#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QCoreApplication>
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
myEvent1 = static_cast<QEvent::Type>(QEvent::registerEventType(-1));
myEvent2 = static_cast<QEvent::Type>(QEvent::registerEventType(-1));
}
Widget::~Wi