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

QT | 信号与槽(超详解)

 前言
对qt信号和槽的详细解释

💓 个人主页:普通young man-CSDN博客

⏩ 文章专栏:C++_普通young man的博客-CSDN博客

⏩ 本人giee:   普通小青年 (pu-tong-young-man) - Gitee.com

      若有问题 评论区见📝

🎉欢迎大家点赞👍收藏⭐文章
————————————————


目录

信号和槽的概述

信号的本质

槽的本质

信号和槽的使用

FunctionPointer ::Object *sender 参数解释

代码实现:

可视化实现

自定义信号和槽

信号函数实现的要求

通过按键发送信号

信号和槽带参数

代码展示:

违反规则举例:

信号和槽的关系

一对一

⼀对多

多对一

信号与槽的断开

Lambda的利用

信号与槽的优缺点

优点:松散耦合

缺点:效率较低

低耦合高聚合

低耦合

高聚合


信号和槽的概述

在 Qt 中,用户与控件的每次交互都构成一个事件,如 “用户点击按钮”“用户关闭窗口” 等。每个事件都会发出相应信号,像点击按钮会发出 “按钮被点击” 信号,关闭窗口会发出 “窗口被关闭” 信号。

Qt 里的所有控件都具备接收信号的能力,且一个控件可接收多个不同信号。对于接收到的信号,控件会做出相应响应动作,这种响应动作在 Qt 中被称为。例如,按钮所在窗口接收到 “按钮被点击” 信号后,可能做出 “关闭自己” 的响应;输入框接收到 “输入框被点击” 信号后,会 “显示闪烁的光标,等待用户输入数据”。

信号和槽是 Qt 独有的消息传输机制,其作用是将相互独立的控件关联起来。以 “按钮” 和 “窗口” 为例,它们原本是独立控件,点击按钮不会对窗口产生影响,但通过信号和槽机制,就能实现 “点击按钮使窗口关闭” 的效果。

信号的本质

信号的本质就是事件,比如用户的点击就可以是一个点击事件,窗口的刷新,鼠标的悬停,按下,释放,键盘的输入等等。

qt中其实信号就是一个函数,当事件产生qt的框架就会通知这个函数,然后这个函数就会发出当前的这个信号(发出这个信号也可以想成一种函数返回)

槽的本质

槽的本质就是处理信号发出的信号并完成对应的动作 , 槽也就是响应信号的一个函数,可以这么想,信号发出,槽函数接收到之后就执行相关操作槽函数和一般函数的区别:槽函数可以与一个信号关联,当信号发出的时候,关联的槽函数自动执行。

注:

在 Qt 的信号和槽机制中,其底层是通过函数间的相互调用来实现的。每个信号都可以用函数表示,这类函数被称为信号函数;每个槽也能用函数来表示,被叫做槽函数。

 

例如,“按钮被按下” 这一信号可以用 clicked() 函数来表示,“窗口关闭” 这个槽则可以用 close() 函数表示。若要使用信号和槽机制实现 “点击按钮会关闭窗口” 的功能,本质上就是 clicked() 函数调用 close() 函数所达成的效果。

 

信号函数和槽函数通常存在于某个类中,与普通成员函数相比,它们具有以下特别之处:

 
  • 关键字修饰:信号函数使用 signals 关键字修饰,槽函数则使用 public slotsprotected slots 或者 private slots 修饰。signals 和 slots 是 Qt 在 C++ 基础上扩展的关键字,专门用于指明信号函数和槽函数。
  • 定义要求:信号函数只需进行声明,无需进行定义(实现);而槽函数则需要进行定义(实现)。

信号和槽的使用

再QT中,QObject类提供了一个静态成员函数connect(),用来连接信号函数与槽函数。

