QT实现多摄像头监控

news2024/11/25 10:29:01

在这里插入图片描述

工具使用方法:
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_OBJECT

public:
    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);
                }
            }
            else
                m_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.coloradmin.cn/o/1832972.html

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

相关文章

Rust 开发搜索引擎 Quickwit 替代ES,成本降低 10 倍,查询亚秒级别!

一、Quickwit 概述 Quickwit 它是云存储上最快的搜索引擎&#xff0c;它非常适合用于可观察性的云原生搜索引擎&#xff0c;如日志、跟踪以及即将推出的指标。同时也是 Datadog、Elasticsearch、Loki 和 Tempo 的开源替代方案。 二、Quickwit 功能 全文搜索和聚合查询&#…

视觉应用线扫相机速度反馈(伺服转盘)

运动控制实时总线相关内容请参考运动控制专栏&#xff0c;这里不再赘述 1、运动控制常用单位u/s运动控制单位[u/s]介绍_运动控制 unit是什么单位-CSDN博客文章浏览阅读176次。运动控制很多手册上会写这样的单位&#xff0c;这里的u是英文单词unit的缩写&#xff0c;也就是单位…

哈喽GPT-4o——对GPT-4o 提示词的思考与看法

目录 一、提示词二、常用的提示词案例1、写作助理2、改写为小红书风格3、英语翻译和改写4、论文式回答5、主题解构6、提问助手7、Nature风格润色8、结构总结9、编程助手10、充当终端/解释器 大家好&#xff0c;我是哪吒。 最近&#xff0c;ChatGPT在网络上广受欢迎&#xff0c…

持PMP证书可以免考申请CSPM-2国标证书!

一提到项目管理的专业认证&#xff0c;大家首先想到的肯定是以PMP为核心的PMI体系认证。当然也有BSI和IPMP等其他体系认证&#xff0c;但都是从国外引进的专业认证&#xff0c;我国始终缺少符合中国特色项目管理环境下的项目管理专业认证体系。 如今&#xff0c;更符合中国国情…

Python中关于电商商品数据的采集【taobao/JD/商品详情数据返回】

在Python中采集电商商品数据&#xff08;如淘宝、京东等&#xff09;通常涉及到网络爬虫&#xff08;web scraping&#xff09;或称为网络数据抓取&#xff08;web data scraping&#xff09;。由于电商平台通常会有反爬虫机制&#xff0c;因此直接抓取数据可能会遇到各种挑战&…

【Kubernetes】k8s--安全机制

机制说明 Kubernetes 作为一个分布式集群的管理工具&#xff0c;保证集群的安全性是其一个重要的任务。API Server 是集群内部各个组件通信的中介&#xff0c; 也是外部控制的入口。所以 Kubernetes 的安全机制基本就是围绕保护 API Server 来设计的。 比如 kubectl 如果想向 …

[JavaScript]何为变量提升?

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/139742129 出自【进步*于辰的博客】 关于编译与解释&#xff0c;详述可查阅博文《[Java]知识点》…

SQL:按用户名复制权限

生产系统中有一个模块是管理用户及菜单权限&#xff0c;它们是由3个数据表组成&#xff0c;关系及字段如下&#xff1a; 原来为每个用户添加菜单的访问权限时都是一个一个添加&#xff0c;但今天遇到有个新来的员工&#xff0c;需要具有与另一个员工相同的权限。新建一个用户后…

SQL Server 中处理重复数据:保留最新记录的两种方案

目录 首先准备测试的数据表 方案一. 使用ROW_NUMBER()函数删除重复项 方案二. 使用临时表的方式 大家在项目开发过程中,数据库几乎是每一个后端开发者必备的技能,并且经常会遇到对于数据表重复数据的处理,一般需要去除重复保留最新的记录。今天这里给大家分享两种种方案,…

【Git】-- 添加公钥到 github 或者gitlab上

仅针对系统&#xff1a;mac os 、 unix、linux 1、检查是否有 id_rsa.pub $ cd ~ $ ls -al ~/.ssh 注意&#xff1a;若已有 id_rsa.pub&#xff0c;则必要执行 第二步&#xff0c;避免覆盖掉原有正常的公钥。 配置多个 git 账号请参考&#xff1a;同一台电脑配置多个git账…

