线程给主窗口发事件(消息),传递字符串

#ifndef CUSTOMEVENT_H
#define CUSTOMEVENT_H

#include 
#include 

class CustomEvent : public QEvent // 自定义事件
{
public:
    CustomEvent(const QString & msg);

    static QEvent::Type m_eventType; // 此事件的类型
    static QEvent::Type evType(); // 返回事件的类型

    QString m_msg; // 事件内部包含字符串
};

#endif // CUSTOMEVENT_H

#include "CustomEvent.h"

QEvent::Type CustomEvent::m_eventType = (QEvent::Type)QEvent::registerEventType(); // 注册新的事件类型

CustomEvent::CustomEvent(const QString &msg)
    :QEvent(evType()), m_msg(msg)
{}

QEvent::Type CustomEvent::evType()
{
    return m_eventType;
}
#include "widget.h"
#include 
#include 
#include 
#include 
#include 

// 线程的定义与实现
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只主窗口的子控件
        m_label->adjustSize();
        e->accept(); // 消息到此为止,不要再继续传递了
        return true;
    }
    return QWidget::event(e); // 除了自定义消息,其它消息都让系统处理
}

参考:

https://www.yuque.com/docs/share/0ccc1671-fe98-4122-8ebf-7fc0ef7132f8

你可能感兴趣的:(QT,QT-事件,C++)