zoukankan      html  css  js  c++  java
  • 线程给主窗口发事件(消息),传递字符串

    代码来自安晓辉:

    #ifndef CUSTOMEVENT_H
    #define CUSTOMEVENT_H
    
    #include <QEvent>
    #include <QString>
    
    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 <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只主窗口的子控件
            m_label->adjustSize();
            e->accept(); // 消息到此为止,不要再继续传递了
            return true;
        }
        return QWidget::event(e); // 除了自定义消息,其它消息都让系统处理
    }
  • 相关阅读:
    Bean生命周期
    Bean的作用域
    神经网络训练中,傻傻分不清Epoch、Batch Size和迭代
    jQuery中选择器有哪几种
    数据库的事务机制
    多线程面试题
    HTTP请求报文和HTTP响应报文
    linux tomcat单机部署多应用
    flexbox预习
    作业
  • 原文地址:https://www.cnblogs.com/findumars/p/5652042.html
Copyright © 2011-2022 走看看