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

[QT]深入理解Qt中的信号与槽机制

文章目录

  • 信号与槽
    • 1. 信号和槽概述
      • 信号的本质
      • 槽的本质
      • 说明
    • 2. 信号和槽的使用
      • 2.1 连接信号和槽
      • 2.2 查看内置信号和槽
      • 2.3 通过 Qt Creator 生成信号槽代码
    • 3. 自定义信号和槽
      • 3.1 基本语法
      • 3.2 带参数的信号和槽
        • **示例1:重载信号槽**
        • **示例2:信号槽参数列表匹配规则**
        • **示例3:内置与自定义信号案例**
    • 4. 信号与槽的连接方式
      • 4.1 一对一
      • 4.2 一对多
      • 4.3 多对一
    • 5. 信号和槽的其他说明
      • 5.1 信号与槽的断开
      • 5.2 Qt4 版本信号与槽的连接
      • 5.3 使用 Lambda 表达式定义槽函数
      • 5.4 信号与槽的优缺点

信号与槽

1. 信号和槽概述

  在 Qt 中,用户和控件的每次交互过程称为一个事件。比如 “用户点击按钮” 是一个事件,“用户关闭窗口” 也是一个事件。每个事件都会发出一个信号,例如用户点击按钮会发出 “按钮被点击” 的信号,用户关闭窗口会发出 “窗口被关闭” 的信号。

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

  信号和槽是 Qt 特有的消息传输机制,它能将相互独立的控件关联起来。比如,“按钮” 和 “窗口” 本身是两个独立的控件,点击 “按钮” 并不会对 “窗口” 造成任何影响。但通过信号和槽机制,可以将 “按钮” 和 “窗口” 关联起来,实现 “点击按钮会使窗口关闭” 的效果。在这里插入图片描述

信号的本质

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

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

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

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

在 Qt 中信号的发出者是某个实例化的类对象。

槽的本质

   槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的 C++ 函数是一样的,可以定义在类的任何位置(public、protected 或 private),可以具有任何参数,可以被重载,也可以被直接调用(但是不能有默认参数)。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。在 Qt 中,‌槽函数(Slot)可以理解为一种更高级的、类型安全的回调函数‌。

说明

  1. 信号和槽机制底层是通过函数间的相互调用实现的。每个信号都可以用函数来表示,称为信号函数;每个槽也可以用函数表示,称为槽函数。 例如: “按钮被按下” 这个信号可以用 clicked() 函数表示,“窗口关闭” 这个槽可以用 close() 函数表示,假如使用信号和槽机制实现:“点击按钮会关闭窗口” 的功能,其实就是 clicked() 函数调用 close() 函数的效果。
  2. 信号函数和槽函数通常位于某个类中,和普通的成员函数相比,它们的特别之处在于:
    • 信号函数用 signals 关键字修饰,槽函数用 public slots、protected slots 或者 private slots 修饰。signals 和 slots 是 Qt 在 C++ 的基础上扩展的关键字,专门用来指明信号函数和槽函数;
    • 信号函数只需要声明,不需要定义(实现),而槽函数需要定义(实现)。

💡 信号函数的定义是 Qt 自动在编译程序之前生成的。编写 Qt 应用程序的程序员无需关注。这种自动生成代码的机制称为 元编程 (Meta Programming)。这种操作在很多场景中都能见到。

\\在头文件中文件声明信号函数和槽函数前
signals:void mysignal(); \\ 编译器自动生成定义
public slots:void mysignal(); \\ 这个需要定义

2. 信号和槽的使用

2.1 连接信号和槽

在 Qt 中,QObject 类提供了一个静态成员函数 connect(),该函数专门用来关联指定的信号函数和槽函数。

💡 关于 QObject
QObject 是 Qt 内置的父类。Qt 中提供的很多类都是直接或者间接继承自 QObject。这一点的设定和 Java 是非常相似的。

connect() 函数原型:

connect(const QObject *sender, const char *signal,const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

参数说明:

  • sender:信号的发送者;
  • signal:发送的信号(信号函数);
  • receiver:信号的接收者;
  • method:接收信号的槽函数;
  • type:用于指定关联方式,默认的关联方式为 Qt::AutoConnection,通常不需要手动设定。

代码示例: 在窗口中设置一个按钮,当点击 “按钮” 时关闭 “窗口”。在这里插入图片描述

2.2 查看内置信号和槽

系统自带的信号和槽通常是通过 “Qt 帮助文档” 来查询。

如上述示例,要查询 “按钮” 的信号,在帮助文档中输入:QPushButton

  • 首先可以在 “Contents” 中寻找关键字 signals,
  • 如果没有找到, 继续去父类中查找。因此我们去他的父类 QAbstractButton 中继续查找关键字 signals,
    这里的 clicked() 就是要找的信号。槽函数的寻找方式和信号一样,只不过它的关键字是 slots

2.3 通过 Qt Creator 生成信号槽代码

Qt Creator 可以快速帮助我们生成信号槽相关的代码。

代码示例: 在窗口中设置一个按钮,当点击 “按钮” 时关闭 “窗口”。

  1. 新建项目,如下图为新建完成之后所包含的所有文件;

    注意:创建时要生成 UI 设计文件; 在这里插入图片描述

  2. 双击 widget.ui 文件,进入 UI 设计界面内容

  3. 在 UI 设计窗口中拖入一个 “按钮”,并且修改 “按钮” 的名称及字体大小等;

    在这里插入图片描述

4. 可视化生成槽函数;
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/aa7179889e6e49458d76095748310809.png)
- 当单击 "转到槽..." 之后,出现如下界面:对于按钮来说,当点击时发送的信号是:clicked(),所以此处选择:clicked()

在这里插入图片描述

对于普通按钮来说, 使用 clicked 信号即可。clicked(bool) 没有意义的。具有特殊状态的按钮(比如复选按钮)才会用到 clicked(bool)。

  1. 自动生成槽函数原型框架;
    • 在 “widget.h” 头文件中自动添加槽函数的声明
      在这里插入图片描述

说明:
⾃动⽣成槽函数的名称有⼀定的规则。槽函数的命名规则为:on_XXX_SSS,其中:
1、以 " on " 开头,中间使⽤下划线连接起来;
2、" XXX " 表⽰的是对象名(控件的 objectName 属性,即C/C++的实例化的变量名)。
3、" SSS " 表⽰的是对应的信号。
如:" on_pushButton_clicked() " ,pushButton 代表的是对象名,clicked 是对应的信号。

💡 按照这种命名⻛格定义的槽函数, 就会被 Qt ⾃动的和对应的信号进⾏连接.

  • 但是咱们⽇常写代码的时候, 除⾮是 IDE ⾃动⽣成, 否则最好还是不要依赖命名规则, ⽽是显式
    使⽤ connect 更好.
  • ⼀⽅⾯显式 connect 可以更清晰直观的描述信号和槽的连接关系.
    另⼀⽅⾯也防⽌信号或者槽的名字拼写错误导致连接失效.
    (当然, 是配置⼤于约定, 还是约定⼤于配置, 哪种更好, 这样的话题业界尚存在争议. 此处我个⼈还是更建议优先考虑显式 connect)
  • 在 “widget.cpp” 中自动生成槽函数定义。
    在这里插入图片描述
  1. 在槽函数函数定义中添加要实现的功能。实现关闭窗口的效果。在这里插入图片描述

3. 自定义信号和槽

3.1 基本语法

 在 Qt 中,允许自定义信号的发送方以及接收方,即可以自定义信号函数和槽函数。但是对于自定义的信号函数和槽函数有一定的书写规范。

1. 自定义信号函数书写规范

  • 自定义信号函数必须写到 “signals” 下;
  • 返回值为 void,只需要声明,不需要实现;
  • 可以有参数,也可以发生重载;

2. 自定义槽函数书写规范

  • 早期的 Qt 版本要求槽函数必须写到 “public slots” 下,但是现在高级版本的 Qt 允许写到类的 “public” 作用域中或者全局下;
  • 返回值为 void,需要声明,也需要实现;
  • 可以有参数,可以发生重载;

3. 发送信号

  • 使用 “emit” 关键字发送信号。“emit” 是一个空的宏。“emit” 其实是可选的,没有什么含义,只是为了提醒开发人员。

4.信号和槽的关联

  • ⾸先关联信号和槽,⼀旦检测到信号发射之后就会⽴⻢执⾏关联的槽函数。反之,若先发射信号,此时还没有关联槽函数,当信号发射之后槽函数不会响应.
	// 使用时,下面两种方法是相同的。emit mySignal();mySignal();

3.2 带参数的信号和槽

Qt 的信号和槽也支持带有参数, 同时也可以支持重载。
此处我们要求, 信号函数的参数列表要和对应连接的槽函数参数列表一致。
此时信号触发, 调用到槽函数的时候, 信号函数中的实参就能够被传递到槽函数的形参当中。

