当前位置: 首页 > news >正文

【Qt】Qt中的信号槽

一、信号和槽概述

       信号槽是Qt矿建引以为豪的机制之一。

       所谓信号槽,实际上就是观察者模式(发布——订阅模式)。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号。这种发出的信号是没有目的的,类似于广播。如果有对象对这个信号感兴趣,它就会使用连接函数(connect),意思是将想要处理的信号和自己的一个函数(称为槽)绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自定被回调。

       这就类似于观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。

1.1 信号的本质

       信号是由于用户对窗口或控件进行了某些操作,导致窗口或控件产生了某个特定事件,这时候Qt对应的窗口类会发出某个信号,对用以此户的挑选做出反应。

根据上面的论述,我们可以得出一个结论——信号的本质就是事件,例如:

  • 按钮单击、双击
  • 窗口刷新
  • 鼠标移动、鼠标按下、鼠标释放
  • 键盘输入

在Qt中,信号是通过什么形式呈现给使用者的呢??

  • 我们对哪个窗口进行操作,哪个窗口就可以捕捉到这些被触发的事件
  • 对于使用者来说,触发一个事件,我们就可以得到Qt框架给我们发出的某个特定信号
  • 信号的呈现形式就是函数,也就是说某个事件产生了,Qt框架就会调用某个对应的信号函数,通知使用者。

       在Qt中信号的发出者是某个实例化的类对象,对象内部可以进行相关事件的检测。

1.2 槽的本质

       在Qt中,槽函数是一类特殊功能的函数,在编码过程中,也可以作为类的普通成员函数来使用。之所以称之为槽函数,是因为它们还有一个职责就是对Qt框架中产生的信号进行处理。

举个例子:

        有一天,我们在和女朋友一起逛街,突然,女朋友说:“我肚子饿了!”,于是我们带着她们去吃饭。(这就相当于女朋友发出一个信号,我收到信号并将其处理掉)

实例对象角色描述
女朋友信号发出者信号携带的信息:我饿了
信号接收者处理女朋友发射的信号:带她去吃饭

       在Qt中槽函数的所有者也是某个类的实例对象。

1.3 信号和槽的关系

在Qt中,信号和槽函数都是独立的个体,本身没有任何联系,但是由于某种特性需求,我们可以将二者连接在一起,好比牛郎和织女想要见面,必须要有喜鹊为他们搭桥。

在Qt中,我们需要使用QObject类中的connect函数进行两者的关联。

连接信号和槽的connect()函数原型如下,其中PointerToMenberFunction是一个指向函数地址的指针:

QMetaObject::Connection QObject::connect(const QObject* sender, PointerToMemberFunction signal,const QObject* receiver, PointerToMenberFunction method,Qt::ConnectionType type = Qt::AutoConnection);// 参数:
// sender:发出信号的对象
// signal:属于sender对象,信号是一个函数,这个参数的类型是函数指针,信号函数地址
// receiver:信号接受者
// method:属于receiver对象,当检测到sender发出了signal信号,receiver对象调用method方法,信号发出之后的处理动作// 参数signal和method都是函数地址,因此简化后的connect()如下:
connect(const QObject* sender, &QObject::signal,const QObject* receiver, &QObject::method);

使用connect()函数进行信号槽的连接的注意事项:

  • connect函数相对于做了信号处理动作的注册
  • 调用connect函数的sender对象的信号没有产生,因此receiver对象的method也不会被调用
  • method槽函数本质是一个回调函数,调用的时机是信号产生之后,调用的是Qt框架来执行的
  • connect连接中的sender和receiver两个指针必须被实例化,否则connect不会成功 

二、标准信号槽的使用

2.1 标准信号/槽

       在Qt中提供了很多标准类中都可以对用户触发的某种特定事件进行检测,因此当用户做了这些操作之后,事件被触发类的内部就会产生对应的信号,这些信号都是Qt类内部自带的,因此称之为标准信号。

同样地,在Qt的很多类的内部中为我提供了很多功能函数,并且这些函数也可以作为触发信号的处理动作,有这类特性的函数在Qt中称之为标准槽函数。

系统自带的信号和槽通常如何查找?这个就需要利用帮助文档,比如在帮助文档中查询按钮的点击信号,那么需要在帮助文档中输入QPushButton

2.2 使用

举个例子:

功能实现:点击窗口上的按钮,关闭窗口

