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