zoukankan      html  css  js  c++  java
  • Qt开启C++线程里并访问界面

    一、前言

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

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

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

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

    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入参的;

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

  • 相关阅读:
    算法学习(十五)
    学习正则表达式笔记(三)
    学习正则表达式笔记(二)
    事件监听器
    socket(套接字)
    (转载)表驱动法
    C++文件读写
    齐次表示
    线性插值(linear interpolation)
    向上取整Ceil,向下取整Floor,四舍五入Round
  • 原文地址:https://www.cnblogs.com/judes/p/12522854.html
Copyright © 2011-2022 走看看