Qt线程使用

news2025/1/9 0:27:42

嗨嗨嗨,今天又学到了新的知识——线程,这个玩意在项目中使用的频率是非常高的,毕竟电脑的主线程就那么一个,那么这也就是我们为啥要学习线程的原因。比如说,我们们的游戏,如果我们的游戏界面显示的同时我们可以操作我们的装备、地图、人物移动等等这些都是线程做的,这样可以在一定程度上实现并行处理的效果,(虽然它还是串行的)。那我们开始发车了!!!!

1.UI界面

首先我们先设置我们的UI界面毕竟要看到效果嘛

就这样简单,一个按钮加一个TextEdit。

2.subthread类的创建

我们新建一个类,我们将我们的线程和我们的主Widget类分开,这样编辑的时候方便,

这个应该都会吧~~~

编辑subthread.h

#ifndef SUBTHREAD_H  // 检查SUBTHREAD_H是否已定义,防止头文件重复包含
#define SUBTHREAD_H

#include <QObject>  // 包含QObject类,因为SubThread类继承自QObject

class SubThread : public QObject  // 定义一个继承自QObject的类SubThread
{
    Q_OBJECT  // 启用Qt的信号和槽机制

public:
    explicit SubThread(QObject *parent = nullptr);  // 构造函数,允许将父对象设置为nullptr

public slots:  // 定义槽函数区域
    void Run();  // 定义一个槽函数Run,可以在Qt的信号槽机制中被调用

signals:  // 定义信号区域
    void SendData(int cnt);  // 定义一个信号SendData,当需要发送数据时发出,参数为int类型

};

#endif // SUBTHREAD_H  // 结束头文件保护

这个里面大致和Widget里的初始内容大差不差,就是定义了一个信号,毕竟我们要在线程中创建函数,实现完成之后要将参数用信号传给主线程嘛

编辑subthread.cpp

#include "subthread.h"
#include "QThread"
#include"QWidget"

// SubThread类的构造函数
SubThread::SubThread(QObject *parent)
    : QObject{parent} // 调用QObject的构造函数,传入父对象指针
{}

// SubThread类的槽函数Run,用于在子线程中执行的任务
void SubThread::Run()
{
    int cnt = 10; // 初始化计数器为10
    while (cnt > 0) { // 当计数器大于0时循环

        emit SendData(cnt--); // 发出SendData信号,传递当前计数器值,并递减计数器
        QThread::msleep(1000); // 使当前线程暂停1000毫秒(即1秒)
    }
    QThread::currentThread()->quit(); // 请求当前线程的事件循环退出

}


我们在这个类里来实现我们的子线程函数

3.Widget的编写

Widget.h的编写

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include"QThread"

QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget // 声明Widget类,它继承自QWidget
{
    Q_OBJECT // 宏,用于支持Qt的信号和槽机制

public:
    Widget(QWidget *parent = nullptr); // 构造函数,允许传入一个父QWidget指针
    ~Widget(); // 析构函数

private slots: // 私有槽函数,只能通过信号和内部连接来调用
    void on_pushButton_clicked(); // 当某个按钮被点击时调用的槽函数(假设是由Qt Designer自动连接的)
    void ReceiveData(int cd); // 接收数据的槽函数,参数为整型

private:
    Ui::Widget *ui; // 指向UI界面对象的指针(注意:这里应该是Ui_Widget,但按照您的代码保留)
    QThread *thread; // 指向QThread对象的指针,用于管理子线程
};

#endif // WIDGET_H // 结束头文件保护

在主函数里定义了一个槽函数,用来接收子线程信号的参数

Widget.cpp的编写

#include "widget.h"
#include "ui_widget.h"
#include "QThread"
#include "subthread.h"

// Widget类的构造函数
Widget::Widget(QWidget *parent)
    : QWidget(parent) // 调用基类的构造函数,传入父对象指针
    , ui(new Ui::Widget) // 实例化UI界面对象
{
    ui->setupUi(this); // 初始化UI界面
    // 创建QThread对象,作为子线程
    thread = new QThread(this);
    // 在堆上创建SubThread对象,SubThread是继承自QObject的类,用于在子线程中执行任务
    SubThread *st = new SubThread;
    // 将SubThread对象移动到QThread对象(子线程)中
    st->moveToThread(thread);
    // 当子线程结束时,自动删除SubThread对象
    connect(thread, &QThread::finished, st, &SubThread::deleteLater);
    // 当子线程启动时,调用SubThread的Run槽函数
    connect(thread, &QThread::started, st, &SubThread::Run);
    // 连接SubThread的SendData信号到Widget的ReceiveData槽函数
    connect(st, &SubThread::SendData, this, &Widget::ReceiveData);
}

