Qt+C++多线程thread-QThread-QTimer视频-控件动画-混合应用实例

news2024/11/20 11:29:33

程序示例精选

Qt+C++多线程thread-QThread-QTimer混合应用实例

如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助!

前言

这篇博客针对<<Qt+C++多线程thread-QThread-QTimer混合应用实例>>编写代码,代码整洁,规则,易读。 学习与应用推荐首选。

功能:多线程thread-QThread-QTimer混合应用


文章目录

一、所需工具软件

二、使用步骤

        1. 引入库

        2. 代码实现

        3. 运行结果

三、在线协助

一、所需工具软件

1. VS, Qt

2. OpenCV

二、使用步骤

1.引入库

#include "MainWindow.h"

#include<iostream>
#include <QThread>
#include <thread>
#include <chrono>
#include <QObject>
#include <QThread>
#include <QDebug>
#include <QTimer>
#include <QMutex>
#include <QWaitCondition>
#include<opencv2/opencv.hpp>
#include <QDebug>

2. 代码实现

代码如下:

//.h文件
#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_MainWindow.h"

#include <mutex> 

class MainWindow : public QMainWindow
{
	Q_OBJECT

public:
	MainWindow(QWidget *parent = Q_NULLPTR);

private:
	Ui::MainWindowClass ui;
	
private slots:
	//void modelRun();
	void modelStop();
	void modelRun();
	void videoStart();
	void videoStop();
	void displayFrames();


};

//.cpp文件

MainWindow::MainWindow(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);

	QObject::connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(modelRun()));
    QObject::connect(ui.pushButton_2, SIGNAL(clicked()), this, SLOT(modelStop()));
    QObject::connect(ui.pushButton_3, SIGNAL(clicked()), this, SLOT(videoStart()));
    QObject::connect(ui.pushButton_4, SIGNAL(clicked()), this, SLOT(videoStop()));

}

ThreadOne threadObj;
std::thread thread1;
void MainWindow::modelRun()
{
    std::cout << "modelRun" << std::endl;
    QString buttonText = ui.pushButton->text();
    //std::string buttonText = buttonText2.toLocal8Bit().constData();
    //qDebug() << buttonText;

    if (buttonText == QStringLiteral("模型开始1"))
    {
        std::cout << "模型开始1" << std::endl;
        //ThreadOne threadObj;
        //std::thread thread1(&ThreadOne::sendRun, &threadObj);
        // 如果之前已经启动过线程,则先停止线程,并等待线程执行完毕
        //if (thread1.joinable()) {
        //    thread1.join();
        //}
        thread1 = std::thread(&ThreadOne::sendRun, &threadObj);
        // 不用等待线程执行完成,让它在后台运行
        thread1.detach();

        ui.pushButton->setText(QStringLiteral("暂停模型1"));
    }

    if (buttonText == QStringLiteral("暂停模型1"))
    {
        threadObj.pause();
        ui.pushButton->setText(QStringLiteral("恢复模型1"));
    }

    if (buttonText == QStringLiteral("恢复模型1"))
    {
        threadObj.resume();
        ui.pushButton->setText(QStringLiteral("暂停模型1"));
    }
}

void MainWindow::modelStop()
{
    // 停止远端发送帧线程的逻辑
    threadObj.stop();

    // 停止远端发送帧线程的逻辑
    //if (thread1.joinable()) {
    //    // 发送停止信号给线程
    //    threadObj.stop();
    //    // 等待线程执行完毕
    //    thread1.join();
    //}
}

QTimer* timer = new QTimer(nullptr);
void MainWindow::videoStart()
{
    std::cout << "modelRun" << std::endl;
    QString buttonText = ui.pushButton_3->text();
    //std::string buttonText = buttonText2.toLocal8Bit().constData();
    //qDebug() << buttonText;

    if (buttonText == QStringLiteral("开始1"))
    {
        std::cout << "开始1" << std::endl;
        // 创建Qtimer对象,并设置定时器间隔为1ms
        //QTimer* timer = new QTimer(this);
        connect(timer, SIGNAL(timeout()), this, SLOT(displayFrames()));
        timer->start(100);
        ui.pushButton_3->setText(QStringLiteral("暂停1"));
    }

    if (buttonText == QStringLiteral("暂停1"))
    {
        timer->stop();
        ui.pushButton_3->setText(QStringLiteral("恢复1"));
    }

    if (buttonText == QStringLiteral("恢复1"))
    {
        timer->start(100);
        ui.pushButton_3->setText(QStringLiteral("暂停1"));
    }
}

void MainWindow::videoStop()
{
    // 停止本地接收帧线程的逻辑
    timer->stop();
}