💡 通过这样的机制, 就可以让信号给槽传递数据了。

示例1:重载信号槽
  1. 在 “widget.h” 头文件中声明重载的信号函数以及重载的槽函数;
// widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QPushButton>class Widget : public QWidget {Q_OBJECT
public:Widget(QWidget *parent = nullptr);~Widget();
signals:void mySignal();void mySignal(int value);
private slots:void mySlot();void mySlot(int value);
private:QPushButton *button;
};#endif // WIDGET_H
  1. 在 “Widget.cpp” 文件实现重载槽函数以及连接信号和槽。
    • 注意:在定义函数指针时要指明函数指针的作用域。

Widget.cpp

#include "widget.h"
#include <QDebug>Widget::Widget(QWidget *parent) : QWidget(parent) {button = new QPushButton("Click me", this);// 定义函数指针,指明作用域void (Widget::*signalNoParam)() = &Widget::mySignal;void (Widget::*signalWithParam)(int) = &Widget::mySignal;void (Widget::*slotNoParam)() = &Widget::mySlot;void (Widget::*slotWithParam)(int) = &Widget::mySlot;// 连接无参信号和无参槽connect(this, signalNoParam, this, slotNoParam);// 连接带参信号和带参槽connect(this, signalWithParam, this, slotWithParam);// 按钮点击触发信号connect(button, &QPushButton::clicked, [this]() {emit mySignal();emit mySignal(10);});
}Widget::~Widget() {}void Widget::mySlot() {qDebug() << "No parameter slot called";
}void Widget::mySlot(int value) {qDebug() << "Slot called with value:" << value;
}

执行结果
当点击按钮时,控制台会输出:

No parameter slot called
Slot called with value: 10
示例2:信号槽参数列表匹配规则
  1. 在 “widget.h” 头文件中声明信号和槽函数;

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QPushButton>class Widget : public QWidget {Q_OBJECT
public:Widget(QWidget *parent = nullptr);~Widget();
signals:void mySignal(int value, QString str);
private slots:void mySlot(int value);
private:QPushButton *button;
};#endif // WIDGET_H
  1. 在 “widget.cpp” 文件中实现槽函数以及连接信号和槽;

其实信号的参数个数可以多于槽函数的参数个数,但是槽的参数个数不能多于信号参数个数。但是实际开发中最好还是保持参数个数也能匹配一致。

widget.cpp

#include "widget.h"
#include <QDebug>Widget::Widget(QWidget *parent) : QWidget(parent) {button = new QPushButton("Click me", this);// 连接信号和槽connect(this, &Widget::mySignal, this, &Widget::mySlot);// 按钮点击触发信号connect(button, &QPushButton::clicked, [this]() {emit mySignal(20, "Hello");});
}Widget::~Widget() {}void Widget::mySlot(int value) {qDebug() << "Slot called with value:" << value;
}
示例3:内置与自定义信号案例
  1. 在 “widget.h” 头文件中声明信号和槽函数;

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QPushButton>class Widget : public QWidget {Q_OBJECT
public:Widget(QWidget *parent = nullptr);~Widget();
signals:void mySignal(QString);
private slots:void mySlot();
private:QPushButton *button;
};#endif // WIDGET_H
  1. 在 “widget.cpp” 文件中实现槽函数以及连接信号和槽。

widget.cpp

#include "widget.h"
#include <QDebug>Widget::Widget(QWidget *parent) : QWidget(parent) {button = new QPushButton("Click me", this);// 连接信号和槽connect(this, &Widget::mySignal, this, &Widget::mySlot);// 按钮点击触发信号connect(button, &QPushButton::clicked, [this]() {emit mySignal();});emit mySignal("hello");
}Widget::~Widget() {}void Widget::mySlot() {qDebug() << "Slot called";
}

4. 信号与槽的连接方式

4.1 一对一

 主要有两种形式,分别是:一个信号连接一个槽一个信号连接一个信号

在这里插入图片描述

示例:

内容

4.2 一对多

 一个信号连接多个槽。在这里插入图片描述

示例:

在这里插入图片描述

4.3 多对一

多个信号连接一个槽函数。
在这里插入图片描述

示例:


在这里插入图片描述

5. 信号和槽的其他说明

5.1 信号与槽的断开

使用 disconnect 即可完成断开。disconnect 的用法和 connect 基本一致。

示例:

5.2 Qt4 版本信号与槽的连接

 Qt4 中的 connect 用法和 Qt5 相比是更复杂的。需要搭配 SIGNAL 和 SLOT 宏来完成。而且缺少必要的函数类型的检查。使代码更容易出错。

示例:
 1. 在 “widget.h” 头文件中声明信号和槽;
 2. 在 “widget.cpp” 文件中实现槽函数以及连接信号与槽。

Qt4 版本信号与槽连接的优缺点:

  • 优点:参数直观;
  • 缺点:参数类型不做检测。

5.3 使用 Lambda 表达式定义槽函数

 Qt5 在 Qt4 的基础上提高了信号与槽的灵活性,允许使用任意函数作为槽函数。但如果想方便的编写槽函数,比如在编写函数时连函数名都不想定义,则可以通过** Lambda表达式 **来达到这个目的。(没学过的话,可以点击上行这个链接)

Lambda表达式 是 C++11 增加的特性。C++11 中的 Lambda表达式 用于定义并创建匿名的函数对象,以简化编程工作。

Lambda表达式 的语法格式如下:

[capture](params) opt -> ret { Function body; 
};

说明:

  • capture 捕获列表
  • params 参数表
  • opt 函数选项
  • ret 返回值类型
  • Function body 函数体

示例1:Lambda表达式的使用

示例2:以 [=] 方式传递,外部的所有变量在Lambda表达式中都可以使用

示例3:以 [a] 方式传递,在Lambda表达式中只能使用传递进来的 a

5.4 信号与槽的优缺点

优点: 松散耦合
 信号发送者不需要知道发出的信号被哪个对象的槽函数接收,槽函数也不需要知道哪些信号关联了自己,Qt的信号槽机制保证了信号与槽函数的调用。支持信号槽机制的类或者父类必须继承于 QObject 类。

缺点: 效率较低
 与回调函数相比,信号和槽稍微慢一些,因为它们提供了更高的灵活性,尽管在实际应用程序中差别不大。通过信号调用的槽函数比直接调用的速度慢约10倍(这是定位信号的接收对象所需的开销;遍历所有关联;编组/解组传递的参数;多线程时,信号可能需要排队),这种调用速度对性能要求不是非常高的场景是可以忽略的,是可以满足绝大部分场景。

💡 一个客户端程序中, 最慢的环节往往是 “人”。假设本身基于回调的方式是 10us, 使用信号槽的方式是 100us。对于使用程序的人来说, 是感知不到的。

相关文章:

[QT]深入理解Qt中的信号与槽机制

文章目录 信号与槽1. 信号和槽概述信号的本质槽的本质说明 2. 信号和槽的使用2.1 连接信号和槽2.2 查看内置信号和槽2.3 通过 Qt Creator 生成信号槽代码 3. 自定义信号和槽3.1 基本语法3.2 带参数的信号和槽**示例1&#xff1a;重载信号槽****示例2&#xff1a;信号槽参数列表…...

电脑管家如何清理内存及垃圾,提升电脑性能

电脑在长时间使用后&#xff0c;常常会变得越来越卡顿&#xff0c;打开程序的速度变慢&#xff0c;甚至响应迟缓。这时&#xff0c;不少用户会选择使用电脑管家来进行内存清理和垃圾清理。那么&#xff0c;电脑管家是如何清理内存的&#xff1f;它又是如何清理垃圾的&#xff1…...

OpenCV图像处理:分割、合并、打码、组合与边界填充

引言 OpenCV是一个功能强大的计算机视觉库&#xff0c;广泛应用于图像处理、视频分析、物体检测等领域。本文将结合代码示例&#xff0c;详细介绍如何使用OpenCV进行图像的分割、合并、打码、组合以及边界填充等操作。 1. 图像的分割与合并 1.1 图像分割 在OpenCV中&#xff…...

游戏立项时期随笔记录(1)

模拟经营的项目还没有完全结束&#xff0c;这几天又有可能涉及到一个新项目。感想随笔记录一下&#xff0c;防止忘记。今天一天整理这个&#xff0c;搞得今天没时间看数学和AI。 在 Unity3D 游戏前端主程序的立项时期&#xff0c;核心目标是明确技术方向、评估可行性、搭建基础…...

C#入门学习记录(四)C#运算符详解:掌握算术与条件运算符的必备技巧+字符串拼接

一、运算符概述 运算符是程序进行数学运算、逻辑判断的核心工具&#xff0c;C#中的运算符分为&#xff1a; 算术运算符 → 数学计算&#xff08; - * / %&#xff09; 条件运算符 → 三目判断&#xff08;?:&#xff09; 关系运算符 → 比较大小&#xff08;> < &#…...

DeepSeek 3FS 与 JuiceFS:架构与特性比较

近期&#xff0c;DeepSeek 开源了其文件系统 Fire-Flyer File System (3FS)&#xff0c;使得文件系统这一有着 70 多年历时的“古老”的技术&#xff0c;又获得了各方的关注。在 AI 业务中&#xff0c;企业需要处理大量的文本、图像、视频等非结构化数据&#xff0c;还需要应对…...

汽车PKE无钥匙进入系统一键启动系统定义与原理

汽车智能钥匙&#xff08;PKE无钥匙进入系统&#xff09;一键启动介绍 系统定义与原理 汽车无钥匙进入系统&#xff0c;简称PKE&#xff08;Passive Keyless Entry&#xff09;&#xff0c;该系统采用了RFID无线射频技术和车辆身份编码识别系统&#xff0c;率先应用小型化、小…...

【深度学习与大模型基础】第6章-对角矩阵,对称矩阵,正交矩阵

一、对角矩阵 对角矩阵&#xff08;Diagonal Matrix&#xff09;是一种特殊的方阵&#xff0c;其非对角线上的元素均为零&#xff0c;只有对角线上的元素可能非零。具体来说&#xff0c;对于一个 nn的矩阵 A[]&#xff0c;如果满足 则 AA 称为对角矩阵。对角矩阵通常表示为&am…...

go语言中切片的长度和容量详解

Go 语言中,切片(Slice) 是一种动态数组,它的核心特性由 长度(Length) 和 容量(Capacity) 共同定义。这两个概念是操作切片时的关键,理解它们的含义和区别能帮助你高效管理内存并避免常见错误。 一、长度(Length) 定义:切片的长度表示当前包含的实际元素个数,即可以…...

在Vue3中使用$router.push方法进行路由跳转时,如何传递多个路径参数?

在 Vue 3 里&#xff0c;你可以借助 $router.push 方法进行路由跳转&#xff0c;同时传递多个路径参数。下面为你详细介绍具体实现方式&#xff1a; 1. 路由配置 首先&#xff0c;要在路由配置中定义好需要的路径参数。示例如下&#xff1a; import { createRouter, createW…...

C语言学习笔记(第三部份)

说明&#xff1a;由于所有内容放在一个md文件中会非常卡顿&#xff0c;本文件将接续C_1.md文件的第三部分 整型存储和大小端 引例&#xff1a; int main(void) {// printf("%d\n", SnAdda(2, 5));// PrintDaffodilNum(10000);// PrintRhombus(3);int i 0;int arr[…...

软考 中级软件设计师 考点知识点笔记总结 day05

文章目录 4、栈和队列4.1、栈的定义4.2、队列定义 5、串、数组、矩阵和广义表5.1、串5.2、 数组5.3、稀疏矩阵5.4、广义表 4、栈和队列 4.1、栈的定义 线性表是具有相同数据类型的n个数据元素的有限序列&#xff0c; n为表厂。n0时 线性表是一个空表 L &#xff08;a1,a2,a3…...

【Linux】system V消息队列,信号量

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.消息队列System V 消息队列接口 02.信号量System V 信号量接口 03.OS对system V ipc的管理消息队列管理结构共享内存管理结构信号量管理结构 01.消息队列 消息队列提供了一个…...

【新能源汽车“心脏”赋能:三电系统研发、测试与应用匹配的恒压恒流源技术秘籍】

新能源汽车“心脏”赋能&#xff1a;三电系统研发、测试与应用匹配的恒压恒流源技术秘籍 在新能源汽车蓬勃发展的浪潮中&#xff0c;三电系统&#xff08;电池、电机、电控&#xff09;无疑是其核心驱动力。而恒压源与恒流源&#xff0c;作为电源管理的关键要素&#xff0c;在…...

在 Vue.js 中使用递归组件:轻松处理嵌套数据结构

在开发前端应用时&#xff0c;我们经常会遇到需要处理嵌套数据结构的场景&#xff0c;比如树形菜单、评论列表、文件夹结构等。Vue.js 提供了一种优雅的方式来解决这类问题——递归组件。通过递归组件&#xff0c;我们可以轻松地渲染嵌套数据&#xff0c;并保持代码的简洁和可维…...

飞腾2000+/64核加固服务器

在当今信息化高速发展的时代&#xff0c;数据中心作为信息技术的核心支撑&#xff0c;其稳定性、安全性和高效性成为了各行各业关注的焦点。特别是在国防、金融、电信等关键领域&#xff0c;对服务器的性能、可靠性和安全性提出了前所未有的高要求。正是在这样的背景下&#xf…...

AutoMQ x OSS 的 Iceberg 数据入湖的最佳实践

背景 在数字化转型进程中&#xff0c;用户交互行为产生的多维度数据已成为企业的重要战略资产。以短视频平台为例&#xff0c;基于用户点赞事件的实时推荐算法能显著提升用户活跃度和平台粘性。这类实时数据主要通过 Apache Kafka 流处理平台进行传输&#xff0c;通过其扇出&a…...

深度学习大模型补充知识点

文章目录 VIT用途处理方法与CNN区别 多模态LLM&#xff1a;大语言模型预训练指令微调强化学习 总结 VIT ViT&#xff08;Vision Transformer&#xff09; 首次将 Transformer架构成功应用于计算机视觉领域&#xff08;尤其是图像分类任务&#xff09;。传统视觉任务主要依赖卷…...

定义模型生成数据表

1. 数据库配置 js import { Sequelize, DataTypes } from sequelize; // 创建一个 Sequelize 实例&#xff0c;连接到 SQLite 数据库。 export const sequelize new Sequelize(test, sa, "123456", { host: localhost, dialect: sqlite, storage: ./blog.db })…...

C++与C的基本不同

文章目录 变量定义规则1. 基本语法2. 初始化3. 作用域4. 存储类别 函数定义规则1. 基本语法2. 函数声明和定义3. 默认参数4. 内联函数 解析输出流void BluetoothA2DPSink::start(const char* name)class BluetoothA2DPSink : public BluetoothA2DPCommon C是在C语言基础上发展而…...

React19源码系列之createRoot的执行流程是怎么的?

2024年12月5日&#xff0c;react发布了react19版本。后面一段时间都将学习它的源码&#xff0c;并着手记录。 react官网&#xff1a;react19新特性 https://react.dev/blog/2024/12/05/react-19 在用vite创建react项目的使用&#xff0c;main.tsx主文件都会有以下代码。 //i…...

【CXX-Qt】1.5 使用CMake构建

在本示例中&#xff0c;我们将演示如何使用CMake将CXX-Qt代码集成到C应用程序中。Cargo将CXX-Qt代码构建为静态库&#xff0c;然后CMake将其链接到C可执行文件中。 我们首先需要修改项目结构&#xff0c;以分离项目的不同部分。 tutorial cpp qml rust将Rust项目移动到rust文…...

前端面试项目拷打

Axios相关 1.在Axios二次封装时&#xff0c;具体封装了哪些内容&#xff0c;如何处理请求拦截和响应拦截&#xff1f; axios二次封装的目的&#xff1a;为了统一处理请求和响应拦截器、错误处理、请求超时、请求头配置等&#xff0c;提高代码可维护性和复用性。 首先创建axios…...

“Ubuntu禁止root用户通过SSH直接登录”问题的解决

目录 1 前言 2 问题的解决 2.1 修改sshd_config文件 2.2 重启 SSH 服务 1 前言 最近在做毕设的时候&#xff0c;由于使用普通用户&#xff0c;在MobaXterm的图形界面上&#xff0c;无法正常查看/root文件夹内容&#xff0c;如下图所示&#xff1a; 于是我就想直接想用oot…...

Kafka的零拷贝

Kafka的零拷贝&#xff08;Zero-Copy&#xff09;技术是其实现高吞吐量的关键优化之一&#xff0c;主要通过减少数据在内核空间和用户空间之间的冗余复制及上下文切换来提升性能。以下是其核心要点&#xff1a; 1. 传统数据拷贝的问题 多次复制&#xff1a;传统文件传输需经历…...

《大语言模型》学习笔记(三)

GPT系列模型的技术演变 2022 年11月底&#xff0c;OpenAI推出了基于大语言模型的在线对话应用—ChatGPT。由于具备出色的人机对话能力和任务解决能力&#xff0c;ChatGPT一经发布就引发了全社会对于大语言模型的广泛关注&#xff0c;众多的大语言模型应运而生&#xff0c;并且…...

华为OD机试 - 最长回文字符串 - 贪心算法(Java 2024 E卷 100分)