// Widget类的析构函数
Widget::~Widget()
{
    delete ui; // 释放UI界面对象占用的内存
    // 安排QThread对象在事件循环结束时删除,确保线程安全退出
    thread->deleteLater();
}

// 槽函数,响应按钮点击事件
void Widget::on_pushButton_clicked()
{
    // 启动子线程
    thread->start();
    // 禁用按钮,防止在任务执行期间重复点击
    ui->pushButton->setDisabled(true);
}

// 槽函数,接收来自SubThread的SendData信号
void Widget::ReceiveData(int cd)
{
    // 将接收到的整数数据转换为QString,并追加到textEdit控件中
    ui->textEdit->append(QString::number(cd));
}

运行效果:

每一秒执行一次cnt--。

这样的效果就是,如果处理一个比较耗费时间的函数或事件的时候,我们将他交给子线程,他处理完成之后,将参数传上来就可以。

好嘞,大概就这样的,大家最好自己实现一下,然后多看看,要不然···········反正我一遍看不懂~~~~~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【生日视频制作】奥迪A8提车交车仪式AE模板修改文字软件生成器教程特效素材【AE模板】

奥迪A8提车交车仪式AE模板制作过程软件生成器素材 AE模板套用改图文教程↓↓&#xff1a; 怎么如何做的【生日视频制作】奥迪A8提车交车仪式AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件 下载AE模板 把AE模板导入AE软件 修改图片…

PD快充协议方案 及应用场景

快充协议诱骗原理主要依赖于快充协议芯片与供电端&#xff08;如PD充电器&#xff09;之间的握手通信&#xff0c;以申请所需要的电压与电流&#xff0c;确保充电过程安全、快速且高效。这种芯片通过内置的通讯模块与供电端通信&#xff0c;根据设备的实际需求调整输出电压和电…

大路灯护眼灯有必要吗安全吗?性价比高落地护眼灯推荐

大路灯护眼灯有必要吗安全吗&#xff1f;近几年来&#xff0c;随着生活节奏的加快&#xff0c;目前青少年的近视率呈现一个直线上升的趋势&#xff0c;其中占比达到了70%以上&#xff0c;并且最令人意外的是小学生竟然也占着比较大的比重&#xff0c;这一系列的数据不仅表明着近…

苍穹外卖学习笔记(一)

文章目录 开发环境搭建一. 前端环境搭建二. 后端环境搭建1.进入idea项目2.提交git仓库(推送github远程仓库)3.数据库环境搭建4.前后端联调(在源代码中项目已经实现登录功能)nginx反向代理好处: 三. 完善登录功能(md5加密存储)1.首先打开pojo模块中实体类的employee&#xff0c;…

[STL --stack_queue详解]stack、queue,deque,priority_queue,容器适配器

stack stack介绍 1、stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2、stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容器&#xff0c;并提供…

原理图库和PCB库的命名规范及创建封装、使用封装管理器

原理图库 命名规范 原理图中元件值标注规则 注&#xff1a;元件值&#xff08;Component Value&#xff09;就是元件最主要的特征对应的值。 Component value. Most analog components have a value that must be specified by this field (e.g., 2.7 kΩ). Additional disti…

c++数据结构之队列

目录 一、队列的含义 1.队列的使用 2.队列的结构 二、顺序队列的实现 1.队列的定义 2.队列的初始化 3.清空对列 4.队列是否为空 5.获取队列的长度 6.获取头元素的值 7.入队列 8.出队列 9.遍历队列中的值 10.总代码 11.打印结果 三、链表队列的实现 1.队列的…

【Hot100】LeetCode—347. 前 K 个高频元素

目录 1- 思路自定义Node结点 哈希表实现 2- 实现⭐347. 前 K 个高频元素——题解思路 3- ACM实现 原题连接&#xff1a;347. 前 K 个高频元素 1- 思路 自定义Node结点 哈希表实现 ① 自定义 Node 结点&#xff1a; 自定义 Node 结点中有 value 和 cnt 字段&#xff0c;其中…

