qt 链接线程启动后的槽函数

在 Qt 中,将信号与槽函数连接并在新线程中启动槽函数是一种常见的操作。这通常涉及到 QThread 类以及信号和槽的机制。下面是一个简单的示例,演示了如何在一个新线程中启动一个任务,并在任务完成时通过信号和槽机制通知主线程。

示例代码

  1. 定义一个工作类:这个类将在新线程中执行某些任务。

#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();  
};
  1. 定义主窗口或主类:在这个类中,我们将创建并启动新线程,并将工作对象移动到该线程中。

#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"

解释

  1. Worker 类
    • 继承自 QObject 并声明为 Q_OBJECT 以使用信号和槽。
    • 定义一个槽函数 doWork,在这个函数中执行需要在新线程中运行的任务。
    • 定义一个信号 workFinished,当任务完成时发出这个信号。
  2. MainClass 类
    • 在构造函数中,创建 Worker 对象和 QThread 对象。
    • 使用 moveToThread 将 Worker 对象移动到新线程中。
    • 连接信号和槽:
      • 当线程启动时 (QThread::started),调用 Worker 的 doWork 槽函数。
      • 当 Worker 完成工作时 (Worker::workFinished),调用 MainClass 的 onWorkFinished 槽函数,并停止线程 (QThread::quit)。
      • 当线程停止时 (QThread::finished),删除 Worker 和 QThread 对象以释放资源。
    • 启动线程。
  3. main 函数
    • 创建 QCoreApplication 对象。
    • 创建 MainClass 对象,在其中进行所有的设置和线程操作。
    • 进入事件循环。

通过这种方式,你可以将耗时的任务放在新线程中执行,并在任务完成时通过信号和槽机制通知主线程。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值