线程间通信:
1.自定义事件:postEvent();
2.信号与槽【本质也是通过自定义事件实现的】
注意:每个线程都有自己的事件循环
自定义事件:
1.从QEvent继承;
2.registerEventType(); //会返回全局唯一的事件类型
3.QCoreApplication::postEvent();//异步方式发送事件,Qt本身接管事件周期,在事件处理后就会销毁他,所以new了后不要delete!!!!注意了new了后可以不delete!!!
4.重写event方法;//接收的那一方重写event
线程间通信:
1.使用自定义事件在线程通信;
2.可携带自定义数据;
1.自定义事件:postEvent();
2.信号与槽【本质也是通过自定义事件实现的】
注意:每个线程都有自己的事件循环
1.从QEvent继承;
2.registerEventType(); //会返回全局唯一的事件类型
3.QCoreApplication::postEvent();//异步方式发送事件,Qt本身接管事件周期,在事件处理后就会销毁他,所以new了后不要delete!!!!注意了new了后可以不delete!!!
4.重写event方法;//接收的那一方重写event
线程间通信:
1.使用自定义事件在线程通信;
2.可携带自定义数据;
3.逻辑清晰不易混乱;
程序运行截图如下:
代码如下:
customevent.h
#ifndef CUSTOMEVENT_H
#define CUSTOMEVENT_H
#include <QEvent>
#include <QString>
class CustomEvent:public QEvent
{
public:
CustomEvent(const QString &msg);
static QEvent::Type evType();
static QEvent::Type m_eventType;
QString m_msg;
};
#endif // CUSTOMEVENT_H
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "customevent.h"
#include <QLabel>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
bool event(QEvent *e);
protected:
QLabel *m_label;
};
#endif // WIDGET_H
customevent.cpp
#include "customevent.h"
QEvent::Type CustomEvent::m_eventType=(QEvent::Type)registerEventType();
CustomEvent::CustomEvent(const QString &msg)
:QEvent(evType()),m_msg(msg)
{
}
QEvent::Type CustomEvent::evType(){
return m_eventType;
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
widget.cpp
#include "widget.h"
#include <QEvent>
#include <QTimer>
#include <QDateTime>
#include <QCoreApplication>
#include <QThread>
class SimpleThread:public QThread{
public:
SimpleThread(QObject *receiver):m_receiver(receiver){
}
void run(){
while(1){
QThread::msleep(1000);
CustomEvent *ce=new CustomEvent(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
QCoreApplication::postEvent(m_receiver,ce);
}
}
QObject *m_receiver;
};
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
m_label=new QLabel(this);
SimpleThread *t=new SimpleThread(this);
t->start();
}
Widget::~Widget()
{
}
bool Widget::event(QEvent *e)
{
if(e->type()==CustomEvent::evType()){
CustomEvent *ce=(CustomEvent*)e;
m_label->setText(ce->m_msg);
m_label->adjustSize();
e->accept();
return true;
}
return QWidget::event(e);
}