void MainWindow::displayFrames()
{
    std::cout << "test2" << std::endl;

    // 接收帧并显示的逻辑
    if (!frame.empty())
    {
        //std::cout << "frame: " << frame << std::endl;
        //ui.label->clear(); //这个代码必须的,如没有会卡住
        //cvtColor(frame, frame, COLOR_RGB2BGR);
        //QImage img = QImage((const unsigned char*)(frame.data), frame.cols, frame.rows, frame.cols * frame.channels(), QImage::Format_RGB888);
        //ui.label->setPixmap(QPixmap::fromImage(img));
        //ui.label->update();

        cv::cvtColor(frame, frame, cv::COLOR_BGR2RGB); // 将图像转换为RGB格式
        int bytesPerLine = bytesPerComponent *width;
        QImage q_image(frame.data, width, height, bytesPerLine, QImage::Format_RGB888);
        q_image = q_image.scaled(ui.label->width() * 0.8, ui.label->height() * 0.6);
        ui.label->setPixmap(QPixmap::fromImage(q_image));
        update();
    }
}

3. 运行结果

 

三、在线协助:

如需安装运行环境或远程调试,见文章底部个人 QQ 名片,由专业技术人员远程协助!
1)远程安装运行环境,代码调试
2)Qt, C++, Python入门指导
3)界面美化
4)软件制作

当前文章连接:Python+Qt桌面端与网页端人工客服沟通工具_alicema1111的博客-CSDN博客

博主推荐文章:python人脸识别统计人数qt窗体-CSDN博客

博主推荐文章:Python Yolov5火焰烟雾识别源码分享-CSDN博客

                         Python OpenCV识别行人入口进出人数统计_python识别人数-CSDN博客

个人博客主页:alicema1111的博客_CSDN博客-Python,C++,网页领域博主

博主所有文章点这里alicema1111的博客_CSDN博客-Python,C++,网页领域博主

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

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

相关文章

事务@transactional执行产生重复数据

背景 系统设计之初&#xff0c;每次来新请求&#xff0c;业务层会先查询数据库&#xff0c;判断是否存在相同的id数据&#xff08;id是唯一标识产品的&#xff09;&#xff0c;有则返回当前数据库查到的数据&#xff0c;根据数据决定下一步动作&#xff0c;没有则认为是初次请…

【ArcGIS Pro二次开发】(46):要素类从上到下、从左到右排序

要素类经过编辑之后&#xff0c;【OBJECTID】字段会变得不规律。应部分网友要求&#xff0c;做了这个从上到下、从左到右排序的工具。 不过后来在ArcGIS Pro中发现了一个【排序】工具&#xff0c;已经可以完美实现这个功能需求&#xff0c;发现自己做了个白工。 不过做了不能白…

火山引擎徐广治:边缘云,下一代云计算

6月30日&#xff0c;2023稀土开发者大会在北京举办。大会以「代码不止&#xff0c;掘金不停」为主题&#xff0c;与上百位海内外技术专家一起剖析行业最新动态&#xff0c;为一直在路上的技术开发者们&#xff0c;拓宽技术视野&#xff0c;传播前沿的技术理念。火山引擎边缘云资…

图腾柱电路

驱动MOS或者IGBT管&#xff0c;需要比较大的驱动电流或者灌电流 使用图腾柱电路或许是一个好的办法 电流路径是这样的 当CTL1端口输出为高电平的时候 三极管Q2的2脚为高&#xff0c;三极管Q2不导通 三极管Q1的2脚为高&#xff0c;三极管导通 所以Q1的3脚和1脚导通 VCC--…

C++笔记(总)

15重载 为什么使用重载 可以让函数名相同 提高复用性 函数重载需要满足的条件 1.函数的作用域相同 2.函数的返回值相同 3.函数的参数类型不同,或者参数的个数不相同或者参数的顺序不相同或者参数的类型不相同 4.不能用函数的返回值作为判断重载判断的条件。 举个例子 根…

月薪9.8K!打破年龄瓶颈~30岁前台测试转后台优化,他说:未来可期!

海压竹枝低复举&#xff0c;风吹山角晦还明&#xff01; 是啊&#xff0c;人这一辈子&#xff0c;该走的弯路&#xff0c;该吃的苦&#xff0c;该撞的南墙&#xff0c;一样都少不了&#xff0c;但只要我们能坚强挺住&#xff0c;熬过去&#xff0c;跨过去&#xff0c;好运自然来…

《Python机器学习:基于PyTorch和Scikit-Learn》——小解送书第五期

目录 书籍介绍 内容简介 作者简介 参与抽奖 书籍介绍 近年来&#xff0c;机器学习方法凭借其理解海量数据和自主决策的能力&#xff0c;已在医疗保健、 机器人、生物学、物理学、大众消费和互联网服务等行业得到了广泛的应用。自从AlexNet模型在2012年ImageNet大赛被提出以来…

