Qt 使用moveToThread方式 QThread started信号对应的槽结束后,会发送finished信号吗?
时间: 2024-03-06 18:52:13 浏览: 194
使用 `moveToThread` 方式将一个 QObject 对象移动到一个新线程中时,QObject 对象的生命周期仍然受到父对象的控制。因此,当父对象被删除时,QObject 对象也会被删除。因此,当使用 `moveToThread` 方式将一个 QObject 对象移动到一个新线程中时,我们需要注意以下几点:
1. 我们需要在新线程中创建一个 `QThread` 对象,并将 QObject 对象移动到该线程中。
2. 我们需要为该线程创建一个 `QEventLoop` 对象,并在该事件循环中运行该线程。
3. 我们需要在 QObject 对象中实现 `doWork()` 槽函数,在该槽函数中执行需要在新线程中执行的操作,并将该槽函数与 `QThread` 对象的 `started()` 信号连接起来。
4. 我们需要在 `doWork()` 槽函数执行完毕后,手动调用 `QThread::quit()` 和 `QThread::wait()` 函数,以结束该线程的事件循环和等待线程退出。
因此,在使用 `moveToThread` 方式将 QObject 对象移动到一个新线程中时,并不会自动发送 finished 信号。我们需要在 `doWork()` 槽函数中手动发送该信号。例如:
```
class Worker : public QObject {
Q_OBJECT
public:
Worker(QObject *parent = nullptr) : QObject(parent) {}
public slots:
void doWork() {
// 执行需要在新线程中执行的操作
emit finished();
}
signals:
void finished();
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QThread thread;
Worker worker;
worker.moveToThread(&thread);
QObject::connect(&thread, &QThread::started, &worker, &Worker::doWork);
QObject::connect(&worker, &Worker::finished, &thread, &QThread::quit);
QObject::connect(&worker, &Worker::finished, &worker, &QObject::deleteLater);
thread.start();
return app.exec();
}
```
阅读全文