当前位置: 首页 > news >正文

QT的moveToThread 用法

moveToThread() 是 Qt 中将某个 QObject 对象移交到其他线程运行的关键方法,常用于实现 线程间的对象管理和事件处理分离

基本作用:

object->moveToThread(otherThread);
表示:把 object 所有的事件(包括槽函数)交由 otherThread 管理,即它的事件循环运行在线程 otherThread

常见用法(标准写法):

假设你有一个自定义工作类 Worker,你希望它在后台线程中运行:

定义 Worker 类(继承 QObject)

class Worker : public QObject
{
Q_OBJECT
public slots:
void doWork() {
qDebug() << "doWork run in thread:" << QThread::currentThread();
// ... 执行耗时任务
}
};

主线程中创建并启动线程 + 移动对象

Worker* worker = new Worker();
QThread* thread = new QThread();

// 将 worker 移动到新线程
worker->moveToThread(thread);

// 当线程启动后,调用 worker 的槽函数
QObject::connect(thread, &QThread::started, worker, &Worker::doWork);

// 处理线程完成时清理
QObject::connect(worker, &Worker::destroyed, thread, &QThread::quit);
QObject::connect(thread, &QThread::finished, thread, &QThread::deleteLater);

// 启动线程
thread->start();

注意事项(很重要):

说明
moveToThread() 必须在对象构造完成后调用,不能在构造函数内部调用
❷ 被移动的对象不能有父对象(不能设置 setParent()
❸ 不要直接在线程内访问 GUI 元素(只能在主线程处理 GUI)
❹ 所有槽函数将运行在 thread 的事件循环中(即 QThread::exec()
❺ 如果槽是直接连接(非 Queued),将忽略线程;用 Qt::QueuedConnection 可保证跨线程调用

示例输出验证:
qDebug() << "Main Thread:" << QThread::currentThread();
main() 中输出主线程,在 doWork() 里输出当前线程,可以看到 doWork() 在另一个线程中运行。

常见错误用法:

// 错误设计:QThread 本身不应该执行业务逻辑
class MyThread : public QThread {
void run() override {
worker->doWork();  // ❌ 错误:这会在当前线程执行,而非事件循环中
}
};

正确做法是将工作对象移动到线程,并由 QThread 的事件循环调用槽函数。

推荐结构图:

Main Thread
|
|--> 创建 Worker(QObject)
|--> 创建 QThread
|--> worker->moveToThread(thread)
|--> connect(thread->started, worker->doWork)
|--> thread->start()


文章转载自:
http://settleable .wkuuf.cn
http://exhibitively .wkuuf.cn
http://reshape .wkuuf.cn
http://formative .wkuuf.cn
http://echinococcosis .wkuuf.cn
http://euhemeristically .wkuuf.cn
http://quinquefid .wkuuf.cn
http://polynesia .wkuuf.cn
http://iridectomize .wkuuf.cn
http://sumac .wkuuf.cn
http://jus .wkuuf.cn
http://heterosis .wkuuf.cn
http://balloonist .wkuuf.cn
http://housework .wkuuf.cn
http://aswirl .wkuuf.cn
http://had .wkuuf.cn
http://deambulatory .wkuuf.cn
http://magellan .wkuuf.cn
http://kozhikode .wkuuf.cn
http://passage .wkuuf.cn
http://jagannath .wkuuf.cn
http://stromatolite .wkuuf.cn
http://homozygote .wkuuf.cn
http://johnston .wkuuf.cn
http://aruba .wkuuf.cn
http://subdecanal .wkuuf.cn
http://hexahydrothymol .wkuuf.cn
http://propaganda .wkuuf.cn
http://batik .wkuuf.cn
http://micronucleus .wkuuf.cn
http://www.dtcms.com/a/293962.html

相关文章:

  • Java按模板导出Excel
  • LoRA 低秩矩阵实现参数高效的权重更新
  • 2025 ACT 汽车功能安全相关PPT分享
  • 《计算机网络》实验报告七 HTTP协议分析与测量
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题汇总版,持续更新学习,加油!!!
  • 场效应管和模电的关于、学习
  • 【盘古100Pro+开发板实验例程】FPGA | Modelsim 的使用和 do 文件编写
  • SpringBoot 使用Rabbitmq
  • rust嵌入式开发零基础入门教程(一)
  • FSHNet:高效目标检测新突破
  • rust嵌入式开发零基础入门教程(五)
  • Python应用指南:构建和获取全球地铁线路数据及可视化
  • HarmonyOS学习记录5
  • 【形态学变换】——图像预处理(OpenCV)
  • (nice!!!)(LeetCode 每日一题) 1717. 删除子字符串的最大得分 (贪心)
  • 昨天去看了电科金仓的发布会,有点东西!
  • AI营销核心技术解析:运作机制与行业应用实例
  • 【软件系统架构】系列七:嵌入式系统性能深入解析
  • 华为云中,列表中的镜像无法删除可能由多种原因导致
  • 华为云开发者空间 × DeepSeek-R1 智能融合测评:云端开发与AI客服的协同进化
  • WPF的一些基础知识学习记录
  • 设计模式 八:原型模式 (Prototype Pattern)
  • Spring Boot全局异常处理:一网打尽Controller层异常,@RestControllerAdvice解析
  • 设计模式(单例)
  • 界面组件DevExpress WPF中文教程:Grid - 如何过滤节点?
  • Linux下SVN常用指令
  • 设计模式代码总结
  • Android MediaCodec 的使用和源码实现分析
  • 路由器与交换机的区别
  • 从入门到精通:Windows右键菜单管理全解析