功能分析:按钮:信号发出者                     QPushButton 类型

                  窗口:信号的接收者和处理处   QWidget 类型

// 需要使用的标准信号槽函数
// 单击按钮发出的信号
void QAbstractButton::clicked(bool check = false);
// 关闭窗口的槽函数
bool QWidget::close();// 点击按钮关闭窗口
connect(ui->closewindow, &QPushButton::clicked, this, &MainWindow::close);

       connect()操作一般写在窗口的构造函数汇总,相当于在事件产生之前,在Qt框架中先进行注册,这样在程序运行过程中假设产生了按钮的点击事件,框架就会调用信号接收者对象对应的槽函数,如果信号不产生,槽函数也就一直不会被调用。

三、自定义信号槽的使用

       Qt框架提供的信号槽在某种特定的场景下是无法满足我们的项目的要求,因此我们还设计自己需要的信号和槽,同样还是使用connect()对自定义的信号槽进行连接。

如果想要在Qt类中自定义信号槽,需要满足一些条件,并且也要注意一些事情:

  • 要编写新的类并且让其继承Qt的某些标准类
  • 这个新的子类必须从QObject类或者是QObject子类进行派生
  • 在定义类的头文件中假如Q_OBJECT宏
// 在头文件派生类的时候,首先像下面那样引入Q_OBJECT宏class MyMainWindow : public QWidget
{Q_OBJECT......
}

3.1 自定义信号

       在Qt中信号的本质是事件,但是在框架中也是以函数的形式存在的,只不过信号对应的函数只有声明,没有定义。如果Qt中的标准信号不能满足我们的需求,可以在程序中进行信号的自定义,当自定义信号对应的时间产生之后,认为将这个信号发射出去即可(其实就是调用一下这个信号函数)

自定义信号的要求和注意事项:

  • 信号是类的成员函数
  • 返回值必须是void类型
  • 信号的名字可以根据实际情况进行指定
  • 参数可以随意指定,信号也支持重载
  • 信号需要使用signals关键字进行声明,使用方法类似于public等关键字
  • 信号函数只需要声明,不需要定义(没有函数实现)
  • 在程序中发射自定义信号:发送信号的本质就是调用信号函数。习惯性在信号函数前加关键字:emit,但是可以省略不写,emit只是显示的声明一下信号要被发射了,没有特殊含义,底层中 emit == #define emit
class Test : public Qobject
{Q_OBJECT
signals:void testsignals();// 参数的作用是数据传递,谁调用信号函数谁就指定实参// 实参最终会被传递给槽函数void testsignals(int a);
}'

3.2 自定义槽

       槽函数就是信号的处理动作,在Qt中槽函数可以作为普通的成员函数来使用。如果标准槽函数提供的功能满足不了需求,可以自己定义槽函数进行某些特殊功能的实现。自定义槽函数和自定义的普通函数写法是一样的。

自定义槽的要求和注意事项:

  • 返回值必须是void类型
  • 槽也是函数,因此也支持重载
  • 槽函数需要指定多少个参数,需要看连接信号的参数个数(连接信号的参数个数大于槽函数的参数个数)
  • 槽函数的参数是用来接收信号传递的数据,信号传递的数据就是信号的参数
  • Qt中的槽函数类型是多样的,Qt中的槽函数可以是类的成员函数,全局函数,静态函数,Lambda表达式(匿名函数)
  • 槽函数可以使用关键字进行声明:slots(Qt5中slots可以省略不写)

       再来通过一个例子来自定义一个信号槽:还是上面的场景:女朋友说:“我肚子饿了!”,于是我带她去吃饭

class GirlFriend : public Object
{Q_OBJECT
public:explicit GirlFriend(QObject* parent = nullptr);signals:void hungry();void hungry(QString msg);
};class Me : public Object
{Q_OBJECT
public:explicit Me(QObject* parent = nullptr);public slots:// 槽函数void eatMeal();void eatMeal(QString msg);
};

四、信号槽的扩展

4.1 信号槽使用扩展

一个信号可以连接多个槽函数,发送一个信号有多个处理动作:

  • 需要写多个connect()连接
  • 槽函数的执行顺序是随机的,和connect函数的调用顺序没有关系
  • 信号的接收者可以是一个对象,也可以是多个对象

一个槽函数可以连接多个信号,多个不同的信号,处理动作是相同的

  • 需要写多个connect()连接

