在 Qt 中,将信号与槽函数连接并在新线程中启动槽函数是一种常见的操作。这通常涉及到 QThread
类以及信号和槽的机制。下面是一个简单的示例,演示了如何在一个新线程中启动一个任务,并在任务完成时通过信号和槽机制通知主线程。
示例代码
- 定义一个工作类:这个类将在新线程中执行某些任务。
#include <QObject>
#include <QThread>
#include <QDebug>
class Worker : public QObject {
Q_OBJECT
public slots:
void doWork() {
// 模拟一些工作
qDebug() << "Worker: Doing work in thread" << QThread::currentThread();
// 假设工作花费了一些时间
QThread::sleep(2);
// 完成后发出信号
emit workFinished();
}
signals:
void workFinished();
};
- 定义主窗口或主类:在这个类中,我们将创建并启动新线程,并将工作对象移动到该线程中。
#include <QCoreApplication>
#include <QThread>
#include <QDebug>
#include "worker.h"
class MainClass : public QObject {
Q_OBJECT
public:
MainClass() {
Worker* worker = new Worker;
QThread* thread = new QThread;
worker->moveToThread(thread);
connect(thread, &QThread::started, worker, &Worker::doWork);
connect(worker, &Worker::workFinished, this, &MainClass::onWorkFinished);
connect(worker, &Worker::workFinished, thread, &QThread::quit);
connect(thread, &QThread::finished, worker, &QObject::deleteLater);
connect(thread, &QThread::finished, thread, &QObject::deleteLater);
thread->start();
}
public slots:
void onWorkFinished() {
qDebug() << "MainClass: Work finished in thread" << QThread::currentThread();
}
};
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
MainClass mainClass;
return a.exec();
}
#include "main.moc"
解释
- Worker 类:
- 继承自
QObject
并声明为Q_OBJECT
以使用信号和槽。 - 定义一个槽函数
doWork
,在这个函数中执行需要在新线程中运行的任务。 - 定义一个信号
workFinished
,当任务完成时发出这个信号。
- 继承自
- MainClass 类:
- 在构造函数中,创建
Worker
对象和QThread
对象。 - 使用
moveToThread
将Worker
对象移动到新线程中。 - 连接信号和槽:
- 当线程启动时 (
QThread::started
),调用Worker
的doWork
槽函数。 - 当
Worker
完成工作时 (Worker::workFinished
),调用MainClass
的onWorkFinished
槽函数,并停止线程 (QThread::quit
)。 - 当线程停止时 (
QThread::finished
),删除Worker
和QThread
对象以释放资源。
- 当线程启动时 (
- 启动线程。
- 在构造函数中,创建
- main 函数:
- 创建
QCoreApplication
对象。 - 创建
MainClass
对象,在其中进行所有的设置和线程操作。 - 进入事件循环。
- 创建
通过这种方式,你可以将耗时的任务放在新线程中执行,并在任务完成时通过信号和槽机制通知主线程。