Qt中使用线程之moveToThread

步骤:

1、创建一个自定义Worker类,继承自QObject

2、主线程中创建QThread的对象,Worker类的对象

3、Worker类的对象调用moveToThread函数移动到QThread的对象中

4、主线程自定义一个信号,并使用信号槽连接到worker类对象的任务函数

5、启动线程

6、主线程发射自定义的信号,触发worker类对象的任务函数,这个函数就会在子线程中执行

7、找一个合适的时机或位置完成线程的退出和清理

如下面的例子

点击按钮,ui发射自定义信号,触发Worker的工作函数(工作在子线程中),然后Worker发射信号,主线程更新Label的值

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QThread>
#include<QLabel>
#include<QPushButton>

class Worker:public QObject
{
    Q_OBJECT
public:
    Worker()=default;
    ~Worker()=default;


    //工作函数,在这个函数中编写业务逻辑
    void doWork()
    {
        //打印下线程id,看和主线程的线程id是否一样
        qDebug()<<"工作函数所在线程:"<<QThread::currentThreadId();
        int num=0;
        while(!stop)
        {
            //num循环自增,然后发射改变的信号
            emit changeString(QString::number(num++));
            QThread::msleep(500);
        }
    }

    //终止循环,结束工作函数
    void Stop()
    {
        stop=true;
    }
signals:
    void changeString(QString text);

private:
    bool stop=false;
};

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr): QWidget(parent)
    {
        qDebug()<<"UI界面所在线程:"<<QThread::currentThreadId();
        resize(400,300);
        QLabel* info=new QLabel("我是Label",this);
        QFont font;
        font.setPixelSize(18);
        font.setBold(true);
        info->setFont(font);
        info->setGeometry(10,20,400,100);

        QPushButton* btn=new QPushButton("更新Label",this);
        btn->setGeometry(10,140,100,30);


        //创建辅助线程,
        QThread* th=new QThread(this);

        //创建任务类,不能指定父指针为this,否则还是会在当前线程
        Worker* worker=new Worker;
        //移动到线程
        worker->moveToThread(th);

        //绑定worker发射的信号,来更新ui界面的label
        connect(worker,&Worker::changeString,this,[=](QString text){
            info->setText("当前num的值:"+text);
        });

        //绑定自定义的triggerWork信号,来触发worker的工作函数,工作函数就会在子线程中执行
        connect(this,&Widget::triggerWork,worker,&Worker::doWork);

        //绑定窗口的destroyed信号,窗口关闭时结束掉线程
        connect(this,&Widget::destroyed,this,[=](){
            worker->Stop();//终止工作函数
            th->exit();//线程退出事件循环
            th->wait();//等待线程退出
            qDebug()<<"线程退出了";
        });

        //点击按钮,发射triggerWork信号,通过信号来触发前面绑定的工作函数
        //(只能通过信号槽,用信号来触发工作函数,才会子线程中执行)
        connect(btn,&QPushButton::clicked,this,&Widget::triggerWork);


        //手动启动线程
        th->start();

    }

    ~Widget()=default;


signals:
    //自定义一个信号
    void triggerWork();
};
#endif // WIDGET_H

官方案例:QThread Class | Qt Core 5.15.17

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/898828.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

身份和访问管理平台(IAM)是数字身份管理的关键路径和重要方法

随着数字化转型不断推进&#xff0c;越来越多的企业选择通过身份和访问管理平台&#xff08;IAM&#xff09;来管理数字身份。IAM不只是传统的账号、认证、授权、审计产品&#xff0c;更是数字身份管理的创新领航者&#xff0c;以权威数字身份为基础&#xff0c;结合用户与数字…

Python爬取京东商品信息,详细讲解,手把手教学(附源码)

Python 爬虫爬取京东商品信息 下面我将逐一解释每一部分的代码 导入库 from selenium import webdriver from selenium.webdriver.edge.service import Service from selenium.webdriver.edge.options import Options import time import random import csv from selenium.c…

VMware中Ubuntu安装

VMware官网&#xff1a;https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion 先在官网下载VMware&#xff0c;一直根据默认点下一步就好了&#xff0c;记得更改安装地址哦&#xff0c;否则默认下在C盘里。 先下载好Ubuntu映像文件&#xff1a;https://…

[电子科大]王丽杰 离散数学 第二讲 特殊集合和集合间关系 笔记

1.2 特殊集合与集合间关系 空集 不含任何元素的集合叫做空集(empty set)&#xff0c;记作∅. 空集可以符号化为 ∅ { x ∣ x ≠ x } ∅ \{ x|x ≠ x\} ∅{x∣x​x} . 空集是绝对唯一的。 全集 针对一个具体范围&#xff0c;我们考虑的所有对象的集合叫做全集(universal …

JMeter模拟并发请求

PostMan不是严格意义上的并发请求工具&#xff0c;实际是串行的&#xff0c;如果需要测试后台接口并发时程序的准确性&#xff0c;建议采用JMeter工具。 案例&#xff1a;JMeter设置20个并发卖票请求&#xff0c;查看后台是否存在超卖的情况 方式一&#xff1a;一共10张票&…

视觉分析在烟火检测中的应用

随着城市化进程的加快&#xff0c;烟火安全问题日益突出。传统的烟火检测方式依赖人工巡查和基础传感器&#xff0c;容易受到人为因素和环境条件的影响&#xff0c;导致检测效率低下和误报率高。为了解决这一问题&#xff0c;烟火检测算法的引入为我们提供了一种全新的解决方案…

前端根据某数组是否有数据渲染按钮