/*** @brief 该函数用于在 Qt 中建立信号和槽之间的连接,实现对象间的通信机制。** 在 Qt 的事件驱动编程模型里,信号和槽是核心机制,它使得对象之间可以以一种松耦合的方式进行交互。* 当信号发出时,与之相连的槽函数会被调用执行。** @param sender 指向发出信号的对象的指针,该对象必须是 QObject 或其子类的实例。*               信号就是从这个对象产生的,例如一个按钮对象可以发出被点击的信号。** @param signal 要连接的信号,以字符串形式表示。*               通常使用 SIGNAL() 宏来生成这个字符串,例如 SIGNAL(clicked()) 表示按钮被点击的信号。*               此字符串准确描述了要监听的信号名称。** @param receiver 指向接收信号并执行相应槽函数的对象的指针,同样要求是 QObject 或其子类的实例。*                 当 sender 发出 signal 信号时,receiver 对象中的相应槽函数会被触发。** @param method 要连接的槽函数,以字符串形式表示。*               一般使用 SLOT() 宏来生成,例如 SLOT(close()) 表示关闭窗口的槽函数。*               它指定了当信号发出时,receiver 对象中要执行的具体函数。** @param type 连接类型,指定了信号和槽之间的连接方式,默认值为 Qt::AutoConnection。*             不同的连接类型决定了槽函数何时以及如何被调用,具体如下:*             - Qt::AutoConnection:根据 sender 和 receiver 是否在同一线程自动选择连接方式。*                                   如果在同一线程,采用直接连接;否则采用队列连接。*             - Qt::DirectConnection:信号发出时直接调用槽函数,不考虑线程问题,槽函数会立即执行。*             - Qt::QueuedConnection:将槽函数调用放入 receiver 所在线程的事件队列中,*                                   槽函数会在 receiver 所在线程的事件循环中被处理,确保线程安全。*             - Qt::BlockingQueuedConnection:与 Qt::QueuedConnection 类似,但会阻塞 sender 线程,*                                   直到槽函数执行完毕,适用于需要等待槽函数执行结果的情况。*             - Qt::UniqueConnection:确保连接是唯一的,避免重复连接。若已经存在相同的连接,不会再次建立。** @return 如果成功建立连接,返回 true;若连接失败(如信号或槽不存在等原因),返回 false。*/
bool connect (const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection);

注:

connect函数在连接信号和槽的时候,比如我是一个QPushButton的控件,那connect函数的第二个参数必须是QPushButton的信号函数(父类的信号),不能是其他类的函数

对connect函数的第二,四个参数做解答:

你会发现这两个参数居然传的是char*,我们再来看看我传入的函数是什么返回类型:

返回类型void(*)()函数指针,难道函数指针 == char* ,这当然是不可能的。

这里上面有一个解决办法:
就是在传参数的时候加上两个宏

SIGNAL和SLOT(将函数指针进行转换,就可以传入)

SIGNAL 宏

把信号函数名转换为字符串。在使用 connect 函数连接信号和槽时,要以字符串形式指定信号,SIGNAL 宏就负责完成这个转换,方便将信号和对应的对象关联起来。

SLOT 宏

将槽函数名转换为字符串。同样在 connect 函数中,需要以字符串形式指定槽函数,SLOT 宏能把槽函数转换为符合要求的字符串,从而建立信号和槽之间的连接。

其实,这个connect并不是用的声明上的版本,当我们ctrl+鼠标左键点击connect函数的时候,你会发现是一个qt5之后的版本,这个新的版本还是泛型编程,使得更加灵活

FunctionPointer<Func1>::Object *sender 参数解释

萃取器(Traits)的概念

萃取器是 C++ 模板编程中的一种技术,它的核心作用是从某种类型中提取相关的属性或信息。萃取器通常以模板类的形式呈现,通过模板特化来针对不同的类型提供不同的实现。借助萃取器,我们能够在编译时获取类型的相关信息,从而实现更具通用性和灵活性的代码。

FunctionPointer<Func1>::Object 作为萃取器的解释

FunctionPointer 是 Qt 内部的一个模板类,其主要目的是在编译时对函数指针类型进行解析,进而提取出与该函数指针相关的各种信息,像函数的返回类型、参数类型以及函数所属的对象类型等。FunctionPointer<Func1>::Object 专门用于从信号或槽的函数指针类型 Func1 中提取出函数所属的对象类型。

简单说就是一个模板的特化

代码实现:

我简单的创建一个按键:

如果你想查看自带的信号:可以点到哪个函数之后按键盘上的F1,就可以打开相关文档

这里讲解一个东西,就是你在敲代码的时候会发现:

当你调用自带的信号函数的时候,出现了click和一个clicked,这两个一个就是点击了一下(锯齿图标),一个是点击之后会发出信号(信号发射图标),这个你可以自己试一试效果,当你把clicked改成click的时候就会发现点击按钮的时候,什么效果都没有,原因就是没发出信号。

还有这个close()是Widget内置的槽函数,作用就是关闭这个窗口并且释放。


可视化实现

首先双击这个ui文件,进入可视化的面板

然后托一个按钮,当然你可以自己调整大小,文字大小,位置等等

clicked()就是点击的意思,这个大家如果英语不好的话可以自己翻译一下,双击

双击之后就会在widget.cpp生成出这个函数

  1. 槽函数名称以 on 开头,并且通过下划线将各部分连接起来。
  2. XXX 表示对象名,即控件的 objectName 属性值。该属性可以在 Qt 设计器中设置,用于唯一标识一个控件对象。
  3. SSS 表示对应的信号名称。例如,按钮被点击这一动作对应的信号为 clicked

