子スレッドからメインスレッドへはどうやってシグナルを送信するのですか。
Qtではイベント駆動型のため、子スレッドからメインスレッドへ直接通信することはできません。一般に、子スレッドからメインスレッドへシグナルを送る場合は、シグナル&スロットの仕組みを利用します。
一般的な方法として、以下があります。
- QObjectを継承したMySignalというカスタムシグナルクラスを定義します。
- 子スレッドでMySignalオブジェクトを作成し、その信号関数を呼んでシグナルを送出する。
- メインスレッドで、ワーカースレッドから送られてくるシグナルを処理するためのスロット関数を定義する。
やり方は以下の通りです。
- 「MySignal」などのカスタムシグナルクラスを作成するには、QObjectを継承します。
class MySignal : public QObject
{
Q_OBJECT
public:
explicit MySignal(QObject *parent = nullptr) : QObject(parent) {}
signals:
void mySignal();
};
- 子スレッドで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()がトリガーされ、サブスレッドからメインスレッドへのシグナル送信機能が実現します。