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

【Qt】信号和槽

文章目录

  • 信号和槽的概念
  • 信号和槽的使用
    • 链接信号和槽
    • 查看内置信号和槽
    • 通过 Qt Creator 生成信号槽代码
  • 自定义信号和槽
    • 基本语法
    • 带参数的信号和槽
  • 信号与槽的连接方式
    • 一对一
    • 一对多
    • 多对一
  • 信号和槽的其他说明
    • 信号与槽的断开
  • 使用 Lambda 表达式定义槽函数




信号和槽的概念


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

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

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

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

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

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

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

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

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

(1)信号和槽机制底层是通过函数间的相互调用实现的。每个信号都可以用函数来表示,称为信号函数;每个槽也可以用函数表示,称为槽函数。例如: “按钮被按下” 这个信号可以用 clicked() 函数表示,“窗口关闭” 这个槽可以用 close() 函数表示,假如使用信号和槽机制

  • 实现:“点击按钮会关闭窗口” 的功能,其实就是 clicked() 函数调用 close() 函数的效果。

(2)信号函数和槽函数通常位于某个类中,和普通的成员函数相比,它们的特别之处在于:

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

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


信号和槽的使用


链接信号和槽

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

💡 关于 QObjectQObject 是 Qt 内置的父类. Qt 中提供的很多类都是直接或者间接继承自 QObject.

connect() 函数原型:

QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection);

参数说明:

  • sender:发出信号的对象指针。
  • signal:信号的函数指针。
  • receiver:接收信号并执行槽函数的对象指针。
  • method:槽函数的函数指针。
  • type: 连接类型,默认的关联方式为 Qt::AutoConnection,通常不需要手动设定。

在这里插入图片描述

查看内置信号和槽

系统自带的信号和槽通常是通过 “Qt 帮助文档” 来查询。
如上述示例,要查询 “按钮” 的信号,在帮助文档中输入:QPushButton,首先可以在 Contents 中寻找关键字 signals,如果没有找到, 继续去父类中查找. 因此我们去他的父类 QAbstractButton 中继续查找关键字 signals

在这里插入图片描述
这里的 clicked() 就是要找的信号。槽函数的寻找方式和信号一样,只不过它的关键字是 slot

通过 Qt Creator 生成信号槽代码

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

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

1、新建项目,如下图为新建完成之后所包含的所有文件;
注意:创建时要生成 UI 设计文件;

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

3、在 UI 设计窗口中拖入一个 “按钮” ,并且修改 “按钮” 的名称及字体大小等;
在这里插入图片描述
当单击 “转到槽…” 之后,出现如下界面:对于按钮来说,当点击时发送的信号是:clicked(),所以此处选择:clicked()

在这里插入图片描述
5、自动生成槽函数原型框架;
(1)在 widget.h 头文件中自动添加槽函数的声明;
在这里插入图片描述
说明
自动生成槽函数的名称有一定的规则。槽函数的命名规则为:on_XXX_SSS,其中:
1、以 on 开头,中间使用下划线连接起来;
2、 XXX 表示的是对象名(控件的 objectName 属性)。
3、SSS 表示的是对应的信号。
如:on_pushButton_clicked()pushButton 代表的是对象名,clicked 是对应的信号。

⭐️:按照这种命名风格定义的槽函数, 就会被 Qt 自动的和对应的信号进行连接。但是咱们日常写代码的时候, 除非是 IDE 自动生成, 否则最好还是不要依赖命名规则, 而是显式使用 connect 更好。

一方面显式 connect 可以更清晰直观的描述信号和槽的连接关系.

另一方面也防止信号或者槽的名字拼写错误导致连接失效.

(2)在 widget.cpp 中自动生成槽函数定义.
在这里插入图片描述
6、在槽函数函数定义中添加要实现的功能,实现关闭窗口的效果。
在这里插入图片描述


自定义信号和槽


基本语法

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

1、自定义信号函数书写规范
(1)自定义信号函数必须写到 signals 下;
(2)返回值为 void,只需要声明,不需要实现;
(3)可以有参数,也可以发生重载;

2、自定义槽函数书写规范
(1)早期的 Qt 版本要求槽函数必须写到 public slots 下,但是现在高级版本的 Qt 允许写到类的 public 作用域中或者全局下;
(2)返回值为 void,需要声明,也需要实现;
(3)可以有参数,可以发生重载;

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

示例1:
1、在 widget.h 中声明自定义的信号和槽,如图所示;
在这里插入图片描述

2、在 widget.cpp 中实现槽函数,并且关联信号和槽
注意:图中的 ① 和 ② 的顺序不能颠倒。
原因是, 首先关联信号和槽,一旦检测到信号发射之后就会立马执行关联的槽函数。反之,若先发射信号,此时还没有关联槽函数,当信号发射之后槽函数不会响应。

在这里插入图片描述

带参数的信号和槽

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

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

示例1:重载信号槽
(1)在 widget.h 头文件中声明重载的信号函数以及重载的槽函数;如下图所示:
在这里插入图片描述
(2)在 Widget.cpp 文件实现重载槽函数以及连接信号和槽。
注意:在定义函数指针时要指明函数指针的作用域。
在这里插入图片描述
运行结果如下:
在这里插入图片描述

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


信号与槽的连接方式


一对一

主要有两种形式,分别是:一个信号连接一个槽一个信号连接一个信号
(1)一个信号连接一个槽
在这里插入图片描述
示例
1、在 widget.h 中声明信号和槽以及信号发射函数;
在这里插入图片描述
2、在 widget.cpp 中实现槽函数,信号发射函数以及连接信号和槽;
在这里插入图片描述

(2)一个信号连接另一个信号
在这里插入图片描述
示例:
在上述示例的基础上,在 widget.cpp 文件中添加如下代码:
在这里插入图片描述

一对多

一个信号连接多个槽
在这里插入图片描述
示例:
(1)在 widget.h 头文件中声明一个信号和三个槽
在这里插入图片描述

(2)在 widget.cpp 文件中实现槽函数以及连接信号和槽;

在这里插入图片描述

多对一

多个信号连接一个槽函数
在这里插入图片描述
示例:
(1)在 widget.h 头文件中声明两个信号以及一个槽;
在这里插入图片描述