代码&#xff1a;React TypeScript 由于这个data可能是undefined&#xff0c;所以报错了&#xff0c;问了chatgpt&#xff0c;可以进行的检查方式有以下几种&#xff1a; 1、使用可选链 或者这样写&#xff1a; 我个人比较喜欢用第二种&#xff0c;因为比较简洁 2、类型守卫…

python中使用库pandas来创建excel表格

先需要pip或者conda下载这个pandas 源码如下&#xff1a; import pandas as pdsList_1 [1,2,3,4,5] List_2 [软件,硬件,结构,产品经理,项目经理] List_3 [杭州,南京,河南,合肥,成都] List_4 [21,22,23,24,25] List_5 [2000,3000,1400,1500,2000]TitleData { # 用字典设…

KUKA机器人选定程序时提示“选择非法”的处理方法

KUKA机器人选定程序时提示“选择非法”的处理方法 如下图所示,选中某个程序,点击选定时, 系统提示:选择非法, 具体处理方法可参考以下内容: 选中该程序后,在右下角打开【编辑】菜单键,再选择【属性】,打开后可以看到程序的一般说明、信息模块和参数等信息,如下图所示…

ERP、SCM与CRM:三大系统的区别与整合策略

ERP&#xff08;企业资源规划&#xff09;、SCM&#xff08;供应链管理&#xff09;和CRM&#xff08;客户关系管理&#xff09;系统的关系与区别可以概括为&#xff1a;ERP整合企业内部资源和流程&#xff0c;SCM优化供应链环节&#xff0c;CRM关注客户关系和销售管理。这三个…

[前端] ✨【如何用课程设计提升工程能力?】✨笔记

✨【如何用课程设计提升工程能力&#xff1f;】✨ &#x1f4da; 课程设计真的在语言工具类课程中占据了“C位”&#xff01;&#x1f451;设计得好的课程简直像一个实战训练营&#xff0c;既能帮助学生巩固理论&#xff0c;又能培养解决复杂问题的能力&#xff0c;还能让他们…

13_渲染器的设计

目录 渲染器与响应式系统的结合渲染器的基本概念自定义渲染器 渲染器与响应式系统的结合 渲染器与响应式系统是相辅相成的&#xff0c;渲染器负责将响应式系统中的响应式数据渲染到视图中&#xff0c;而响应式系统则负责监听数据的变化并通知渲染器进行更新。 渲染器在浏览器…

第13篇:无线与移动网络安全

目录 引言 13.1 无线网络的安全威胁 13.2 无线局域网的安全协议 13.3 移动通信中的安全机制 13.4 蓝牙和其他无线技术的安全问题 13.5 无线网络安全的最佳实践 13.6 总结 第13篇&#xff1a;无线与移动网络安全 引言 无线和移动网络的发展为我们的生活带来了极大的便利…

爱快路由器配置腾讯云动态域名DDNS详细说明

直白点说就是让爱快路由器自动配置当前公网IP地址给域名&#xff0c;动态域名DDNS不清楚的请自行百度&#xff0c; 这里就可以看见操作日志&#xff0c;那么我们一步一步来配置它吧&#xff0c;首先登录爱快路由器&#xff0c;如下图&#xff1a; 那么腾讯云我们怎么找到ID和…

使用python自制桌面宠物,好玩!——枫原万叶桌宠,可以直接打包成exe去跟朋友炫耀。。。

大家好&#xff0c;我是小黄。 今天我们使用python实现一个桌面宠物。只需要gif动态图片就行。超级简单容易上手。 #完整源代码可在下方图片免费获取 一&#xff1a;下载相关的库文件。 我们本次使用到的库文件为&#xff1a;tkinter和pyautogui 下载命令&#xff1a; pip…

做一个简单的图片验证码生成,避免被 ai 简单识别出文本

做一个简单的图片验证码生成&#xff0c;避免被 ai 简单识别出文本 缘由腾讯云的收费标准网易的收费标准 编写一个图片验证码生成c# 示例 缘由 在很多场合&#xff0c;我们会对用户进行一个真实性人工验证&#xff0c;避免各种注册机、机器人之类的&#xff0c;对我们的正常工…

力扣143.重排链表

通过画图分析&#xff0c;可以从反转后链表与原链表中按顺序各自取一个结点来构建结果&#xff0c;不过要注意的这两个链表只会用到一半&#xff0c;结合 链表的中间结点 和 反转链表 进行解题。 /*** Definition for singly-linked list.* struct ListNode {* int val;* …

nginx在access日志中记录请求头和响应头用作用户身份标识分析

在应用系统中&#xff0c;有时将请求的用户信息和身份认证信息放到请求头中&#xff0c;服务器认证通过后&#xff0c;通过cookie返回客户端一个标识&#xff0c;在后续的请求时&#xff0c;客户端需要带上这个cookie&#xff0c;通过这个cookie&#xff0c;服务器就知道请求的…

如何将数据从 AWS S3 导入到 Elastic Cloud - 第 2 部分:Elastic Agent

作者&#xff1a;来自 Elastic Hemendra Singh Lodhi 了解将数据从 AWS S3 提取到 Elastic Cloud 的不同选项。 这是多部分博客系列的第二部分&#xff0c;探讨了将数据从 AWS S3 提取到 Elastic Cloud 的不同选项。 在本博客中&#xff0c;我们将了解如何使用 Elastic Agent…

【C++】进阶:类相关特性的深入探讨

⭐在对C 中类的6个默认成员函数有了初步了解之后&#xff0c;现在我们进行对类相关特性的深入探讨&#xff01; &#x1f525;&#x1f525;&#x1f525;【C】类的默认成员函数&#xff1a;深入剖析与应用&#xff08;上&#xff09; 【C】类的默认成员函数&#xff1a;深入剖…