【踩坑】gin框架middleware中间件如何中途跳出

gin框架middleware中间件如何中途跳出 背景 我在是使用gin web框架的时候需要自定义鉴权方式&#xff0c;那当然就要用到middleware这个方式了&#xff0c;代码如下所示&#xff0c;需要判断uid和token是否合法&#xff0c;不合法直接返回401状态&#xff0c;不继续往下执行 …

Android JNI引用类型管理 (十)

🔥 Android Studio 版本 🔥 🔥 JNI三种引用类型 🔥 全局引用、局部引用、弱引用 如果使用得当可以提升程序的性能, 否则会造成程序崩溃或者内存泄漏 🔥 创建包含JNI的类 JNIReference.java 🔥 package com.cmake.ndk1.jni;public class JNIReference {static {S…

什么是分布式微服务?

什么是分布式微服务&#xff1f; 前言什么是微服务举例说明 什么是分布式图解分布式与微服务单体架构及部署微服务架构分布式影响 分布式微服务架构什么是分布式微服务架构面临的问题 前言 本文旨在讲清楚什么是分布式微服务架构&#xff0c;通过解释微服务架构和分布式架构&a…

基于Java+SpringBoot+Vue的乐器社区网站设计与实现

博主介绍&#xff1a;✌擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案…

37.SpringBoot实用篇—开发(上册)

目录 一、SpringBoot实用篇—开发。 &#xff08;1&#xff09;热部署&#xff08;开发阶段使用&#xff09;。 &#xff08;1.1&#xff09;手动启动热部署。 &#xff08;1.2&#xff09;自动启动热部署。 &#xff08;1.3&#xff09;热部署范围配置。 &#xff08;1.…

概率栅格

欢迎访问我的博客首页。 概率栅格 1. miss 表与 hit 表 1. miss 表与 hit 表 miss 表和 his 表是一维数组&#xff0c;它们存放的都是空闲值&#xff0c;用于更新概率栅格。其下标 i i i 代表旧空闲值&#xff0c;元素 t a b l e [ i ] table[i] table[i] 代表旧空闲值 i i …

openGauss学习笔记-10 openGauss 简单数据管理-创建表

文章目录 openGauss学习笔记-10 openGauss 简单数据管理-创建表10.1 语法格式10.2 参数说明10.3 示例 openGauss学习笔记-10 openGauss 简单数据管理-创建表 在当前数据库中创建一个新的空白表&#xff0c;该表由命令执行者所有。在不同的数据库中可以存放相同的表。您可以使用…

android avd

avd 记录~ avd 创建avd 默认位置安装位置.android/avd 下.android/avd/xxxx.ini 文件.android/avd/.avd 下config.ini 文件 扩展没尝试命令 avd 创建 https://developer.android.google.cn/studio/run/managing-avds?hlzh-cn https://blog.csdn.net/m0_37792384/article/det…

深入分析 workflow 线程池

深入分析 workflow 线程池 线程池是日常开发中很常用的一种管理线程的工具。它是池化技术中的一种。 池化技术的初衷就是将一些资源进行重复利用&#xff0c;来避免重复的构建来提高执行效率。类似的还有数据库连接池&#xff0c;字符串常量池&#xff0c;httpClient 连接池。…

git下载源码及环境搭建下载源码之后端(一)

学习目标&#xff1a; git下载源码 步骤&#xff1a; 下载源码 使用 windows R 使用cmd调用命令框下载gitee云上面的 源码文件 输入命令&#xff1a; Git clone &#xff08;此处拼接gitee源代码 地址&#xff09; 若使用 git 命令 clone 项目时 我们需要在系统变量中进行…

Ceph 存储(最详细!)

目录 一&#xff1a;存储基础 1、单机存储设备 &#xff08;1&#xff09;DAS&#xff08;直接附加存储&#xff0c;是直接接到计算机的主板总线上去的存储&#xff09; &#xff08;2&#xff09;NAS&#xff08;网络附加存储&#xff0c;是通过网络附加到当前主机文件系统…

CSS 伪元素: ::marker 自定义列表序号

::marker 伪元素 ::marker&#xff0c;可作用在任何设置了 display: list-item 的元素或伪元素上&#xff0c;例如<li>和<summary>。 /** <ul><li>Peaches</li><li>Apples</li><li>Plums</li> </ul> */ ul li::…

Python教程(3)——python开发工具vscode的下载与安装

Python的开发工具有很多款&#xff0c;很多都是非常好用的&#xff0c;其中vscode作为其中一款Python的开发工具&#xff0c;是非常轻量级的&#xff0c;今天我们来介绍一下vs code的下载与安装。 vscode的下载与安装 首先需要到vscode的官网&#xff0c;这个谷歌或者百度一下…