Python工具箱系列(五十三)

​​水印 水印是一种常见的图片处理需求。当既需要展示&#xff0c;又需要保护知识产权时&#xff0c;就需要使用文字或者图片来打水印。下面的代码展示了文字水印与图片水印的过程。 ​--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdown from pat…

电源小白入门学习11——反激电源电路原理

电源小白入门学习11——反激电源、正激电源 隔离电源变压器介绍反激电源 前面我们学习了BUCK、BOOST、BUCK-BOOST 等各种各样的DCDC变换器&#xff0c;但是他们都有一共同的特点&#xff0c;即能量的传输路径时一个完整的通路&#xff0c;输入与输出之间不存在电气隔离&#xf…

C++链表相关内容温习回顾——移除链表元素

本文主要对之前学过的C链表相关内容进行温习回顾&#xff0c;并以 移除链表元素 为例&#xff0c;进行应用。 关于链表的基础理论可见&#xff1a;链表理论基础 应用示例&#xff1a;LeetCode 203 移除链表元素 https://leetcode.cn/problems/remove-linked-list-elements/ 0、…

Redis作者长文总结LLMs, 能够取代99%的程序员

引言 这篇文章并不是对大型语言模型&#xff08;LLMs&#xff09;的全面回顾。很明显&#xff0c;2023年对人工智能而言是特别的一年&#xff0c;但再次强调这一点似乎毫无意义。相反&#xff0c;这篇文章旨在作为一个程序员个人的见证。自从ChatGPT问世&#xff0c;以及后来使…

定个小目标之刷LeetCode热题(22)

这道题最容易想的就是排序后再遍历&#xff0c;但是时间复杂度就不是O(n)了&#xff0c;所以还是得用更优的解法&#xff0c;直接看题解&#xff0c;它是使用了HashSet&#xff0c;遍历数组&#xff0c;对于每一个数x&#xff0c;如果不存在x - 1则进入内循环&#xff0c;否则跳…

springboot弘德图书馆座位预约管理系统-计算机毕业设计源码07028

摘 要 在面对当今培育人才计划的压力&#xff0c;人们需要汲取更多的不同领域的知识来不断扩充自己的知识层面&#xff0c;因此他们对学习的欲望不断扩大&#xff0c;图书馆作为我们的学习宝地&#xff0c;有着不可替代的地位。但是在信息化时代&#xff0c;传统模式下的图书馆…

四川蔚澜时代电子商务有限公司抖音开店靠谱吗?

在数字化浪潮席卷全球的今天&#xff0c;电子商务以其独特的魅力和优势&#xff0c;成为了推动经济发展的重要引擎。作为四川地区电商服务的佼佼者&#xff0c;四川蔚澜时代电子商务有限公司凭借其深厚的行业积淀和前瞻的战略眼光&#xff0c;专注于抖音电商服务领域&#xff0…

pytest并发执行时token异常处理问题

接前面加入钩子函数处理token复用的问题&#xff0c;只保证了用例的串联执行&#xff0c;我的部分测试用例中接入了通义千问的部分接口生成测试数据&#xff0c;七八个场景跑完差不多快要10分钟。考虑使用并发执行。 http://t.csdnimg.cn/ACexL 使用多线程和不使用耗时差距很大…

Node-red win11安装

文章目录 前言一、安装node.js和npm二、安装Node-red三、 运行Node-red 前言 Node-RED 是一种编程工具&#xff0c;用于以新颖有趣的方式将硬件设备、API 和在线服务连接在一起。 它提供了一个基于浏览器的编辑器&#xff0c;只需单击一下即可将调色板中的各种节点轻松连接在…

EXCEL数据导入HIVE

引言 本文将论述如何将Windows本地的excel表数据,导入到虚拟机Linux系统中的Hadoop生态中的Hive数据仓库中。 实验准备 DBeaver Hive3.1(Hadoop3.1) excel数据表 实验步骤 一、首先打开虚拟机,启动Hadoop,启动hive,启动hiveserver2,连接DBeaver,成功连接展示如下…