在线程间进行回调可以通过信号和槽机制来实现。具体的实现方式如下:
- 在回调函数所在的类中声明自定义信号(在头文件中):
// MyClass.h
class MyClass : public QObject {
Q_OBJECT
public:
void longRunningFunction();
signals:
void longRunningFunctionComplete(QString result);
};
这里,我们在 MyClass 类中声明了一个自定义信号 longRunningFunctionComplete,该信号将在回调完成时发射,并将回调函数的返回值作为参数传递给槽函数。
- 实现 longRunningFunction() 函数,该函数启动一个新线程并在该线程中执行长时间运行的任务。当任务完成并需要进行回调时,任务中发射 MyObject 的信号(在 .cpp 文件中):
// MyClass.cpp
#include <QThread>
#include "MyClass.h"
class Worker : public QObject {
Q_OBJECT
public:
QString result;
public slots:
void doWork() {
// 假设这里执行了长时间运行的任务并获得了结果
result = "myResult";
QMetaObject::invokeMethod(parent(), "longRunningFunctionComplete", Qt::QueuedConnection, Q_ARG(QString, result));
}
};
void MyClass::longRunningFunction()
{
auto worker = new Worker();
worker->moveToThread(QThread::newThread(this));
connect(worker, &Worker::finished, worker, &QObject::deleteLater);
connect(this, &MyClass::startLongRunningFunction, worker, &Worker::doWork);
connect(worker, &Worker::resultReady, this, &MyClass::handleResults);
QThread::start();
emit startLongRunningFunction();
}
QT开发交流+赀料君羊:661714027
注意,这里我们需要在 MyObject 类的实现中创建一个内部类 Worker,该类实现了线程中的回调函数。然后,我们将 worker 对象移到新的线程中,并使用 connect() 函数将 worker 对象的 finished() 信号连接到 deleteLater() 槽上,以确保 worker 对象被正确地销毁。接下来,我们将 MyClass 对象的 startLongRunningFunction() 信号连接到 worker 对象的 doWork() 槽上,并将 Worker 对象的 resultReady() 信号