题目描述 如果一个字符串正读和反读都一样(大小写敏感),则称之为一个「回文串」。例如: level 是一个「回文串」,因为它的正读和反读都是 level。art 不是一个「回文串」,因为它的反读 tra 与正读不同。Level 不是一个「回文串」,因为它的反读 leveL 与正读不同(因大小…...

K8S-etcd服务无法启动问题排查

一、环境、版本信息说明 k8s&#xff1a;v1.19.16 etcdctl version: 3.5.1 3台etcd&#xff08;10.xxx.xx.129、10.xxx.xx.130、10.xxx.xx.131&#xff09;组成的集群。 二、问题根因 129节点的etcd数据与其他两台数据不一致&#xff0c;集群一致性校验出错导致无法加入集…...

基于WebRTC的嵌入式音视频通话SDK:EasyRTC跨平台兼容性技术架构实时通信的底层实现

EasyRTC的核心架构围绕WebRTC技术构建&#xff0c;同时通过扩展信令服务、媒体服务器和NAT穿透机制&#xff0c;解决了WebRTC在实际部署中的痛点。其架构可以分为以下几个核心模块&#xff1a; 1&#xff09;WebRTC基础层 媒体捕获与处理&#xff1a;通过getUserMediaAPI获取…...

SpringBoot-已添加并下载的依赖,reload和mvn clean 后还是提示找不到jar包问题

背景&#xff1a; 添加spring-jdbc依赖时&#xff0c;原来是指定版本的&#xff0c;担心版本冲突&#xff0c;就改成依赖托管&#xff0c;悲剧的是反复reload和mvn clean&#xff0c;import到类的该包一直标红&#xff0c;提示jar包找不到。。。 解决方案&#xff1a; Idea左上…...

HTML5扫雷游戏开发实战

HTML5扫雷游戏开发实战 这里写目录标题 HTML5扫雷游戏开发实战项目介绍技术栈项目架构1. 游戏界面设计2. 核心类设计 核心功能实现1. 游戏初始化2. 地雷布置算法3. 数字计算逻辑4. 扫雷功能实现 性能优化1. DOM操作优化2. 算法优化 项目亮点技术难点突破1. 首次点击保护2. 连锁…...

机器学习——数据清洗(缺失值处理、异常值处理、数据标准化)

数据清洗(缺失值处理、异常值处理、数据标准化) 在数据处理与分析流程中,数据清洗占据着极为关键的地位。原始数据往往充斥着各种问题,如缺失值、异常值,且数据的尺度和分布也可能存在差异,这些问题会严重影响后续数据分析和机器学习模型的准确性与性能。因此,有效的数据…...

【综述】An Introduction to Vision-Language Modeling【一】

介绍 发表在预印本上的综述&#xff0c;长达76页&#xff0c;其中正文46页。 来自Meta 在Meta工作期间完成 ‡蒙特利尔大学, Mila ♡麦吉尔大学, Mila †多伦多大学 ♠卡内基梅隆大学 ♣麻省理工学院 ∧纽约大学 △加州大学伯克利分校 ▽马里兰大学 ♢阿卜杜拉国王科技大学 •…...

MySQL常用函数详解及SQL代码示例

MySQL常用函数详解及SQL代码示例 引言当前日期和时间函数字符串函数数学函数聚合函数结论 引言 MySQL作为一种广泛使用的关系型数据库管理系统&#xff0c;提供了丰富的内置函数来简化数据查询、处理和转换。掌握这些函数可以大大提高数据库操作的效率和准确性。本文将详细介绍…...

Unity教程(二十二)技能系统 分身技能

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…...

‌RTSPtoWeb, 一个将rtsp转换成webrtc的开源项目

RTSPtoWeb是一个开源项目&#xff0c;旨在将RTSP流转换为可在现代web浏览器中消费的格式&#xff0c;如Media Source Extensions &#xff08;MSE&#xff09;、WebRtc或HLS。该项目完全使用golang编写&#xff0c;不依赖于ffmpeg或gstreamer&#xff0c;确保了高效的性能和轻量…...

AIAgent有哪些不错的开源平台

AIAgent领域有许多优秀的开源平台和框架&#xff0c;以下是一些值得推荐的开源平台&#xff1a; AutoGPT AutoGPT 是一个基于 OpenAI 的 GPT-4 和 GPT-3.5 大型语言模型的开源框架&#xff0c;能够根据用户给定的目标自动生成所需提示&#xff0c;并利用多种工具 API 执行多步骤…...

Java---JavaSpringMVC解析(1)

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为"Spring MVC" 1.MVC MVC是Model View Controller的缩写&#…...

Vector 的模拟实现:从基础到高级

文章目录 1. 引言2. vector的核心设计3. vector的常用接口介绍3.1 构造函数和析构函数3.1.1 默认构造函数3.1.2 带初始容量的构造函数3.1.3 析构函数 3.2 拷贝构造函数和拷贝赋值运算符3.2.1 拷贝构造函数3.2.2 拷贝赋值运算符 3.5 数组长度调整和动态扩容3.5.1 调整大小&#…...

【大模型科普】大模型:人工智能的前沿(一文读懂大模型)

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能&#xff08;AI&#xff09;通过算法模拟人类智能&#xff0c;利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络&#xff08;如ChatGPT&…...

[漏洞修复]用yum update修openssh漏洞

[漏洞修复]用yum update修openssh漏洞 1. 需求2. 更新Yum仓库2.1 生成本地仓库2.2 生成内网仓库2.3 将Openssh的包更新到仓库 3. 客户端升级3.1 客户端repo文件配置3.2 升级Openssh3.3 升级后的确认 1. 需求 最近经常有朋友问Openssh 漏洞修复的问题,我也在自己的gitee仓库里更…...

[RH342]iscsi配置与排错

[RH342]iscsi配置与排错 1. 服务端配置1.1 安装targetcli1.2 准备磁盘1.3 服务端配置1.4 防火墙配置 2. 客户端配置2.1 安装客户端软件2.2 配置客户端2.3 连接登录服务端2.4 挂载使用 3. 安全验证扩展3.1 服务端3.2 客户端 4. 常见的排错点4.1 服务端常见错误4.2 客户端常见错误…...

Nginx 代理访问一个 Web 界面时缺少内容

1. 资源路径问题 Web 页面中的静态资源&#xff08;如图片、CSS、JavaScript 文件&#xff09;可能使用了相对路径或绝对路径&#xff0c;而这些路径在代理后无法正确加载。 解决方法&#xff1a; 检查资源路径&#xff1a;打开浏览器的开发者工具&#xff08;按 F12&#xf…...

HOVER:人形机器人的多功能神经网络全身控制器

编辑&#xff1a;陈萍萍的公主一点人工一点智能 HOVER&#xff1a;人形机器人的多功能神经网络全身控制器HOVER通过策略蒸馏和统一命令空间设计&#xff0c;为人形机器人提供了通用、高效的全身控制框架。https://mp.weixin.qq.com/s/R1cw47I4BOi2UfF_m-KzWg 01 介绍 1.1 摘…...

SEO新手基础优化三步法

内容概要 在网站优化的初始阶段&#xff0c;新手常因缺乏系统性认知而陷入技术细节的误区。本文以“三步法”为核心框架&#xff0c;系统梳理从关键词定位到内容布局、再到外链构建的完整优化链路。通过拆解搜索引擎工作原理&#xff0c;重点阐明基础操作中容易被忽视的底层逻…...

遨游科普:三防平板是哪三防?有哪些应用场景?

在工业智能化与数字化转型的浪潮中&#xff0c;电子设备的耐用性和环境适应性成为关键需求。普通消费级平板电脑虽然功能强大&#xff0c;但在极端环境下往往“水土不服”。而三防平板凭借其独特的防护性能&#xff0c;正逐步成为“危、急、特”场景的核心工具。 AORO P300 Ult…...

Etcd 服务搭建

&#x1f4a2;欢迎来到张胤尘的开源技术站 &#x1f4a5;开源如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 Etcd 服务搭建预编译的二进制文件安装下载 etcd 的…...

C++《红黑树》

在之前的篇章当中我们已经了解了基于二叉搜索树的AVL树&#xff0c;那么接下来在本篇当中将继续来学习另一种基于二叉搜索树的树状结构——红黑树&#xff0c;在此和之前学习AVL树类似还是通过先了解红黑树是什么以及红黑树的结构特点&#xff0c;接下来在试着实现红黑树的结构…...

Axios 请求取消:从原理到实践

Axios 请求取消&#xff1a;从原理到实践 在现代前端开发中&#xff0c;网络请求是不可或缺的一部分。Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;广泛应用于浏览器和 Node.js 环境中。然而&#xff0c;在某些场景下&#xff0c;我们可能需要取消正在进行的请求&…...

【css酷炫效果】纯CSS实现照片堆叠效果

【css酷炫效果】纯CSS实现照片堆叠效果 缘创作背景html结构css样式完整代码基础版进阶版(增加鼠标悬停查看) 效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90492022 缘 创作随缘&#xff0c;不定时更新。 创…...