在Qt中,子線程不能直接與主線程通信,因為Qt是基于事件循環機制的。一般情況下,需要借助信號和槽機制來實現子線程向主線程發送信號。
以下是一種常見的方法:
定義一個自定義信號類,例如MySignal,繼承自QObject。
在子線程中,創建一個MySignal對象,并調用其信號函數發送信號。
在主線程中,創建一個槽函數來處理子線程發送的信號。
具體步驟如下:
class MySignal : public QObject
{
Q_OBJECT
public:
explicit MySignal(QObject *parent = nullptr) : QObject(parent) {}
signals:
void mySignal();
};
void MyWorker::doWork()
{
// 創建自定義信號對象
MySignal signal;
// 發送信號
emit signal.mySignal();
}
void MyThread::handleSignal()
{
// 處理信號
qDebug() << "Signal received";
}
MyThread thread;
// 連接信號和槽
QObject::connect(&thread, &MyThread::mySignal, &thread, &MyThread::handleSignal);
通過以上步驟,子線程就可以向主線程發送信號了。當子線程中的MySignal對象調用emit signal.mySignal()
時,主線程的槽函數handleSignal()
會被觸發,實現了子線程向主線程發送信號的功能。