信号可以连接信号

  • 信号接收者可以不处理接收的信号,而是继续发射新的信号,这就相当于传递了数据,并没有随数据进行处理
  • connect(const QObject* sender, &QObject::singal,const QObject* receiver, &QObject::signal_new);

信号槽是可以通过函数断开的

  • disconnect(const QObject* sender, &QObject::signal,const QObject* receiver, &QObject::method);

4.2 信号槽的连接方式

4.2.1 Qt5的连接方式

// 语法
QMetaObject::Connection QObject::connect(const QObject* sender, PointerToMenmberFunction signal,const QObject* receiver, PointerToMemberFunction method,Qt::ConnectionType = Qt::AutoConnection);// 信号和槽函数也就是第2,4个参数传递的是地址,编译器在编译过程中会对数据的正确性进行检查
connect(const QObject* sender, &QObject::signal, const QObject* receiver, &QObject::method);

4.2.2 Qt4的连接方式

       这种旧的信号槽连接方式在Qt5中是支持的,但是不推荐使用,因为这种方式在进行信号槽的连接的时候,信号槽函数通过宏SIGNAL和SLOT转换为字符串类型。

       因为信号槽函数的 转换是通过宏来进行转换的,因此传递到宏函数内部的数据不会被进行检测,如果使用者传错了数据,编译器不会报错,但实际上信号槽的连接已经不对了,只有在程序运行起来之后才能发现问题,而且问题不容易被定位。

4.2.3 Qt5处理方式错误的原因

       上边的写法之所以错误是因为这个类中信号槽都是重载过的, 信号和槽都是通过函数名去关联函数的地址, 但是这个同名函数对应两块不同的地址, 一个带参, 一个不带参, 因此编译器就不知道去关联哪块地址了, 所以如果我们在这种时候通过以上方式进行信号槽连接, 编译器就会报错。

4.2.4 总结:

  • Qt4的信号槽连接方式因为使用了宏函数, 宏函数对用户传递的信号槽不会做错误检测, 容易出bug
  • Qt5的信号槽连接方式, 传递的是信号槽函数的地址, 编译器会做错误检测, 减少了bug的产生
  • 当信号槽函数被重载之后, Qt4的信号槽连接方式不受影响
  • 当信号槽函数被重载之后, Qt5中需要给被重载的信号或者槽定义函数指针

五、Lambda表达式

5.1 语法格式

Lambda表达式就是一个匿名函数,语法格式如下:

[capture](params) opt-> ret{ body; };--capture:捕获列表--params:参数列表--opt:函数选项--ret:返回值类型--body:函数体

5.1.1 捕获列表:捕获一定范围内的变量

  • [ ]:不捕捉任何变量
  • [&]:捕获外部作用域中的所有变量,并作为引用在函数体内使用(按引用捕获)
  • [=]:捕获外部作用域中的所有变量 ,并作为副本在函数体内使用(按值捕获),拷贝的副本在匿名函数体内是只读的
  • [= , &foo]:按值捕获外部作用域中的所有变量,并按照引用捕获外部变量foo
  • [bar]:按值捕获bar变量,同时不捕获其他变量
  • [&bar]:按引用捕获bar变量,同时不捕获其他变量
  • [this]:捕获当前类中的this指针,让lambda表达式拥有和当前成员函数同样的访问权限,如果已经使用了&或者=,默认添加次选项

5.1.2 参数列表:和普通函数的参数列表一样

5.1.3 opt选项 -> 可以省略

  • mutable:可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)
  • execption:指定函数抛出的异常,如抛出整数类型的异常,可以使用throw()

5.1.4 返回值类型

       表示函数返回值的类型,当返回值为void,或者函数体中只有溢出return的地方(此时编译器可以自动推断出返回值的类型)时,这部分可以省略。

5.1.5 函数体

       函数的实现,这部分不能省略,但是函数体可以为空。

5.2 定义和调用

       因为Lambda表达式是一个匿名函数,因此是没有函数声明的,直接在程序中进行代码的定义即可,但是如果只定义匿名函数在程序执行过程中是不糊被调用的。

// 匿名函数的定义,程序执行这个匿名函数是不会被调用的
[]() {qDebug() << "Hello, I am lambda...";
};// 匿名函数的定义 + 调用
int ret = [](int a) -> int 
{return a + 1;
}(100); // 100是传递给匿名函数的参数

       在Lambda表达式中的捕获列表中也就是[ ] 中添加不同的关键字,就可以在函数体中使用外部变量了。