自定义信号和槽

自定义信号不是很常见,因为在GUI qt这么个框架可以是可以穷举这些信号,因此在qt中可以应付大多数场景。

信号实现起来很简单,因为本质就是一个函数,和槽函数一样比较特殊,但是在qt5中已经和普通的成员函数差不多,因为都继承自最高的那个父类。

信号函数实现的要求

  1. 类定义
    • 继承自 QObject
    • 添加 Q_OBJECT 宏
  2. 信号声明
    • 放在 signals 部分
    • 返回类型为 void
    • 无需实现体
  3. 信号发射
    • 使用 emit 关键字(现在在qt5中也可以不用这个关键字,但是为了代码的易读性,建议添加)
  4. 信号连接
    • 用 QObject::connect 函数
    • 信号与槽参数类型兼容

通过一段代码具体讲解

通过emit发送信号(如果不使用emit就像直接调用函数一样去调用这个信号函数,在编译的时候就会自定发出信号),但是现在就是一个简单的信号,他现在什么操作都没有

调用自己的信号函数

我们通过connect来连接一个槽函数:

代码编译结果:
发现我改变了窗口的标题

如果我们不调用信号函数,就什么都不会发生:

通过按键发送信号

编译结果:

信号和槽带参数

信号和槽函数也是可以带参数的,但是嘞有要求:
1.信号的槽函数的参数必须一 一对应

2.信号的参数个数 >= 槽的参数个数

代码展示:

首先给一个两个按钮

通过按钮点击发送信号,但是这个信号函数是带参数的,也就是说他会带上这个参数一起发送出去

槽函数会接收这个信号以及参数

你可能会问他们怎么就能传参?其实大家不要忘了connect函数可以连接这两个函数,所以要求大家信号函数和槽函数的参数一定要保持一致

违反规则举例:

当槽函数的参数比信号多的时候,就会报错不匹配

从这个代码可以看出槽函数的参数是两个,当我们编译的时候就会被检查到信号和插槽参数不兼容

那为什么槽函数就不能比信号的参数多,而信号的参数就可以比槽函数的参数少嘞?

其实简单的说就是一种传递机制,信号函数作为发送端,槽函数作为接收端,这里我们必须解释一下在qt中信号和槽函数是一个多对多的关系,下面我专门来一个标题

信号和槽的关系
 
一对一

一个信号连接一个槽。一个信号连接一个信号。

⼀对多

⼀个信号连接多个槽

多对一

多个信号连接⼀个槽函数

  • 参数传递机制
    • Qt 的信号与槽连接机制在实现时,会根据信号和槽的参数信息进行参数传递。当信号参数多于槽函数参数时,Qt 可以很方便地忽略多余的参数,只传递槽函数需要的参数。
    • 但如果槽函数参数多于信号参数,就无法实现参数的正确传递,因为没有足够的信息来填充槽函数的所有参数。

信号与槽的断开

断开连接我们到的是disconnect 函数,他的参数列表:

  • 第一个参数 ui->pushButton 是信号的发送者,也就是按钮对象。
  • 第二个参数 &QPushButton::clicked 是要断开连接的信号。
  • 第三个参数 this 是信号的接收者,也就是 Widget 对象。
  • 第四个参数 &Widget::handlefunc 是要断开连接的槽函数。

下面我直接通过一个代码直观的看出他的作用:

通过这个代码,我可以实现通过第一个按钮进行打印标题一

当点击槽函数切换的按钮是,它会断开之前的连接,重新连接新的槽函数,再次点击按钮一打印标题二

可以打印日志来看是否切换


Lambda的利用

其实qt中使用的是c++11:

直接上代码:

通过这段代码,解释一下,我创建了一个按钮,然后给他设置了一个文字,lambada实现一个我点击之后他会到目标xy坐标位置

connect本来就是一个泛型的,lambada可以又std::function()包装器接收

使用lambada时候需要注意:

lambada由于作用域的原因需要捕获外部变量,这个是c++11的基础,所以这里访问不到tmp,

注意qt不需要传引用,因为qt中很多api的参数都是指针,所以直接传值和传引用是一样的

