在线程类中定义槽函数和在普通的 QObject 子类中定义槽函数是一样的,只需要将槽函数声明为 public slots
即可。
下面是一个简单的示例代码:
#include <QThread>
#include <QDebug>
class MyThread : public QThread {
Q_OBJECT
public:
void mySlot(QString message) {
qDebug() << "Received signal in thread: " << QThread::currentThreadId() << ", message:" << message;
}
protected:
void run() override {
// 在此处编写需要在线程中执行的代码
for (int i = 0; i < 10; i++) {
qDebug() << "Running in thread: " << QThread::currentThreadId();
emit mySignal("Hello from thread");
msleep(1000); // 线程休眠1秒钟,模拟耗时操作
}
}
signals:
void mySignal(QString message);
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// 创建线程对象,并启动它
MyThread thread;
thread.start();
// 将线程的mySignal信号与mySlot槽函数连接起来
QObject::connect(&thread, &MyThread::mySignal, &thread, &MyThread::mySlot);
return app.exec();
}
在上面的代码中,我们在 MyThread
类中定义了一个名为 mySlot()
的公共槽函数,用于接收线程发射的信号。该函数与普通 QObject 子类中定义槽函数的方式相同,在函数声明前加上 public slots
关键字即可。
在 MyThread::run()
函数中,我们通过发射信号的方式来触发该槽函数。同时,在主函数中,我们使用 QObject::connect()
函数将线程对象的信号与其自身的槽函数连接起来。
需要注意的是,在线程类中定义的槽函数运行在线程所属的上下文中,因此不应该直接访问 GUI 线程中的 UI 控件等资源。如果需要访问这些资源,可以使用 Qt 提供的跨线程调用方法,如 QMetaObject::invokeMethod()
或者信号和槽机制。