QT实现多摄像头监控

在这里插入图片描述

工具使用方法:
1、在add camera后面输入对应摄像头的IP后,点击add会自动布局显示。
2、在del camera后选择一个对应IP后,点击del会自动删除对应摄像头的显示,且整体布局会自动调整。
工具使用场景
测试摄像头的好坏。支持windows和linux系统。
部分代码实例
mplayer.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include "mplayer.h"
#include <QPushButton>
#include <QComboBox>
#include <QLineEdit>
#include <QGridLayout>
#include <QVBoxLayout>class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = nullptr);~Widget();private:QVector<MPlayer*> m_videos;QStringList m_videoUrls;QWidget* m_btnWid = nullptr;QWidget* m_videoWid = nullptr;QPushButton* m_addBtn = nullptr;QPushButton* m_delBtn = nullptr;QLineEdit* m_urlEdit = nullptr;QComboBox* m_urlBox = nullptr;
};#endif // WIDGET_H

mplayer.cpp

#include "widget.h"
#include "uheartthread.h"
#include <QLabel>Widget::Widget(QWidget *parent) :QWidget(parent)
{    this->resize(1280,800);m_btnWid = new QWidget(this);m_videoWid = new QWidget(this);QGridLayout* glay = new QGridLayout(this);glay->addWidget(m_btnWid,0,0,1,1);glay->addWidget(m_videoWid,1,0,10,1);glay->setMargin(0);this->setLayout(glay);QLabel* lab1 = new QLabel("add camera:",m_btnWid);QLabel* lab2 = new QLabel("del camera:",m_btnWid);m_addBtn = new QPushButton("add",m_btnWid);m_delBtn = new QPushButton("del",m_btnWid);m_urlEdit = new QLineEdit(m_btnWid);m_urlBox = new QComboBox(m_btnWid);QGridLayout* glay1 = new QGridLayout(m_btnWid);glay1->addWidget(lab1,0,0,1,1);glay1->addWidget(m_urlEdit,0,1,1,3);glay1->addWidget(m_addBtn,0,4,1,1);glay1->addWidget(lab2,1,0,1,1);glay1->addWidget(m_urlBox,1,1,1,3);glay1->addWidget(m_delBtn,1,4,1,1);glay1->setMargin(0);m_btnWid->setLayout(glay1);m_urlEdit->setText("192.168.1.216");m_addBtn->setFixedHeight(60);m_delBtn->setFixedHeight(60);m_urlEdit->setFixedHeight(60);m_urlBox->setFixedHeight(60);QGridLayout* glay2 = new QGridLayout(m_videoWid);glay2->setMargin(0);m_videoWid->setLayout(glay2);//初始化摄像头检测UHeartThread* thread = new UHeartThread;thread->start();connect(m_addBtn,&QPushButton::clicked,this,[=](){//摄像头MPlayer* video = new MPlayer(m_videoWid);QString url = QString("rtsp://admin:abcd-1234@%1:554/h264/ch1/main/av_stream").arg(m_urlEdit->text());video->setUrl(url);video->stopAudio();m_videos.append(video);for (int i = 0; i < m_videos.size(); ++i) {glay2->addWidget(m_videos[i],i/2,i%2,1,1);}m_videoUrls.append(url);m_urlBox->addItem(m_urlEdit->text());thread->m_urllist.append(m_urlEdit->text());});connect(m_delBtn,&QPushButton::clicked,this,[=](){if (m_videos.size() <= 0)return;for (int i = 0; i < m_videos.size(); ++i) {glay2->removeWidget(m_videos[i]);}MPlayer* video = m_videos[m_urlBox->currentIndex()];m_videos.removeOne(video);for (int i = 0; i < m_videos.size(); ++i) {glay2->addWidget(m_videos[i],i/2,i%2,1,1);}glay2->removeWidget(video);m_videoUrls.removeAt(m_urlBox->currentIndex());thread->m_urllist.removeAt(m_urlBox->currentIndex());m_urlBox->removeItem(m_urlBox->currentIndex());video->stop();delete video;this->update();});connect(thread,&UHeartThread::sigCamera1IsOn,this,[=](int i,bool ok){if (m_videos.size() > i){if (ok){if (!m_videos[i]->getVaild()){m_videos[i]->play();m_videos[i]->setVaild(true);}}elsem_videos[i]->setVaild(false);}});
}Widget::~Widget()
{
}