捕获方式语法示例解释特点示例代码
值捕获[var1, var2, ...]明确指定要捕获的外部变量,Lambda 内部会复制这些变量的值。- 外部变量的修改不会影响 Lambda 内部的值。
- Lambda 内部对捕获变量的修改不会影响外部变量。
cpp<br>int x = 10;<br>auto lambda = [x]() {<br> return x * 2;<br>};<br>x = 20;<br>std::cout << lambda() << std::endl; // 输出 20<br>
引用捕获[&var1, &var2, ...]明确指定以引用的方式捕获外部变量,Lambda 内部使用的是外部变量的引用。- 外部变量的修改会影响 Lambda 内部的值。
- Lambda 内部对捕获变量的修改会影响外部变量。
cpp<br>int x = 10;<br>auto lambda = [&x]() {<br> x *= 2;<br>};<br>lambda();<br>std::cout << x << std::endl; // 输出 20<br>
隐式值捕获[=]以值的方式捕获所有外部变量。- 方便快捷,无需逐个列出要捕获的变量。
- 外部变量的修改不会影响 Lambda 内部的值。
cpp<br>int x = 10, y = 20;<br>auto lambda = [=]() {<br> return x + y;<br>};<br>x = 30; y = 40;<br>std::cout << lambda() << std::endl; // 输出 30<br>
隐式引用捕获[&]以引用的方式捕获所有外部变量。- 方便捕获多个变量。
- 外部变量的修改会影响 Lambda 内部的值,反之亦然。
cpp<br>int x = 10, y = 20;<br>auto lambda = [&]() {<br> x += y;<br>};<br>lambda();<br>std::cout << x << std::endl; // 输出 30<br>
混合捕获[=, &var1] 或 [&, var1]结合了隐式捕获和显式捕获,[=, &var1] 表示除 var1 以引用方式捕获外,其他变量以值的方式捕获;[&, var1] 表示除 var1 以值的方式捕获外,其他变量以引用方式捕获。

信号与槽的优缺点

优点:松散耦合

  • 信号发送者无需知晓哪个对象的槽函数会接收其发出的信号,槽函数也不必了解有哪些信号与其关联,Qt 的信号槽机制会保障信号与槽函数的调用。
  • 支持信号槽机制的类或其父类必须继承自 QObject 类。

缺点:效率较低

  • 相较于回调函数,信号和槽的执行速度稍慢,这是因其提供了更高的灵活性。
  • 通过信号调用槽函数比直接调用速度慢约 10 倍,这是由于定位信号接收对象、遍历所有关联、编组和解组传递参数,以及多线程时信号可能需要排队等操作带来的开销。
  • 不过,在对性能要求不是极高的场景中,这种速度差异可忽略不计,能满足绝大部分应用场景。

低耦合高聚合

低耦合

  • 生活类比:想象你和你的邻居是两个 “个体”。你平时的生活和邻居的生活互不干扰,比如你今天决定去看电影,邻居决定在家看书,你们各自的决定和行为基本不会影响到对方。即使邻居突然要出门旅行,对你的日常生活也没有太大的影响,你依然可以按部就班地过自己的日子。这就类似于低耦合的状态,两个个体之间相互依赖程度很低。
  • 编程概念:在编程中,低耦合指的是模块与模块之间的相互依赖程度低。不同的模块就像是不同的 “个体”,它们各自有独立的功能,一个模块的修改或者变动,对其他模块的影响较小。比如在一个大型的电商系统中,用户登录模块和商品推荐模块就是低耦合的。用户登录模块负责处理用户的身份验证和登录相关功能,商品推荐模块根据用户的浏览和购买历史来推荐商品。如果对用户登录模块进行优化,比如增加一种新的登录方式(如指纹登录),一般情况下,这并不会影响到商品推荐模块的正常运行,两个模块之间相互干扰少。

高聚合

  • 生活类比:再拿一个家庭来举例,家庭成员之间分工明确且紧密合作。比如在准备一顿丰盛的晚餐时,爸爸负责买菜,妈妈负责烹饪,孩子负责摆放餐具和收拾餐桌。大家都围绕着 “准备晚餐” 这个目标行动,各自的任务都和这个目标紧密相关,并且相互配合得很好。这就像高聚合的状态,大家为了一个共同的目标,各自的工作都高度相关且集中。
  • 编程概念:在编程里,高聚合是指一个模块内部的各个组成部分之间的联系紧密,它们都围绕着一个核心功能来设计和实现。例如在一个文本处理软件中,有一个专门用于文本编辑的模块。这个模块内包含了文本的输入、修改、删除、格式设置等功能,这些功能都紧密围绕着 “文本编辑” 这个核心任务。它们之间相互配合,共同完成对文本的各种操作,模块内部的各个部分之间联系紧密,不会出现一些与文本编辑无关的功能混杂在其中,这就是高聚合的体现。/

相关文章:

QT | 信号与槽(超详解)

前言 对qt信号和槽的详细解释 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&am…...

Codecraft-17 and Codeforces Round 391 E. Bash Plays with Functions 积性函数