// 在匿名函数外部定义变量
int a = 100, b = 200, c = 300;// 调用匿名函数
// 使用引用的方式传递数据
[&](){qDebug() << "a + 1:" << a++ << ", b + c = " << b + c;
}();// 值拷贝的方式使用外部数据
[=](int m, int n) mutable{qDebug() << "Hello, 我是一个lambda表达式...";qDebug() << "使用拷贝的方式传递数据:";// 拷贝的外部数据在函数体内部是只读的,如果不添加mutable关键字是不能修改这些只读数据的值// 添加mutable允许修改的数据是拷贝到函数内部的副本,对外部数据没有影响qDebug() << "a + 1:" << a++ << ", b + c = " << b + c;qDebug() << "m + 1:" << ++m << ", n: " << n;
}(1, 2);

相关文章:

【Qt】Qt中的信号槽

一、信号和槽概述 信号槽是Qt矿建引以为豪的机制之一。 所谓信号槽&#xff0c;实际上就是观察者模式&#xff08;发布——订阅模式&#xff09;。当某个事件发生之后&#xff0c;比如&#xff0c;按钮检测到自己被点击了一下&#xff0c;它就会发出一个信号。这种发出的信号是…...

VsCode个人插件

Auto Rename Tag > 同时修改标签 Rainbow Brackets > 不同层级不同括号颜色 Dracula Official > 个人比较喜欢的一款主题 Error Lens > 错误信息显示 ES7REACT/Redux/React-Native>react开发插件 ESLINT Indenticator>方便看结构 Prettier Formatter …...

Docker环境安装并使用Elasticsearch

1、拉取es docker pull elasticsearch:7.10.12、查看镜像 docker images3、启动es docker run -d --name esearch -p 9200:9200 -p 9300:9300 elasticsearch:7.10.14、如果启动ES时出现一下问题 Unable to find image docker.elastic.co/elasticsearch/elasticsearch:7.10.…...

中心渗透Ⅱ

cs与msf权限传递以及mimikatz抓取win2012明文密码 使用Cobalt Strike抓取win2012明文密码&#xff0c;将会话传递到Metasploit Framework上 1.cs生成木马并使目标服务器中马 建立监听生成木马 2.抓取目标主机的明文密码 通过修改注册表来让Wdigest Auth保存明文口令 shell …...

【webrtc】RtpToNtpEstimator:最小二乘法、ntp估计及c++实例

上一篇: 【webrtc】RtpToNtpEstimator:将 RTP 时间戳映射到 NTP 时间 分析了最小二乘法的实现及对rtp到ntp的映射计算的调用流程 基于最小二乘法进行估计 RtpToNtpEstimator::Estimate G:\CDN\rtcCli\m98\src\system_wrappers\source\rtp_to_ntp_estimator.cc RtpToNtpEstima…...

【DevOps】Elasticsearch在Ubuntu 20.04上的安装与配置:详细指南

目录 一、ES 简介 1、核心概念 2、工作原理 3、 优势 二、ES 在 Ubuntu 20.04 上的安装 1、安装 Java 2、下载 ES 安装包 3、创建 ES 用户 4 、解压安装包 5、 配置 ES 6、 启动 ES 7、验证安装 三、ES 常用命令 1、创建索引 2、 插入文档 3、查询文档 四、ES…...

windows内存管理

一 windows系统的内存管理涉及哪些 1.1 虚拟内存管理机制 windows操作系统使用虚拟内存技术&#xff0c;将磁盘文件&#xff0c;通过映射对象&#xff08;存储在物理内存&#xff09;关联&#xff0c;映射到虚拟内存作为文件试图。即用户操作"虚拟内存中File View Objec…...

c++ 将指针转换为 void* 后,转换为怎么判断原指针类型?

当将指针转换为void后&#xff0c;擦除了指针所指向对象的类型信息&#xff0c;因此无法通过void指针来判断原始指针的类型。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个…...

Swift 属性

属性 一、存储属性1、常量结构体实例的存储属性2、延时加载存储属性3、存储属性和实例变量 二、计算属性1、简化 Setter 声明2、简化 Getter 声明3、只读计算属性 三、属性观察器四、属性包装器1、设置被包装属性的初始值2、从属性包装器中呈现一个值 五、全局变量和局部变量六…...

