• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Qt开启C++线程里并访问界面

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

一、前言

众所周知,只要涉及界面开发,都有一句话:禁止在子线程里增删改查界面

也就是所谓的:主线程更改界面,子线程做运算

有时候发现线程不能改变界面是非常不方便的,而上面的两句话也只是“原则上”,也就是说其实是可以的。

至于有后果:【个人推测】

APP在主线程中有自己的一套消息循环,如界面绘制、重绘、更新等,如果程序员在子线程中加上这些操作,可能会产生冲突,到时候软件意外崩溃,几乎是找不到原因的啊!!!

所以本文的投机取巧要慎用,反正我不管冲了!!  

 

 

二、举例

我做过MFC、C#、Python、Matlab【不提供线程】,几乎都是这个原则,今天把这个原则深入研究一下。

三、Qt线程概述

Qt库提供线程一般有两种,加上C++自己的线程,就是三种。分别是:QThread子类、QObject子类+moveToThrad、std::thread+其他线程函数

前两种都是用来后台计算,我还没有用来改变过界面,往往通过信号与槽来让main线程修改界面,根据我的推测【还没试验,确实没必要,只用来做计算应该也够了】,是可以在他们依附的子线程里修改界面的,如何实现看下面。

第三种C++自己的线程开启函数,也就是通过线程对象+线程函数+入参的形式开启一个线程。

四、如何在线程里访问界面

仔细看Qt窗口项目代码

 

 

就是这个ui指针,它指向的Mainwindow对象,Qt内部自己将ui指针指向了自己的mainwindow.ui界面文件,所以总结来说就是:

界面也是个对象

既然界面也是个对象,那我把这个对象当做参数传递到子线程中,是可行的。

 

五、实现

1、在mainwindow.h定义线程入口函数

void getWltData(QString path);

2、mainwindow.cpp中实现并访问界面

void Mystack::getWltData(QString path)
{
    ui->label_84->setText("子线程访问界面"+path);
}

3、开启线程

void Mystack::on_pushButton_17_clicked()
{
    std::thread t(&Mystack::getWltData,this,ui->lineEdit_71->text());
    t.detach();
}

总结:

想要在子线程中访问界面,只要把界面对象传递给子线程函数即可。

注意:

线程函数要定义成类的函数,因为这样才能访问private属性的ui,如果是全局函数,则没有this指针,即使传递this进去也不能访问到private对象;

然后类函数默认有一个this入参的;

这样做有何不良反应还没发现。

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#启动进程和杀死进程发布时间:2022-07-13
下一篇:
[C++]用Xcode来写C++程序[3]Constants发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap