代码来自安晓辉:
#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); // 除了自定义消息,其它消息都让系统处理 }