题目链接 题目大意 定义函数 f r ( n ) f_r(n) fr​(n) : 在 r 0 r0 r0时&#xff0c;为满足 p p p ⋅ \cdot ⋅ q n qn qn , 且 g c d ( p , q ) 1 gcd(p,q)1 gcd(p,q)1 的有序对 ( p , q ) (p,q) (p,q) 个数&#xff1b;在 r r r ≥ \geq ≥ 1 1 1时&#xff0…...

粉尘环境下的智能生产革命 ——助力矿山行业实现高效自动化作业

在矿山开采领域&#xff0c;运输系统是保障生产连续性的核心环节。然而&#xff0c;粉尘弥漫、环境恶劣、设备分散等问题&#xff0c;长期制约着矿山运输的效率与安全性。传统的集中式控制系统难以适应复杂工况&#xff0c;而远程分布式 IO 模块与 PLC 的深度融合&#xff0c;正…...

更新vscode ,将c++11更新到c++20

要在CentOS系统中安装最新版本的GCC&#xff0c;你可以使用SCL&#xff08;Software Collections&#xff09;仓库&#xff0c;它提供了开发工具的最新版本。以下是安装步骤&#xff1a; 1、 添加SCL仓库&#xff1a; 首先&#xff0c;添加CentOS的SCL仓库&#xff0c;该仓库…...

Numpy实训:读取并分析iris数据集中鸢尾花的相关数据

实训中相关数据集&#xff0c;请联系博主邮箱"1438077481qq.com"&#xff0c;在邮箱内发送"iris.csv"即可快速获取&#xff0c;无任何套路&#xff0c;秉承开源精神&#xff01; 1、导入模块 #导入模块 import numpy as np import csv 2、获取数据 iri…...

nats jetstream server code 分析

对象和缩写 jetstream导入两个对象&#xff1a;stream and consumer&#xff0c;在stream 之上构造jetstreamapi。在nats代码中&#xff0c;以下是一些常见的缩写 1.mset is stream 2.jsX is something of jetstream 3.o is consumer 代码分析 对于producer &#xff0c;发送…...

德鲁伊连接池

德鲁伊连接池&#xff08;Druid Connection Pool&#xff09;是一个开源的Java数据库连接池项目&#xff0c;用于提高数据库连接的性能和可靠性。德鲁伊连接池通过复用数据库连接、定时验证连接的可用性、自动回收空闲连接等机制&#xff0c;有效减少了数据库连接的创建和销毁开…...

Python从入门到精通1:FastAPI

引言 在现代 Web 开发中&#xff0c;API 是前后端分离架构的核心。FastAPI 凭借其高性能、简洁的语法和自动文档生成功能&#xff0c;成为 Python 开发者的首选框架。本文将从零开始&#xff0c;详细讲解 FastAPI 的核心概念、安装配置、路由设计、请求处理以及实际应用案例&a…...

C语言经典案例-菜鸟经典案例

1.输入某年某月某日&#xff0c;判断这一天是这一年的第几天&#xff1f; //输入某年某月某日&#xff0c;判断这一天是这一年的第几天&#xff1f; #include <stdio.h>int isLeapYear(int year) {// 闰年的判断规则&#xff1a;能被4整除且&#xff08;不能被100整除或…...

SpringBoot过滤器(Filter)的使用:Filter接口、FilterRegistrationBean类配置、@WebFilter注释

