Qt线程-moveToThread

本文介绍了在Qt环境中创建线程并进行GUI操作的步骤,详细阐述了如何避免在非UI线程创建窗口导致的错误。通过信号槽机制实现线程间通信,确保线程安全地与UI交互。同时,提到了关键的连接方式(Qt::QueuedConnection)以确保正确执行。
摘要由CSDN通过智能技术生成

一、创建线程的过程

直接贴代码:

//1、创建线程

QThread *thread = new QThread;         

 //2、主要工作类                        
//VoiceUpdate *worker = new VoiceUpdate(this); //传参this的话,会有QObject::moveToThread: Cannot move objects with a parent
VoiceUpdate *worker = new VoiceUpdate();         

//3、将工作类加入到线程  
worker->moveToThread(thread);     

//4、线程结束时,释放工作类                             
connect(thread, &QThread::finished, worker, &QObject::deleteLater);

//5、connect的第5个参数,必须是Qt::QueuedConnection
 connect(thread, &QThread::started, worker, &VoiceUpdate::onStart, Qt::QueuedConnection);                 
connect(this, &UpdateVersion::sig_choose, worker, &VoiceUpdate::onChoose, Qt::QueuedConnection);
connect(worker, &VoiceUpdate::sig_create_gui, this, &UpdateVersion::onCreateWid, Qt::QueuedConnection);

//6、线程退出
connect(worker, &VoiceUpdate::sig_finish, this, [=]() {
        thread->quit();                                

});

//7、开始线程运行
thread->start();      

二、创建窗口-GUI

在VoiceUpdate中创建QWidget,会提示 :

ASSERT failure in QWidget: “Widgets must be created in the GUI thread.“   

解决方法是:通过信号槽实现线程通讯方式,在非UI主线程发生个信号,让UI主线程调用槽函数进行相关的界面操作。connect连接方式是QueuedConnection    

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值