Qt线程间通信-自定义事件

线程间通信:
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);
}

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/81053919