1、过滤器(Filter)的介绍 Spring Boot 的过滤器用于对数据进行过滤处理。通过 Spring Boot 的过滤器,程序开发人员不仅可以对用户通过 URL 地址发送的请求进行过滤处理(例如:过滤一些错误的请求或者请求中的敏感词等),而且可以对服务器返回的数据进行过滤处理(例如:压…...

采用内存局部性分配有什么好处?

内存分配时的局部性分配&#xff08;Locality of Allocation&#xff09;是指将相关的内存对象分配在相邻或相近的内存区域中。这种分配策略在现代计算机系统中具有显著的好处&#xff0c;主要体现在以下几个方面&#xff1a; 1. 提高缓存命中率 现代计算机系统依赖于多级缓存…...

一周热点-OpenAI 推出了 GPT-4.5,这可能是其最后一个非推理模型

在人工智能领域,大型语言模型一直是研究的热点。OpenAI 的 GPT 系列模型在自然语言处理方面取得了显著成就。GPT-4.5 是 OpenAI 在这一领域的又一力作,它在多个方面进行了升级和优化。 1 新模型的出现 GPT-4.5 目前作为研究预览版发布。与 OpenAI 最近的 o1 和 o3 模型不同,…...

分布式ETCD面试题及参考答案

目录 ETCD 适用的六大场景及其实现原理 ETCD 与 Redis 在分布式锁实现上的差异 解释 ETCD 的 Watch 机制及其应用场景 ETCD 如何实现服务发现?与 ZooKeeper 有何不同? ETCD 实现服务发现的方式 与 ZooKeeper 的不同 ETCD 的键值存储模型支持哪些操作? 为什么 ETCD 适…...

MySQL进阶-关联查询优化

采用左外连接 下面开始 EXPLAIN 分析 EXPLAIN SELECT SQL_NO_CACHE * FROM type LEFT JOIN book ON type.card book.card; 结论&#xff1a;type 有All ,代表着全表扫描&#xff0c;效率较差 添加索引优化 ALTER TABLE book ADD INDEX Y ( card); #【被驱动表】&#xff0…...

ESP32驱动OV3660摄像头实现EdgeImpulse图像识别(摄像头支持红外夜视、边缘AI计算)

目录 1、传感器特性 2、硬件原理图 3、驱动程序 ESP32-S3 AI智能摄像头模块是一款专为智能家居和物联网应用打造的高性能边缘AI开发模组。它集成了摄像头、麦克风、音频功放、环境光传感器和夜视补光灯,无需依赖云端即可实现本地化AI推理。 凭借TensorFlow Lite、YOLO和O…...

SpringSecurity认证授权完整流程

SpringSecurity认证流程&#xff1a;loadUserByUsername&#xff08;&#xff09;方法内部实现。 实现步骤&#xff1a; 构建一个自定义的service接口&#xff0c;实现SpringSecurity的UserDetailService接口。建一个service实现类&#xff0c;实现此loadUserByUsername方法。…...

java_了解反射机制

目录 1. 定义 2. 用途 3. 反射基本信息 4. 反射相关的类 4.1 class类&#xff08;反射机制的起源&#xff09; 4.1.1 Class类中的相关方法&#xff08;方法的具体使用在后面的示例中&#xff09; 4.2 反射的示例 4.2.1 获得Class对象的三种方式 4.2.2 反射的使用 Fiel…...

【赵渝强老师】管理MongoDB的运行

MongoDB提供了mongod命令用于启动MongoDB服务器端&#xff1b;而停止MongoDB服务器却可以通过几种不同的方式完成。下面分别进行介绍。 一、【实战】启动MongoDB服务器 通过执行下面的语句可以查看启动MongoDB服务器的帮助信息&#xff1a; mongod --help# 输出的信息如下&a…...

【学习思维模型】

学习思维模型 一、理解类模型二、记忆类模型三、解决问题类模型四、结构化学习模型五、效率与习惯类模型六、高阶思维模型七、实践建议八、新增学习思维模型**1. 波利亚问题解决四步法****2. 主动回忆(Active Recall)****3. 鱼骨图(因果图/Ishikawa Diagram)****4. MECE原则…...

阿里发布新开源视频生成模型Wan-Video,支持文生图和图生图,最低6G就能跑,ComFyUI可用!

Wan-Video 模型介绍&#xff1a;包括 Wan-Video-1.3B-T2V 和 Wan-Video-14B-T2V 两个版本&#xff0c;分别支持文本到视频&#xff08;T2V&#xff09;和图像到视频&#xff08;I2V&#xff09;生成。14B 版本需要更高的 VRAM 配置。 Wan2.1 是一套全面开放的视频基础模型&…...

安孚科技携手政府产业基金、高能时代发力固态电池,开辟南孚电池发展新赛道

安孚科技出手&#xff0c;发力固态电池。 3月7日晚间&#xff0c;安孚科技&#xff08;603031.SH&#xff09;发布公告称&#xff0c;公司控股子公司南孚电池拟与南平市绿色产业投资基金有限公司&#xff08;下称“南平绿色产业基金”&#xff09;、高能时代&#xff08;广东横…...

moodle 开源的在线学习管理系统(LMS)部署

一、Moodle 简介 Moodle&#xff08;Modular Object-Oriented Dynamic Learning Environment&#xff09;是一个开源的在线学习管理系统&#xff08;LMS&#xff09;&#xff0c;广泛应用于教育机构和企业培训。其核心功能包括课程管理、作业提交、在线测试、论坛互动和成绩跟…...

设备树的概念

可以理解为设备树的树干是系统总线&#xff0c;树枝上面是其他的不同的通信协议线。对于不同通信协议的设备挂载在对应的节点即可 在设备树出现以前&#xff0c;所有关于设备的具体信息都要写在驱动里&#xff0c;一旦外围设备变化&#xff0c;驱动代码就要重写。 ​ 引入了设…...

【ArcGIS】地理坐标系

文章目录 一、坐标系理论体系深度解析1.1 地球形态的数学表达演进史1.1.1 地球曲率的认知变化1.1.2 参考椭球体参数对比表 1.2 地理坐标系的三维密码1.2.1 经纬度的本质1.2.2 大地基准面&#xff08;Datum&#xff09;的奥秘 1.3 投影坐标系&#xff1a;平面世界的诞生1.3.1 投…...

MATLAB控制函数测试要点剖析

一、功能准确性检验 基础功能核验 针对常用控制函数&#xff0c;像用于传递函数建模的 tf 、构建状态空间模型的 ss &#xff0c;以及开展阶跃响应分析的 step 等&#xff0c;必须确认其能精准执行基础操作。以 tf 函数为例&#xff0c;在输入分子与分母系数后&#xff0c;理…...

如何让一个类作为可调用对象被thread调用?

如何让一个类作为可调用对象&#xff0c;被 std::thread 调用 在 C 中&#xff0c;可以让一个类对象作为可调用对象&#xff08;Callable Object&#xff09;&#xff0c;然后用 std::thread 进行调用。要实现这一点&#xff0c;主要有三种方法&#xff1a; 重载 operator()&…...

OpenWrt 串口终端常用命令---拓展篇

以下进一步拓展 OpenWrt 串口终端常用命令,新增更多高级操作与场景化工具,助你深入掌握系统管理与调试技巧: 一、系统信息与状态查询(扩展) 硬件详细探测 cat /proc/mtd # 查看 Flash 分区表(MTD 设备) mtd info # 显示 MTD 分…...

线上接口tp99突然升高如何排查?

当线上接口的 TP99 突然升高时&#xff0c;意味着该接口在 99% 的情况下响应时间变长&#xff0c;这可能会严重影响系统的性能和用户体验。可以按照下面的步骤进行排查。这里我们先说明一下如何计算tp99&#xff1a;监控系统计算 TP99&#xff08;第 99 百分位数的响应时间&…...

如何借助人工智能AI模型开发一个类似OpenAI Operator的智能体实现电脑自动化操作?

这几天关于Manus的新闻铺天盖地&#xff0c;于是研究了一下AI智能体的实现思路&#xff0c;发现Openai 的OpenAI Operator智能体已经实现了很强的功能&#xff0c;但是每月200美金的价格高不可攀&#xff0c;而Manus的邀请码据说炒到了几万块&#xff01;就想能不能求助人工智能…...

langchain系列(终)- LangGraph 多智能体详解

目录 一、导读 二、概念原理 1、智能体 2、多智能体 3、智能体弊端 4、多智能体优点 5、多智能体架构 6、交接&#xff08;Handoffs&#xff09; 7、架构说明 &#xff08;1&#xff09;网络 &#xff08;2&#xff09;监督者 &#xff08;3&#xff09;监督者&…...

springboot旅游管理系统设计与实现(代码+数据库+LW)

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本旅游管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助使用者在短时间内处理完毕庞大的数据信息&a…...

【前端跨域】WebSocket如何实现跨域通信?原理、实践与安全指南

在实时通信场景&#xff08;如在线聊天、实时数据推送&#xff09;中&#xff0c;WebSocket因其高效的双向通信能力成为首选技术 然而&#xff0c;当客户端与服务器部署在不同源时&#xff0c;跨域问题同样可能阻碍WebSocket的连接 一、WebSocket与跨域的关系 WebSocket的跨…...

Go红队开发—格式导出

文章目录 输出功能CSV输出CSV 转 结构体结构体 转 CSV端口扫描结果使用CSV格式导出 HTML输出Sqlite输出nmap扫描 JSONmap转json结构体转jsonjson写入文件json编解码json转结构体json转mapjson转string练习&#xff1a;nmap扫描结果导出json格式 输出功能 在我们使用安全工具的…...

Sharp 存在任意文件读取漏洞( DVB-2025-8923)

免责声明 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x01…...

C++数组,链表,二叉树的内存排列是什么样的,结构体占多大内存如何计算,类占多大内存如何计算,空类的空间是多少,为什么?

C数组是连续存储的&#xff0c;C数组元素依次存放在相邻的内存地址之中&#xff0c;并且内存大小相同。 C链表是离散存储的&#xff0c;C链表是由节点构成的&#xff0c;每个节点之中存在节点的值以及指向下一个节点的指针&#xff0c;每个节点是动态分配的。 C二叉树也是离散…...

【vLLM 教程】使用 TPU 安装

vLLM 是一款专为大语言模型推理加速而设计的框架&#xff0c;实现了 KV 缓存内存几乎零浪费&#xff0c;解决了内存管理瓶颈问题。 更多 vLLM 中文文档及教程可访问 →https://vllm.hyper.ai/ vLLM 使用 PyTorch XLA 支持 Google Cloud TPU。 依赖环境​ Google Cloud TPU …...

【RAG】基于向量检索的 RAG (BGE示例)

RAG机器人 结构体 文本向量化: 使用 BGE 模型将文档和查询编码为向量。 &#xff08;BGE 是专为检索任务优化的开源 Embedding 模型&#xff0c;除了本文API调用&#xff0c;也可以通过Hugging Face 本地部署BGE 开源模型&#xff09; 向量检索: 从数据库中找到与查询相关的文…...

【RAG】RAG 系统的基本搭建流程(ES关键词检索示例)

RAG 系统的基本搭建流程 搭建过程&#xff1a; 文档加载&#xff0c;并按一定条件切割成片段将切割的文本片段灌入检索引擎封装检索接口构建调用流程&#xff1a;Query -> 检索 -> Prompt -> LLM -> 回复 1. 文档的加载与切割 # !pip install --upgrade openai…...

PSIM积累经验

1、三极管的部署报错。 出错信息&#xff1a; 元件&#xff1a; R 名称&#xff1a; R2 Error: The RLC branch R2 is connected to the gate node of the switch Q1. The gate node should be connected to an On-Off Controller output. Refer to the switch Help p…...

C++之vector类(超详解)

这节我们来学习一下&#xff0c;C中一个重要的工具——STL&#xff0c;这是C中自带的一个标准库&#xff0c;我们可以直接调用这个库中的函数或者容器&#xff0c;可以使效率大大提升。这节我们介绍STL中的vector。 文章目录 前言 一、标准库类型vector 二、vector的使用 2.…...

Go学习笔记

<!-- 注意* --> 初始化工程 go mod init GoDemo 结构体&#xff0c;接口 type i struct{} type i interface{} 条件&#xff0c;选择 循环 键值对 make(map[string]int) 切片&#xff0c;集合 make([]int,10) 函数 通道 Channel make(chan int) ​ ch <- v…...

前端杂的学习笔记

什么是nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 Nginx是一款轻量级的Web 服务器/反向代理服务器&#xff0c;处理高并发能力是十分强大的&#xff0c;并且支持热部署&#xff0c;启动简单&#xff0c;可以做到7*24不间断运行 正代和反代 学习nginx&a…...

痉挛性斜颈护理:全方位呵护,重燃生活希望

痉挛性斜颈是一种以颈部肌肉不自主收缩导致头部向一侧扭转或倾斜为特征的疾病。对于痉挛性斜颈患者而言&#xff0c;科学有效的护理能够显著提升其生活质量&#xff0c;辅助病情的改善。 生活护理&#xff1a;在生活环境布置上&#xff0c;要充分考虑患者行动的便利性。确保室内…...

MySQL的安装以及数据库的基本配置

MySQL的安装及配置 MySQL的下载 选择想要安装的版本&#xff0c;点击Download下载 Mysql官网下载地址&#xff1a;​ ​https://downloads.mysql.com/archives/installer/​​ MySQL的安装 选择是自定义安装&#xff0c;所以直接选择“Custom”&#xff0c;点击“Next”​ …...

WangEditor快速实现版

WangEditor快速实现版 效果 案例代码 后端 package com.diy.springboot.controller;import cn.hutool.core.util.IdUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiImplicitParam; import org.sp…...

LeetCode Hot100刷题——反转链表(迭代+递归)

206.反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#…...

10.2 继承与多态

文章目录 继承多态 继承 继承的作用是代码复用。派生类自动获得基类的除私有成员外的一切。基类描述一般特性&#xff0c;派生类提供更丰富的属性和行为。在构造派生类时&#xff0c;其基类构造函数先被调用&#xff0c;然后是派生类构造函数。在析构时顺序刚好相反。 // 基类…...

java项目之基于ssm的智能训练管理平台(源码+文档)

项目简介 智能训练管理平台实现了以下功能&#xff1a; 系统可以提供信息显示和相应服务&#xff0c;其管理员增删改查课程信息和课程信息资料&#xff0c;审核课程信息预订订单&#xff0c;查看订单评价和评分&#xff0c;通过留言功能回复用户提问。 &#x1f495;&#x1…...

29-验证回文串

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xff1b;否则&#xf…...

(57)[HGAME 2023 week1]easyasm

nss&#xff1a;3477 [HGAME 2023 week1]easyasm 关于这个题吧&#xff0c;我还是和上一个题一样&#xff0c;我观察到了异或0x33 所以我就把result的结果跟0x33异或&#xff0c;然后我就就这样&#xff0c;做出来了...