uheartthread.h

#ifndef UHEARTTHREAD_H
#define UHEARTTHREAD_H#include <QThread>class UHeartThread : public QThread
{Q_OBJECT
public:UHeartThread();virtual void run();QStringList m_urllist;
signals:void sigCamera1IsOn(int i,bool ok);
};#endif // UHEARTTHREAD_H

uheartthread.cpp

#include "uheartthread.h"
#include <QDebug>
UHeartThread::UHeartThread()
{
}QString SystemCmdRet(const char* cmd)
{static char buf[1024];QString ret = QString();memset(buf, 0x0, sizeof(buf));FILE* fp = popen(cmd, "r");if (fp == nullptr){perror(QString("##Err: GetSystemCmdRet->").arg(cmd).toLatin1().constData());return QString();}fread(buf, sizeof(char), sizeof(buf), fp);ret = QString(buf);pclose(fp);return ret;
}void UHeartThread::run()
{static int index = 0;while (1) {for (int i = 0; i < m_urllist.size(); ++i) {QString pingtest = SystemCmdRet(QString("ping -c 1 -W 1 %1 &").arg(m_urllist[i]).toUtf8().data());bool ok = pingtest.contains("1 packets transmitted, 1 received, 0% packet loss,");if (!ok)qDebug()<<i<<pingtest;emit sigCamera1IsOn(i,ok);sleep(2);}index++;}
}

详细代码实例

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

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

相关文章

探索CSS clip-path: polygon():塑造元素的无限可能

在CSS的世界里&#xff0c;clip-path 属性赋予了开发者前所未有的能力&#xff0c;让他们能够以非传统的方式裁剪页面元素&#xff0c;创造出独特的视觉效果。其中&#xff0c;polygon() 函数尤其强大&#xff0c;它允许你使用多边形来定义裁剪区域的形状&#xff0c;从而实现各…

Redis常见数据类型及其常用命令详解

文章目录 一、Redis概述二、Redis常用命令1.通用命令1.1 KEYS&#xff1a;查看符合模板的所有 key1.2 DEL&#xff1a;删除一个指定的 key1.3 EXISTS&#xff1a;判断 key 是否存在1.4 EXPIRE&#xff1a;给一个 key 设置有效期&#xff0c;有效期到期时该 key 会被自动删除1.5…

【读博日记】拓扑结构(待修正)

Topology 拓扑学 内容来源于互联网&#xff0c;还在甄别中——20240617 拓扑结构指把实体抽象成与其形状大小无关的点&#xff0c;把连接实体的线路抽象成线&#xff0c;再研究这些电线之间的关系。 所谓相似的拓扑结构&#xff1a; 例如一个圆环变成正方形、长方形、三角形…

.Net OpenCVSharp生成灰度图和二值图

文章目录 前言一、灰度图二、二值图 前言 使用OpenCVSharp生成图片的灰度图和二值图 .Net 8.0版本&#xff0c;依赖OpenCvSharp4和OpenCvSharp4.runtime.win组件。 原图&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、灰度图 /// &…

efficientsam-pytorch基于point、box和segment everthing推理模型

EfficientSAM 论文 EfficientSAM: Leveraged Masked Image Pretraining for Efficient Segment Anything https://arxiv.org/abs/2312.00863 模型结构 EfficientSAM模型利用掩码图像预训练&#xff08;SAMI&#xff09;&#xff0c;该预训练学习从SAM图像编码器重构特征&a…

项目(一)--高并发内存池项目简介

什么是高并发内存池 它是一个全球性大厂google(谷歌)的 开源项目,项目名字叫tcmalloc,全称是Thread-Caching Malloc,即线程缓存的malloc 作用&#xff1a; 我们知道C语言在堆上开辟空间和 释放使用的是malloc和free函数 并且C的动态内存管理new和delete 的底层实际上也调用了…

【Linux】模拟实现一个简单的日志系统

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

SFNC —— 标准特征命名约定(一)

系列文章目录 SFNC —— 标准特征命名约定&#xff08;一&#xff09; 文章目录 系列文章目录1、介绍1.1 约定&#xff08;Conventions&#xff09;功能名称和接口&#xff08;Feature Name and Interface&#xff09;功能类别&#xff08;Feature Category&#xff09;功能级别…

(微服务实战)预付卡平台支付交易系统消费业务流程设计

