當前位置:
首頁 >
Qt线程间通信-自定义事件
發布時間:2025/3/15
23
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Qt线程间通信-自定义事件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
線程間通信:
1.自定義事件:postEvent();
2.信號與槽【本質也是通過自定義事件實現的】
注意:每個線程都有自己的事件循環
1.從QEvent繼承;
2.registerEventType();//會返回全局唯一的事件類型
3.QCoreApplication::postEvent();//異步方式發送事件,Qt本身接管事件周期,在事件處理后就會銷毀他,所以new了后不要delete!!!!注意了new了后可以不delete!!!
4.重寫event方法;//接收的那一方重寫event
線程間通信:
1.使用自定義事件在線程通信;
2.可攜帶自定義數據;
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_Hwidget.h
#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include "customevent.h" #include <QLabel>class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();bool event(QEvent *e);protected:QLabel *m_label; };#endif // WIDGET_Hcustomevent.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); }總結
以上是生活随笔為你收集整理的Qt线程间通信-自定义事件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt工作笔记-对主事件循环的进一步认识
- 下一篇: win32项目-最基础的窗口程序