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&");