1 交易系统技术架构 预付卡支付交易系统采用Dubbo3作为底层框架&#xff0c;支付交易系统分为账户系统、清结算系统、支付网关、核心支付系统等模块。系统整体采用微服务架构&#xff0c;容器化部署。 2 消费业务流程设计 预付卡系统消费场景分为线上和线下&#xff0c;线…

市场情绪周期2024-6-17(补涨回头潮视角验证)

竞价隔夜单 看长江通信&#xff0c;38亿涨到40亿又回落&#xff0c;那么周末最大的利好消息加持下&#xff0c;隔夜单不及预期&#xff0c;金溢科技 更是如此&#xff1b;空间板华闻集团8天7板&#xff0c;连扳5板&#xff0c;一字跌停&#xff0c;它也是有车联网的&#xff0c…

【UIDynamic-动力学-UICollisionBehavior-碰撞模式-创建边界 Objective-C语言】

一、我们来说这个碰撞模式 1.把之前的代码备份一下,改个名字:“04-碰撞行为-碰撞模式”, 然后,command + R,先跑一下, 我现在,一点击,是这个红色的View、和蓝色的View、在发生碰撞, 我们说,碰撞模式是啥意思, collision里边,有一个叫做collisionMode, UICollis…

c++里对 new 、delete 运算符的重载

&#xff08;1&#xff09;c 里 我们可以用默认的 new 和 delete 来分配对象和回收对象。 new 可以先申请内存&#xff0c;再调用对象的构造函数&#xff1b; delete 则先调用对象的析构函数&#xff0c;再回收内存。当然&#xff0c;当我们为类定义了 operator new () 和 oper…

双层循环和循环控制语句的使用,while和until的语法使用

双层循环和循环控制语句的使用&#xff0c;while和until的语法使用 exit echo 打印 -n 表示不换行输出 -e 输出转译字符 \b&#xff1a;相当于退格键&#xff08;backspace&#xff09; \n&#xff1a;换行&#xff0c;相当于回车 \f&#xff1a;换行&#xff0c;换行后的…

Git仓库中文件的状态

0 Preface/Foreword 1 文件状态 文件包含以下4个状态&#xff1a; untracked&#xff0c;未跟踪&#xff0c;表示该文件在文件夹中&#xff0c;但是没有加入到git 仓库中进行版本管控。可以通过git add命令将该文件增加到git 仓库中。从untracked变为staged。unmodified&…

HarmonyOS之自选股App

支持在 鸿蒙、安卓、苹果设备上运行。 1.界面效果展示 2.数据存储 数据存储采用的是官方的 ohos.data.relationalStore.relationalStore stock_code表用来存储A股市场5000多家公司的股票代码和名称等信息 const TAB_STOCK_CODE "stock_code" const CREATE_TABL…

为企业提供动力:用于大型组织的WordPress

可扩展且灵活的架构可通过主题、插件和集成进行定制内置 SEO 功能和营销功能内容管理和协作工具支持多站点安装托管解决方案和面向平台的提供商采用现代前端技术的 Headless CMS 功能 拥有强大、灵活且可扩展的内容管理系统 (CMS) 对于大型组织至关重要。作为最受欢迎和广泛使用…

双层循环和循环控制语句的使用,以及while和until的语法使用

echo 打印 -n 表示不换行输出 -e 输出转义字符 /b&#xff1a;相当于退格键&#xff08;backspace&#xff09; /n&#xff1a; 换行&#xff0c;相当于回车 /f&#xff1a; 换行&#xff0c;换行后的新行的开头连着上一行的行尾 /t&#xff1a; 相当于tab键 又叫做横向制…

springboot与flowable(3):启动、审批、各个Service服务

一、启动流程 流程定义与实例的关系类似于Java的类与对象&#xff0c;通过定义的id创建流程实例&#xff0c;编写测试代码&#xff1a; package org.example.flowabledemo2;import org.flowable.engine.RuntimeService; import org.flowable.engine.runtime.ProcessInst…

Pikachu靶场--XSS

参考借鉴 Pikachu靶场之XSS漏洞详解_pikachu xss-CSDN博客 【皮卡丘03】一个视频讲清楚XSS跨站脚本_bilibili 反射型xss(get) 输入payload&#xff1a;<script>alert(123)</script> 解决一&#xff1a;在URL框内输入 解决二&#xff1a;修改最大长度 再次输入paylo…