Qt非UI線程與UI通過信號槽通訊

1 定義Qt的非UI線程類

#ifndef WXPTHREAD_H
#define WXPTHREAD_H

#include <QThread>
class WxpThread : public QThread
{
    Q_OBJECT
    public:
        WxpThread();
        ~WxpThread();
    signals:
        void sendValue(const QString&);

    public:
        virtual void run();
};

#endif // WXPTHREAD_H
#include "wxpthread.h"

WxpThread::WxpThread(){}
WxpThread::~WxpThread(){}

void WxpThread::run()
{
    QString str("");
    for (int i = 0; i < 100; i++)
    {
        str.setNum(i);
        emit sendValue(str);
        sleep(1);
    }
}

2   窗口類的定義

在相關UI類中創建槽:
       private slots:
            void OnMsgSignal(const QString&);

創建線程,綁定信號和槽(一般在UI構造函數中完成)     

 myThread =new WxpThread();
connect(myThread, SIGNAL(sendValue(const QString&)),this, SLOT(OnMsgSignal(const QString&)));
//此處connect的第五個參數默認變成Qt::QueuedConnection

void MainWindow::OnMsgSignal(const QString&temp)
  {
   ui->MyText->setText(temp);
  } 


在需要的時候啓動線程即可
void MainWindow::on_pushButton_3_clicked()
{
    myThread->start();
}

//---------------------------------------------------------------------------------------------

傳遞自定義類型時:

步驟:(以自定義TextAndNumber類型爲例)

自定一種類型,在這個類型的頂部包含:#include <QMetaType>

在類型定義完成後,加入聲明:Q_DECLARE_METATYPE(TextAndNumber);

在main()函數中註冊這種類型:qRegisterMetaType<TextAndNumber>("TextAndNumber");

如果還希望使用這種類型的引用,可同樣要註冊:qRegisterMetaType<TextAndNumber>("TextAndNumber&");

 

 

發佈了399 篇原創文章 · 獲贊 26 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章