一、具体的使用步骤如下:

1.从QObject派生一个类,将耗时的工作写在该类的槽函数中。

2.将派生类对象移动到一个QThread中,该线程需要start。(这一步使用moveToThread)

3.通过信号连接派生类的槽函数,并通过信号触发槽函数。(槽函数在子线程中执行)

二、案例

1、自定义Worker类,将线程中的逻辑在该类中以槽函数的方式实现:

#ifndef WORKER_H
#define WORKER_H

#include <QObject>

class Worker : public QObject
{
Q_OBJECT
public:
explicit Worker(QObject *parent = nullptr);
~Worker();
signals:
void finished();//完成信号

public slots:
void doSomething();
};

#endif // WORKER_H

Worker.cpp

#include "worker.h"
#include <QDebug>

Worker::Worker(QObject *parent) : QObject(parent)
{

}

Worker::~Worker()
{
qDebug()<<"free worker...";
}

void Worker::doSomething()
{
qDebug()<<"do something...";
emit finished();
}

2、调用处代码:

QThread *thread = new QThread;
Worker*worker = new Worker;

connect(worker,SIGNAL(finished()),thread,SLOT(quit()));//新增
connect(thread,SIGNAL(started()),worker,SLOT(doSomething()));
connect(thread,SIGNAL(finished()),worker,SLOT(deleteLater()));
connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater()));
worker->moveToThread(thread);
thread->start();

注意:由于 ​​Worker#doSomething()​​​ 执行完毕后,线程并不会结束,这样若不做额外控制,那么就会导致 ​​thread​​​ 和 ​​worker​​ 的内存泄漏。所以需要在 ​​worker​​ 对象的槽函数 ​​doSomething()​​ 结束的时候,应发射结束信号来间接控制线程