力扣接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表…

html css网页制作

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; HTML 和 CSS 是制作网页的基础。HTML 用于定义网页的结构和内容&#xff0c;CSS 用于设计网页的样式和布局。以下是一个详细的网页制作成品教程&#xff0c;包括 HTML 和 CSS 的基础知识&#xff0c;及如何…

MySQL基础(7)- 多表查询

目录 一、笛卡尔积的错误与正确的多表查询 1.出现笛卡尔积错误 2.正确的多表查询&#xff1a;需要有连接条件 3.查询多个表中都存在的字段 4.SELECT和WHERE中使用表的别名 二、等值连接vs非等值连接、自连接vs非自连接 1.等值连接 vs 非等值连接 2.自连接 vs 非自连…

安卓逆向(之)真机root(红米手机)

概览&#xff1a; 1, 手机解锁 2, 下载官方系统包&#xff0c;推荐线刷包,取出镜像文件 3, magisk工具修补 官方系统包 4, adb&#xff1a;命令对手机刷 root 5, 完成 6, 小米手机解锁 点击 小米手机解锁OEM官方教程 记得数据线连接手机电脑 工具下载 点击 下载adb(电脑操作…

进程间通信-进程池

目录 理解​ 完整代码 完善代码 回收子进程&#xff1a;​ 不回收子进程&#xff1a; 子进程使用重定向优化 理解 #include <iostream> #include <unistd.h> #include <string> #include <vector> #include <sys/types.h>void work(int rfd) {…

Windows下使用cmake编译OpenCV

Windows下使用cmake编译OpenCV cmake下载OpenCV下载编译OpenCV cmake下载 下载地址&#xff1a;https://cmake.org/download/ 下载完成&#xff0c;点击选择路径安装即可 OpenCV下载 下载地址&#xff1a;https://github.com/opencv/opencv/releases/tag/4.8.1因为我们是编译…

2024软件测试需要具备的技能(软技能硬技能)

软件测试的必备技能 在往期的文章分享了很多的面试题&#xff0c;索性做一个转型。从零基础开始讲解&#xff0c;结合面试题来和大家一起学习交流软件测试的艺术。 第一个是专业技能&#xff0c;也叫硬技能。 第二个叫做软技能。 我们在上一篇文章中讲到了软件测试流程的5个…

ChatGPT在论文写作领域的应用:初稿设计

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 学术论文写作中&#xff0c;内容清晰、结构合理的初稿至关重要。通过 ChatGPT&#xff0c;写作者可以快速生成内容框架、明确研究问题&#xff0c;并优化表达方式。不仅提高了写作效率&…

笔记整理—内核!启动!—kernel部分(1)驱动与内核的关系

首先&#xff0c;恭喜完成了uboot部分的内容整理&#xff0c;其次补充一点&#xff0c;uboot第一部分和第二部分的工作不是一定的&#xff0c;在不同的版本中&#xff0c;可能这个初始化早一点&#xff0c;那个的又放在了第二部分&#xff0c;版本不同&#xff0c;造成的工作顺…

滑动窗口——632. 最小区间

最近在抽时间写LC上的一个专栏——2024春招冲刺百题计划。挑着做&#xff0c;做了几道和滑动窗口相关的题目&#xff0c;632. 最小区间&#xff0c;LC上标记为困难&#xff0c;第一次写完全没有思考&#xff0c;参考了别人写的答案茅塞顿开&#xff0c;特此记录以鞭策自己学习。…

Android perfetto 简介

Android perfetto 简介 使用 perfetto 工具&#xff0c;您可以通过 Android 调试桥 (adb) 在 Android 设备上收集性能信息。使用 adb shell perfetto ... 命令调用 perfetto 工具。 perfetto 从您的设备上收集性能跟踪数据时会使用多种来源&#xff0c;例如&#xff1a; 使用…

5、const修饰类型和变量

const修饰类型和变量 一、const常量一些注意点1、声明时必须同时初始化2、不可更改3、与宏常量的区别 二、const修饰指针1、常量指针constant pointer2、常指向指针pointer-to-constant pointer 一、const常量一些注意点 1、声明时必须同时初始化 #include <iostream> …