Qt的moveToThread使用
worker.h
#ifndef WORKER_H
#define WORKER_H
#include <QObject>class Worker : public QObject
{Q_OBJECT
public slots:void doHeavyWork(); // 耗时的任务
signals:void resultReady(const QString &result); // 发出工作结果的信号
};
#endif // WORKER_H
worker.cpp
#include "worker.h"
#include <QThread>
#include <QDebug>void Worker::doHeavyWork()
{qDebug() << "Worker starts working in thread:" << QThread::currentThreadId();long long sum = 0;// 模拟一个耗时的任务for (long long i = 0; i < 999999999999999999; ++i) {sum += 1;}emit resultReady(QString("Finished! Worked"));qDebug() << "Worker finished";
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QThread>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECT
public:MainWindow(QWidget *parent = nullptr);~MainWindow();
private slots:void on_startButton_clicked();void handleResults(const QString &result);
signals:void operate(); // “开始工作”信号
private:Ui::MainWindow *ui;QThread *m_workerThread;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "worker.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);qDebug() << "UI is running in thread:" << QThread::currentThreadId();// 1. 准备“新车间”和“工人”m_workerThread = new QThread(this);Worker *worker = new Worker();// 2. 把工人“调派”到新车间worker->moveToThread(m_workerThread);// 3. 建立信号槽connect(this, &MainWindow::operate, worker, &Worker::doHeavyWork);connect(worker, &Worker::resultReady, this, &MainWindow::handleResults);// 车间关闭后,自动解雇工人(释放内存)connect(m_workerThread, &QThread::finished, worker, &QObject::deleteLater);// 4. 打开车间大门m_workerThread->start();
}
MainWindow::~MainWindow()
{m_workerThread->quit(); // 关闭车间m_workerThread->wait(); // 等工人下班delete ui;
}
void MainWindow::on_startButton_clicked()
{ui->resultLabel->setText(u8"正在玩命计算中... ⏳");// 5. 让工人开工!emit operate();
}
void MainWindow::handleResults(const QString &result)
{ui->resultLabel->setText(result + u8" ✅");
}
moveToThread的流程:
1.分离
QThread管线程,Worker管任务。
2.调派
worker->moveToThread(thread)。
3.连接
用信号槽连接UI和Worker。
4.启动
thread->start(),然后emit信号开工