(2)在 `widget.cpp 文件中实现槽函数以及连接信号和槽;
在这里插入图片描述


信号和槽的其他说明


信号和槽存在的意义
定义好的槽函数可被多个信号连接调用,一个信号也能连接多个槽函数。如更新界面显示的槽函数,可被多个数据更新信号关联,提高代码复用率,减少重复开发。但一般这种需求在实践中基本遇不到。不过作为 Qt 的一种特性,我们学习 Qt 还是必须要了解的。

信号与槽的断开

使用 disconnect 即可完成断开.
disconnect 的用法和 connect 基本一致.
示例:
在这里插入图片描述
Qt4 中的 connect 用法和 Qt5 相比是更复杂的,需要搭配 SIGNALSLOT 宏来完成。
而且缺少必要的函数类型的检查, 使代码更容易出错。

示例:
(1)在 widget.h 头文件中声明信号和槽
在这里插入图片描述

(2)在 widget.cpp 文件中实现槽函数以及连接信号与槽;

在这里插入图片描述
在这里插入图片描述


使用 Lambda 表达式定义槽函数

Qt5 在 Qt4 的基础上提高了信号与槽的灵活性,允许使用任意函数作为槽函数。

但如果想方便的编写槽函数,比如在编写函数时连函数名都不想定义,则可以通过 Lambda 表达式 来达到这个目的。

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

关于 Lambda 的语法,我在lambda & 包装器 & bind 绑定 这篇博客中讲过。

说明

  • 由于使用引用方式捕获对象会有局部变量释放了而Lambda函数还没有被调用的情况。如果执行 Lambda函数,那么引用传递方式捕获进来的局部变量的值不可预知。所以绝大多数场合使用的形式为: [=] () { }
  • 早期版本的 Qt,若要使用 Lambda 表达式,要在 .pro 文件中添加: CONFIG += C++11 因为 Lambda 表达式 是 C++11 标准提出的。Qt5 以上的版本无需手动添加,在新建项目时会自动添加。
    在这里插入图片描述

相关文章:

【Qt】信号和槽

文章目录 信号和槽的概念信号和槽的使用链接信号和槽查看内置信号和槽通过 Qt Creator 生成信号槽代码 自定义信号和槽基本语法带参数的信号和槽 信号与槽的连接方式一对一一对多多对一 信号和槽的其他说明信号与槽的断开 使用 Lambda 表达式定义槽函数 信号和槽的概念 在 Qt 中…...

小事务架构下的业务完整性保障:基于业务处理记录与补偿机制的技术实现

随着微服务架构、事件驱动架构(EDA)和最终一致性理念的普及,传统的大事务管理方式被更细粒度的“小事务”所取代。在这种架构中,全局业务流程被拆解成多个局部事务节点,通过异步消息进行编排。这种解耦提高了可扩展性和…...

DELL电脑开机进入自检界面

疑难解答 - 如何解决开机直接进入BIOS画面 添加链接描述 一、DELL电脑开机自检提示please run setup program 未设置一天中的时间-请运行安装程序(Time-of-day not set - please run SETUP program) 配置信息无效-请运行安装程序(Invalid configuration information - ple…...

Spring Boot 微服务中集成 MyBatis-Plus 与集成原生 MyBatis 有哪些配置上的不同?

在Spring Boot 微服务中集成 MyBatis-Plus (MP) 与集成原生 MyBatis (MB) 在配置上的主要不同点。MyBatis-Plus 是在 MyBatis 基础上进行的增强,它兼容 MyBatis 的所有配置方式,并提供了更简洁、更强大的配置选项。 相同点: 基础数据源配置 (DataSource…...

最近准备写个Playbook,详细点的指导手册,作为后续的销售培训文件,也趁着这个机会整理下产品思路,尤其是对于UALink,UEC新的联盟规范的测试用例

# 最近准备写个Playbook,详细点的指导手册,作为后续的销售培训文件,也蹭这个机会整理下产品思路。随着产品线越来越多(其实也是越来越少),东西越来越杂,已经不是三言两语就能解释得清楚了。 其…...

Kimi-VL:开源多模态视觉语言模型的崭新突破

近年来,人工智能在多模态模型的领域取得了显著的进展,特别是在能够处理文本和视觉输入的模型方面。MoonshotAI团队近期开源发布了Kimi-VL模型,这一模型凭借其在视觉理解、推理和智能体任务中的优异表现,受到了广泛关注。与GPT-4o等…...

NLP专业技能2025

Linux: 熟练使用Linux操作系统,熟练使用Linux常用命令进行开发。 熟悉掌握shell脚本编程技术的使用,能够编写简单的Shell脚本并熟练使用shell脚本四剑客(find、sed、grep、awk)进行日志解析。 熟练使用Linux环境进行开…...

C++STL循环队列实现

核心概念 循环队列(Circular Queue),也称为环形队列,是一种特殊的队列数据结构。它通过将队列的首尾相连,解决了传统队列因出队操作导致的空间浪费问题(即“假溢出”),从而更高效地…...

YOLOv3实践教程:使用预训练模型进行目标检测

目录 简介环境准备获取预训练模型图像目标检测视频目标检测模型性能优化常见问题解答进阶学习路径 简介 YOLOv3(You Only Look Once version 3)是一种高效的实时目标检测算法,由Joseph Redmon和Ali Farhadi于2018年提出。与传统的目标检测…...

confluent-kafka入门教程

文章目录 官方文档与kafka-python的对比配置文档配置项 Producer代码示例Consumer代码示例 官方文档 confluent_kafka API — confluent-kafka 2.8.0 documentation Quick Start for Confluent Cloud | Confluent Documentation 与kafka-python的对比 对比维度confluent-ka…...

网络安全-Http\Https协议和Bp抓包

1. http协议,有请求必有相应, 请求协议, 响应协议; 2. 密码学加密机制及常用算法和常用名称说明: 算法 密钥 明文数据 密文; 加密算法分类和常用算法: 加密算法可以归结为三大类&#xff…...

TDengine 语言连接器(C#)

简介 TDengine.Connector 是 TDengine 提供的 C# 语言连接器。C# 开发人员可以通过它开发存取 TDengine 集群数据的 C# 应用软件。 .NET 版本兼容性 .NET Framework 4.6 及以上版本。.NET 5.0 及以上版本。 支持的平台 原生连接支持的平台和 TDengine 客户端驱动支持的平台…...

AI对百度搜索与抖音社区的影响差异?

在AIGC(生成式人工智能)快速发展的背景下,用户获取内容的方式确实变得更加直接和便捷。抖音、小红书等视频内容社区的流量下降速度可能比百度搜索更慢,这一现象可以从以下几个角度分析: 1. 内容形式的差异:…...

《ADVANCING MATHEMATICAL REASONING IN LAN- GUAGE MODELS》全文阅读

《ADVANCING MATHEMATICAL REASONING IN LAN- GUAGE MODELS: THE IMPACT OF PROBLEM-SOLVING DATA, DATA SYNTHESIS METHODS, AND TRAINING STAGES》全文阅读 提升语言模型中的数学推理能力:问题求解数据、数据合成方法及训练阶段的影响 \begin{abstract} 数学推…...

是德科技KEYSIGHT Agilent U2004A功率传感器

是德科技KEYSIGHT Agilent U2004A功率传感器 Keysight U2004A USB功率传感器的特性和规格包括: 频率范围为 9 kHz 至 6 GHz -60 至 20 dBm 的宽动态范围 内部调零功能消除了外部校准 测量速度高达 250 个读数/秒 在 PC 或其他 Agilent 仪器上显示功率测量值 频率…...

Kubernetes(K8S)内部功能总结

Kubernetes(K8S)是云技术的最核心的部分,也是构建是云原生的基石 K8S K8S,是Kubernetes的缩写,是Google开发的容器编排平台,现在由云原生计算基金会(CNCF)进行维护。 K8S&#xff…...

智谱最新模型GLM4是如何练成的

写在前面 这篇博客将基于《ChatGLM: A Family of Large Language Models from GLM-130B to GLM-4 All Tools》,深入剖析 GLM-4 系列在**模型架构设计、预训练、后训练(对齐)、以及关键技术创新(如长上下文处理、Agent 能力构建)**等环节的实现逻辑与设计考量,带你全面了…...

类头文件相互包含的问题

1.预编译指令: #ifndef CLASS_A_ #define CLASS_A_#include CLASS_B.h#endif 2.#pragma once 3.将类A中声明类B,并类中声明类B的指针,在类中的实现文件中包含类B的头文件。在类B中包含类A的头文件 a.h:class Bclass A {public:private:B*…...

云原生周刊:K8s 中的 GPU 共享

开源项目推荐 A2A Google 的 Agent2Agent(A2A)协议是一个开源标准,旨在促进不同框架和供应商构建的 AI 代理之间的互操作性。它允许代理通过统一的协议安全地交换信息、协同执行任务,并在多种企业平台和云环境中无缝协作。 A2A…...

(五)机器学习---决策树和随机森林

在分类问题中还有一个常用算法:就是决策树。本文将会对决策树和随机森林进行介绍。 目录 一.决策树的基本原理 (1)决策树 (2)决策树的构建过程 (3)决策树特征选择 (4&#xff0…...

DeepReaserch写的文献综述示例分享

目录 DeepReaserch提供的文献综述: 人工智能在医疗影像诊断中的研究进展综述(2015–2025) 引言 1 近十年研究进展回顾 1.1 深度学习崛起阶段(2015–2017年) 1.2 方法完善与临床初探(2018–2020年&…...

Token安全存储的几种方式

文章目录 1. EncryptedSharedPreferences示例代码 2. SQLCipher示例代码 3.使用 Android Keystore加密后存储示例代码1. 生成密钥对2. 使用 KeystoreManager 代码说明安全性建议加密后的几种存储方式1. 加密后采用 SharedPreferences存储2. 加密后采用SQLite数据库存储1. Token…...

阶段性使用总结-通义灵码

序言 前段时间用通义灵码,参加了下数字中国闽江流域的比赛。https://www.dcic-china.com/competitions/10173 最后成绩一般般,106名,大概有2000多人参加这题目,估计有一堆小号。 按照下面这个思路建模的,迭代了大概15…...

SpringBoot 与 Vue3 实现前后端互联全解析

在当前的互联网时代,前后端分离架构已经成为构建高效、可维护且易于扩展应用系统的主流方式。本文将详细介绍如何利用 SpringBoot 与 Vue3 构建一个前后端分离的项目,展示两者如何通过 RESTful API 实现无缝通信,让读者了解从环境搭建、代码实…...

Flutter 图标和按钮组件

引言 在 Flutter 应用开发中,图标和按钮是构建用户界面不可或缺的元素。图标能够以直观的图形方式传达信息,增强应用的视觉吸引力;而按钮则是用户与应用进行交互的重要途径。本文将详细介绍 Flutter 中图标和按钮组件的使用,涵盖…...

大模型平台Dify工作流高效调用Ragflow知识库,解决其原生知识库解析和检索能力不足的问题

Dify调用Ragflow知识库的详细步骤,安装详细部署在我之前文章 多图超详细:Docker安装知识库AI客服RAGFlow的详细步骤、使用教程及注意事项:。超详细:Dify大语言模型工作流开发平台的安装与使用,deepseek知识库客服等。…...

数据库的基本原则

数据库的核心原则 原子性与持久性:原子性(Atomicity)确保一个事务中的所有操作要么全部完成,要么完全不执行,不会出现部分完成的情况。持久性(Durability)则保证一旦事务提交成功,即…...

项目集管理汇报报告 (范本)

该文档适用于企业管理层、项目经理、项目团队成员以及对项目集管理感兴趣的人员。它对企业项目管理至关重要,通过全面分析 揭示了如目标达成率低、数据缺失严重、成本进度管控有风险等关键问题,为管理层提供决策依据,助力其了解项目整体状况&…...

阿里云 MSE Nacos 发布全新“安全防护”模块,简化安全配置,提升数据保护

作者:张文浩 阿里云在其微服务引擎(MSE)注册配置中心 Nacos 上正式推出全新“安全防护”功能模块,旨在帮助企业用户有效管理安全状态和降低开启安全相关功能的学习成本,提升微服务架构的安全性。首期推出的“安全防护…...

Pydantic v2 的使用

一、前言 Pydantic 是一个 Python 数据验证 和 设置管理 库,使用 Python 类型 注解。具有以下特点: 1.1 核心功能 数据验证:自动验证数据类型和约束条件类型转换:自动将输入数据转换为声明类型Schema 生成:自动生成…...

从零开始学A2A二 : A2A 协议的技术架构与实现

A2A 协议的技术架构与实现 学习目标 技术架构掌握 深入理解 A2A 协议的分层架构设计掌握各层次的功能和职责理解协议的工作原理和数据流 实现能力培养 能够搭建基本的 A2A 服务端掌握客户端开发方法实现智能体间的有效通信 架构设计理解 理解与 MCP 的本质区别掌握多智能体协…...

设计模式每日硬核训练 Day 12:装饰器模式(Decorator Pattern)完整讲解与实战应用

🔄 回顾 Day 11:适配器模式小结 在 Day 11 中,我们学习了适配器模式(Adapter Pattern): 用于将“不兼容”的接口适配为目标接口,解决新旧系统之间的桥接问题。强调“接口兼容、外部桥接”&…...

[CMake] CMakePresets.json简单使用

解决的问题 CMakePresets.json是为了解决在使用命令行编译使用CMake的项目时&#xff0c;可能会十分麻烦。如类似的参数-DCMAKE_BUILD_TYPEDebug所以有了CMakePresets.json来配置configure和build时的命令&#xff0c;然后在使用时 cmake --preset<configure-preset-name&…...

智能办公如何创建e10流程

智能办公如何创建e10流程 配置e10流程前&#xff0c;您要做的事情&#xff1a; 1、进入e10管理后台&#xff0c;创建应用&#xff0c;开放接口权限&#xff1b;2、进入e10管理后台&#xff0c;配置千里聆套件&#xff0c;配置同步人员&#xff1b;3、进入千里聆系统&#xff…...

Mac关闭sip方法

Mac关闭sip方法 导航 文章目录 Mac关闭sip方法导航完整操作流程图详细步骤 完整操作流程图 这东西是我在网上搬运下来的&#xff0c;但是我在为业务实操过程中&#xff0c;根据实操情况还是有新的注意点的 详细步骤 1.在「关于本机」-「系统报告」-「软件」;查看SIP是否开启…...

Flutter 播放利器:`media_kit` 的详细介绍与使用指南

在 Flutter 项目中实现音视频播放&#xff0c;开发者过去主要依赖如 video_player、just_audio 等第三方库&#xff0c;但这些库或多或少存在一些局限性&#xff0c;比如平台兼容性差、定制能力不足、播放格式有限等问题。 而 media_kit 是近年崛起的一款全平台音视频播放解决…...

GEO优化中的关键底座:知识图谱如何提升生成式AI的准确性与实时性?

今天&#xff0c;我将与大家分享如何通过GEO优化&#xff08;生成式人工智能优化&#xff09;和动态知识图谱&#xff0c;帮助企业提升智能化水平并实现高效的业务运营。首先&#xff0c;GEO优化利用生成式AI为企业提供内容生成、客服自动化和智能销售等服务&#xff0c;而知识…...

案例 - 登录认证:保障系统安全访问的实现

摘要&#xff1a;本文介绍了为Tlias智能学习辅助系统添加登录认证功能的过程&#xff0c;涵盖从需求分析、接口文档设计&#xff0c;到思路分析、功能开发以及最后的测试等多个关键环节&#xff0c;旨在实现只有通过登录认证的用户才能安全访问后台系统功能的目标。 关键词&am…...

Node.js Session 原理简单介绍 + 示例代码

目录 ✅ Session 原理简要说明 &#x1f9e9; 示例项目 - 使用 Node.js Express 实现简单 Session 登录 &#x1f4c1; 文件结构 &#x1f539; server.js (JavaScript) &#x1f538; index.html (HTML) ▶️ 程序运行步骤 ✅ 程序运行效果 &#x1f3af; 总结 在 We…...

C# 类型、存储和变量(C#程序是一组类型声明)

本章内容 C#程序是一组类型声明 类型是一种模板 实例化类型 数据成员和函数成员 预定义类型 用户定义类型 栈和堆 值类型和引用类型 变量 静态类型和dynamic关键字 可空类型 C#程序是一组类型声明 如果广泛地描述C和C程序源代码的特征&#xff0c;可以说C程序是一组函数和数据…...

复变函数摘记3

复变函数摘记3 5. 留数5.1 可去奇点、极点、本性奇点5.2 零点与极点的关系5.3 在无穷远点处的情形5.4 留数 5. 留数 \quad 如果函数 f ( z ) f(z) f(z) 在 z 0 z_0 z0​ 及 z 0 z_0 z0​ 的邻域内处处可导&#xff0c;那么称 f ( z ) f(z) f(z) 在点 z 0 z_0 z0​ 处解析。…...

深入定制 QSlider——实现精准点击跳转与拖拽区分

在使用 Qt 编写界面应用时,QSlider 是一个常用的滑动控件。但你可能会注意到,默认情况下点击滑轨(groove)区域时,滑块并不会直接跳到鼠标点击的位置,而是按照内部的分页步进(page step)行为响应。此外,垂直 Slider 在点击最底部时还存在 releaseEvent(或 sliderRelea…...

Summary

一、数据结构 1.1 哈希 主要是HashMap和HashSet&#xff1b;其中HashSet底层是一个HashMap属性。 // 获取HashMap元素,HashSet均不支持 map.keySet (); // Set<k> map.values (; // Collection<V> map.entrySet();//Set<Map.Entry<K,V>> for (Map.E…...

MCP Server 开发实战 | 大模型无缝对接 Grafana

前言 随着大模型的飞速发展&#xff0c;越来越多的 AI 创新颠覆了过往很多产品的使用体验。但你是否曾想过&#xff0c;在向大型语言模型提问时&#xff0c;它能否根据你的需求精准返回系统中的对应数据&#xff1f;例如&#xff0c;当用户查询 Grafana 服务时&#xff0c;模型…...

【ROS2】行为树 BehaviorTree(六):各种各样的节点

1、装饰器节点 Decorators 1)否操作 Inverter 如果子项失败则返回 SUCCESS,如果子项成功则返回 FAILURE。 如果子节点返回 RUNNING,则该节点也返回 RUNNING。 2)强制成功 ForceSuccess 如果子节点返回 RUNNING,则该节点也返回 RUNNING。 否则,它总是返回 SUCCESS。 3)…...

Docker Swarm 集群使用指南概述

概述 对于简单轻量级集群管理&#xff0c;利用 Docker Swarm 就够用了&#xff0c;适合中小型应用程序的容器编排。如果是比较重的中心化集群管理方案或需要更复杂的功能&#xff0c;可以考虑使用 Kubernetes Helm Consul 等更强大的容器编排工具。 Docker Swarm 1. Docke…...

【行业树选择器组件:基于Vue3与Element Plus的高性能树形选择组件优化与重构】

行业树选择器组件&#xff1a;基于Vue3与Element Plus的高性能树形选择组件优化与重构 组件概述与背景 行业树选择器是一个基于Element Plus的ElTreeSelect封装的业务组件&#xff0c;主要应用于能源管理系统中&#xff0c;用于展示和选择国标行业分类体系的四级层级结构。该…...

PasteForm框架开发之Entity多级嵌套的表单的实现

你相信么,使用PasteForm框架开发&#xff0c;管理端居然不要写代码&#xff01;&#xff01;&#xff01; 一起来看看PasteForm是否支持多级表模式(外表) 需求假设 假如有这么一个需求&#xff0c;就是订单表&#xff0c;包含了多级的信息&#xff0c;比如这个订单包含了哪些…...

Anaconda笔记

下载Anaconda 清华源 官方源 本文下载&#xff1a;Anaconda3-2024.10-1-Windows-x86_64.exe 建议不要安装到C盘&#xff0c;我的安装到D&#xff1a;Anaconda目录 设置环境变量 WinR cmd命令行输入&#xff1a; conda --version&#xff1a;可以查看到版本信息安装成功c…...

Linux——共享内存

目录 一、共享内存概念 二、共享内存的一些函数 2.1 shmget 创建共享内存 2.2 shmat 访问共享内存 2.3 shmdt 解除共享内存的映射 2.4 shnctl 删除共享内存段 三、共享内存 3.1 创建测试进程 3.2 使用循环测试 ​编辑 3.3 共享内存写入程序 3.4 带有信号量的共享内…...