基于maxkey接入jeecgboot并实现账户同步

1. 注册应用 1.1 在统一认证中心注册第三方应用 1.1.1 填写应用名和登录地址 1.1.2 填写认证地址授权方式和作用域 1.1.3 选择权限范围并提交 1.2 配置访问权限 1.2.1 指定用户组 1.1.2 选择注册的应用 1.1.3 在单点登录认证页面查看添加的应用 1.3 同步一个第三方应用的账号…...

kafka Kerberos集群环境部署验证

背景 公司需要对kafka环境进行安全验证,目前考虑到的方案有Kerberos和SSL和SASL_SSL,最终考虑到安全和功能的丰富度,我们最终选择了SASL_SSL方案。处于知识积累的角度,记录一下kafka keberos安装部署的步骤。 机器规划 目前测试环境公搭建了三台kafka主机服务,现在将详细…...

[C++]debug介绍+debug时如何查看指针指向内存处的值

一、简介 预备工具和知识&#xff1a;使用使用VSCode使用Debug。 本文简介&#xff1a;本文将简要介绍debug中Continue&#xff0c;Step Over&#xff0c;Step Into和Restart的功能。并介绍如何在debug时查看动态内存地址&#xff08;指针&#xff09;的值&#xff1b; 二、D…...

AI学习指南数学工具篇-凸优化在支持逻辑回归中的应用

AI学习指南数学工具篇-凸优化在支持逻辑回归中的应用 一、引言 在人工智能领域&#xff0c;逻辑回归是一种常见的分类算法&#xff0c;它通过学习样本数据的特征和标签之间的关系&#xff0c;来进行分类预测。而在逻辑回归算法中&#xff0c;凸优化是一种重要的数学工具&…...

Flutter 中的 AspectRatio 小部件:全面指南

Flutter 中的 AspectRatio 小部件&#xff1a;全面指南 Flutter 是一个流行的跨平台 UI 框架&#xff0c;它提供了丰富的小部件来帮助开发者构建高质量的应用程序。在 Flutter 的小部件库中&#xff0c;AspectRatio 是一个非常有用的小部件&#xff0c;它允许开发者以一种简单…...

应用程序中的会话管理和Cookie安全指南

应用程序中的会话管理和Cookie安全指南 在现代应用程序中&#xff0c;会话管理和Cookie安全是确保用户信息和数据安全的重要组成部分。本文将详细介绍会话管理的最佳实践以及如何通过安全的Cookie设置来保护会话ID的交换。 单点登录&#xff08;SSO&#xff09;及会话管理机制…...

备战秋招c++ 【持续更新】

T1 牛牛的快递 原题链接&#xff1a;牛牛的快递_牛客题霸_牛客网 (nowcoder.com) 题目类型&#xff1a;模拟 审题&确定思路&#xff1a; 1、超过1kg和不足1kg有两种不同收费方案 ---- 起步价问题 2、超出部分不足1kg的按1kg计算 ----- 向上取整 3、向上取整的实现思路…...

整数拆分~

way&#xff1a;process //上一个拆出来的数是pre //还剩下rest需要去拆 //返回拆解的方法数 #include<iostream> using namespace std;//上一个拆出来的数是pre //还剩下rest需要去拆 //返回拆解的方法数 int process(int pre, int rest) {if(rest0) return 1;//因为后…...

【Qt Creator】跨平台的C++图形用户界面应用程序开发框架---QT

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1.互联网的核心岗位以及职…...

KingbaseES数据库物理备份还原sys_rman

数据库版本&#xff1a;KingbaseES V008R006C008B0014 简介 sys_rman 是 KingbaseES 数据库中重要的物理备份还原工具&#xff0c;支持不同类型的全量备份、差异备份、增量备份&#xff0c;保证数据库在遇到故障时及时使用 sys_rman 来恢复到数据库先前状态。 文章目录如下 1.…...

【CV】视频图像背景分割MOG2,KNN,GMG

当涉及背景分割器&#xff08;Background Subtractor&#xff09;时&#xff0c;Mixture of Gaussians&#xff08;MOG2&#xff09;、K-Nearest Neighbors&#xff08;KNN&#xff09;和Geometric Multigid&#xff08;GMG&#xff09;是常用的算法。它们都用于从视频流中提取…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...