在创建worker QObject时,QThread对象没有finished信号的原因是因为QThread并不是一个真正的线程,它只是一个线程控制类。在Qt中,QThread的作用是为QObject提供一个事件循环,并将其移动到新的线程中执行。因此,当创建一个worker QObject并将其移动到QThread中时,并不会触发QThread的finished信号。
具体来说,当我们创建一个QThread对象并调用其start()方法时,QThread会在内部创建一个新的系统线程,并在该线程中执行一个事件循环。然后,我们可以通过调用worker QObject的moveToThread()方法将其移动到这个新的线程中,使其在新线程中执行。
然而,由于QThread并不是一个真正的线程,它只是一个线程控制类,因此它并没有与线程结束相关的信号。相反,我们可以通过在worker QObject中自定义一个信号来表示工作的完成,然后在工作完成时手动发射这个信号。
例如,我们可以在worker QObject中定义一个finished信号,并在工作完成时手动发射它:
class Worker : public QObject
{
Q_OBJECT
public:
Worker() {}
public slots:
void doWork()
{
// 执行工作任务
// ...
// 工作完成后发射finished信号
emit finished();
}
signals:
void finished();
};
然后,在创建worker QObject并将其移动到QThread中时,我们可以连接worker的finished信号到其他槽函数,以便在工作完成时执行相应的操作:
QThread* thread = new QThread;
Worker* worker = new Worker;
// 将worker移动到新线程中
worker->moveToThread(thread);
// 连接worker的finished信号到其他槽函数
connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
// 启动线程
thread->start();
// 执行工作任务
QMetaObject::invokeMethod(worker, "doWork");
通过这种方式,我们可以在worker QObject中自定义一个信号来表示工作的完成,从而实现类似于finished信号的功能。
领取专属 10元无门槛券
手把手带您无忧上云