【QT】QT中的信号与槽
QT中的信号与槽
- 一、信号与槽函数的作用
- 二、如何关联信号与槽函数
- 1、借助集成开发环境,右键转到槽函数
- 示例代码:
- 2、调用connect函数手动关联信号与槽函数
- 三、扩展
- 四、总结信号与槽的特点
- 1、一个类如果要使用信号以及槽函数,那么该类的定义中必须加上Q_OBJECT宏定义
- 2、同一个槽函数,可以被不同对象的信号关联
- 3、同一个信号,可以关联不同的槽函数
- 4、信号的发送者跟信号之间必须是所属关系(发送者对应的类里面必须有这个信号)
- 5、信号带参数,槽函数可以带参数,也可以不带参数
- 五、获取信号的发送者
- 示例代码:
- 六、自定义信号,发送信号
- 示例代码:
一、信号与槽函数的作用
用来在组件和组件,组件和窗口之间通信
- 信号:QT中给每个组件都定义了信号,每个信号都有它特定的触发条件(QT助手查询到每个信号的触发条件)
QT中所有的信号,本质上都是个函数,信号只有声明,没有源代码
比如:以按钮为例,常用的信号如下[signal] void QAbstractButton::clicked(bool checked = false) //当按钮按下去,然后松开的时候自动触发这个信号[signal] void QAbstractButton::released() //按钮松开会触发该信号[signal] void QAbstractButton::pressed() //按钮按下去触发该信号
- 槽函数:当某个信号触发的时候,跟这个信号对应的槽函数会被自动调用执行
二、如何关联信号与槽函数
关联信号与槽函数:就是使选择的信号跟槽函数形成一一对应关系
1、借助集成开发环境,右键转到槽函数
- 头文件中会自动生成槽函数的声明
private slots: //声明了一个私有的槽函数void on_pushButton_clicked(); //槽函数的原型声明
- 在源码.cpp文件中自动生成的槽函数的定义
on_对象的名字_信号的名字();
示例代码:
// login.cpp
#include "loginwin.h"
#include "ui_loginwin.h"
#include <QLabel>
#include <QFont>
#include <QLineEdit>
#include <QPushButton>
#include <iostream>
#include <QDebug>
using namespace std;
loginwin::loginwin(QWidget *parent): QMainWindow(parent), ui(new Ui::loginwin)
{ui->setupUi(this);//通过写代码把登录界面的ui做出来//第一步:标签//父窗口:这个组件(控件)等一会在哪个窗口上显示,这个窗口就是父窗口QLabel *lb1=new QLabel("学生管理系统",this);//设置按钮的坐标,宽高/*规律:任何组件,属性都有对应的设置方法,方法的名字统一叫做setxxx()比如:属性geometry --》对应的方法setGeometry()*/lb1->setGeometry(200,10,400,100);QFont myfont("楷体",24);lb1->setFont(myfont);//设置样式lb1->setStyleSheet("color:rgb(255,0,0);");//第二步:两个单行输入框QLineEdit *le1=new QLineEdit(this);QLineEdit *le2=new QLineEdit(this);//设置坐标,宽高le1->setGeometry(220,130,300,50);le2->setGeometry(220,220,300,50);//设置默认提示文字le1->setPlaceholderText("请输入用户名");le2->setPlaceholderText("请输入密码");//设置用户名,密码位数le1->setMaxLength(8);le2->setMaxLength(8);//设置密码隐藏le2->setEchoMode(QLineEdit::Password);//设置样式le1->setStyleSheet("border:2px solid#ff0000;");le2->setStyleSheet("border:2px solid#ff0000;");//设置字体le1->setFont(myfont);le2->setFont(myfont);//第三步:两个按钮QPushButton *bt1=new QPushButton("登录",this);QPushButton *bt2=new QPushButton("注册",this);bt1->setFont(myfont);bt2->setFont(myfont);//设置坐标,宽高bt1->setGeometry(200,300,100,50);bt2->setGeometry(450,300,100,50);//给主窗口设置边框图片this->setStyleSheet("QMainWindow{border-image: url(C:/Users/Administrator/Desktop/share/4.jpeg);}");
}loginwin::~loginwin()
{delete ui;
}//跟登录按钮有关的槽函数
//槽函数的定义--》代码由程序员来编写
void loginwin::on_pushButton_clicked()
{//C++的输出//cout<<"登录按钮被点击(按下去,然后松开)"<<endl;//cout<<"loginbt clicked"<<endl;//QT特有的输出,自动换行,不需要回车qDebug()<<"登录按钮被点击(按下去,然后松开)";
}//跟release信号有关的槽函数
void loginwin::on_pushButton_released()
{qDebug()<<"登录按钮松开";
}
//跟pressed信号有关的槽函数
void loginwin::on_pushButton_pressed()
{}// login.h
#ifndef LOGINWIN_H
#define LOGINWIN_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class loginwin; }
QT_END_NAMESPACEclass loginwin : public QMainWindow
{Q_OBJECTpublic:loginwin(QWidget *parent = nullptr);~loginwin();//翻译qt程序--》uic和moc(qt程序除了c++代码之外还有qt特有的(例如信号与槽),所有需要翻译成c++代码)
//slots是QT特有的关键字,C++中没有
private slots: //声明私有的槽函数//在源码.cpp文件中自动生成的槽函数的定义,命名有规律//on_对象的名字_信号的名字();void on_pushButton_clicked(); //槽函数的原型声明void on_pushButton_released(); //槽函数的原型声明void on_pushButton_pressed(); //槽函数的原型声明private:Ui::loginwin *ui;
};
#endif // LOGINWIN_H
2、调用connect函数手动关联信号与槽函数
有些场合无法右键转到槽(比如:按钮不是ui设计师拖过去,而是通过写代码new出来)
- 写法1:
connect(QObject *sender, PointerToMemberFunction signal,QObject *receiver, PointerToMemberFunction method)
- 写法2
connect(发送者指针,&类的名字::信号的名字,接收者,&类的名字::槽函数)参数:sender --》信号的发送者,指针signal --》发送什么信号receiver --》信号的接收者method --》需要调用的槽函数槽函数命名时候,可以跟自动生成的槽函数命名规律保持一致,也可以自行单独命名
比如:connect(ui->handlebt,SIGNAL(clicked(bool)),this,SLOT(fun())); //关联了handlebt这个按钮的clicked信号和槽函数fun()
QT使用技巧:头文件中声明了函数,右键选择refactor,可以在.cpp生成函数的定义
三、扩展
QObject --》QT中所有类的基类
作为形参的好处:实参可以传递任何类型(因为QT中所有的类都是QObject的子类)
四、总结信号与槽的特点
1、一个类如果要使用信号以及槽函数,那么该类的定义中必须加上Q_OBJECT宏定义
Q_OBJECT:QT把它称为元对象系统,作用支持信号与槽这种机制

2、同一个槽函数,可以被不同对象的信号关联
// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 同一个槽函数,可以被不同对象的信号关联connect(ui->btn1, SIGNAL(clicked()), this, SLOT(btn()));connect(ui->btn2, SIGNAL(clicked()), this, SLOT(btn()));connect(ui->btn3, SIGNAL(clicked()), this, SLOT(btn()));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::btn()
{qDebug()<<"按钮按下";
}
//===========================================//
// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void btn();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
3、同一个信号,可以关联不同的槽函数
槽函数的调用顺序跟关联的先后顺序一致,先关联的先调用
// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//同一个信号,可以关联不同的槽函数//槽函数的调用顺序关联的先后顺序一致,先关联的先调用connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(btn2()));connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(btn1()));connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(btn3()));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::btn1()
{qDebug()<<"按下btn1";
}void MainWindow::btn2()
{qDebug()<<"按下btn2";
}void MainWindow::btn3()
{qDebug()<<"按下btn3";
}
//=======================================================//
// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void btn1();void btn2();void btn3();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
4、信号的发送者跟信号之间必须是所属关系(发送者对应的类里面必须有这个信号)
信号的接收者跟槽函数之间必须是所属关系(接收者对应的类里面必须有这个槽函数)
// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//自己手动管理按钮的clicked信号跟自己写的槽函数/*信号的发送者跟信号之间必须是所属关系(发送者对应的类里面必须有这个信号)信号的接收者跟槽函数之间必须是所属关系(接收者对应的类里面必须有这个槽函数)*///错误1:信号发送者跟信号之间不是所属关系//connect(ui->pushButton,SIGNAL(textChanged(QString)),this,SLOT(fun()));//错误2:信号接收者跟槽函数之间不是所属关系//connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(myfun()));connect(ui->pushButton,SIGNAL(clicked()),ui->lineEdit,SLOT(fun()));
}MainWindow::~MainWindow()
{delete ui;
}
//自己手写的槽函数
void MainWindow::fun()
{qDebug()<<"按钮被点击了";
}// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots://自己手写槽函数,命名可以跟右键转到槽一样的命名,也可以随意命名void fun();
private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
5、信号带参数,槽函数可以带参数,也可以不带参数
区别:
- 槽函数带参数,参数必须跟信号保持一致,表示槽函数接收信号传递过来的参数
- 槽函数不带参数,表示不接收信号传递过来的参数
注意:
- 如果信号没有任何参数,此时槽函数也不可以有任何参数
- 信号带了参数,connect写的时候不要写参数的名字,只需要写参数的类型
- 槽函数带了参数,connect写的时候不要写参数的名字,只需要写参数的类型
五、获取信号的发送者
作用:当多个组件对象共用一个槽函数的时候,程序员需要知道是哪个组件对象触发的信号,此时就要获取信号的发送者
QObject *sender() const返回值:返回一个指针,该指针指向信号的发送者
QT中转换函数qobject_cast(QObject *object) //把父类的指针转换成子类地址
示例代码:
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 同一个槽函数,可以被不同对象的信号关联connect(ui->btn1, SIGNAL(clicked()), this, SLOT(btn()));connect(ui->btn2, SIGNAL(clicked()), this, SLOT(btn()));connect(ui->btn3, SIGNAL(clicked()), this, SLOT(btn()));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::btn()
{
// qDebug()<<"按钮按下";// 获取信号的发送者,并判断哪个按钮被按下QObject *is_sender = sender();if(is_sender == ui->btn1)qDebug()<<"按钮1按下";else if(is_sender == ui->btn2)qDebug()<<"按钮2按下";else if(is_sender == ui->btn3)qDebug()<<"按钮3按下";// QT中转换函数的使用QPushButton *btn = qobject_cast<QPushButton *>(is_sender);btn->setStyleSheet("background-color:rgb(0,255,0);");
}// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void btn();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
六、自定义信号,发送信号
//自定义信号语法格式signals:// 自定义信号;void mysignal(参数); //参数的类型个数依据需要自行添加
//发送信号//注意注意注意:自定义的信号必须程序员主动调用emit发送,不能自动触发的emit mysignal(实参);
示例代码:
// 第一个界面:mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "info_win.h"
#include <QString>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}
// 登录按钮的槽函数
void MainWindow::on_pushButton_clicked()
{// 获取输入的用户名和密码QString account = ui->lineEdit->text();QString pswd = ui->lineEdit_2->text();if(account == "aaa" && pswd == "123"){//创建第二个界面对象,必须传递this指针(把第一个界面的地址传给第二个界面)info_win *info_w = new info_win(this);// 将第一个界面的账号和密码传递给第二个界面 --信号发送connect(this, SIGNAL(sendSign(QString, QString)), info_w, SLOT(recvSlot(QString, QString)));emit sendSign(account, pswd);qDebug()<<"第一界面的地址是"<<this;// 显示第二个界面info_w->show();this->hide();}else{qDebug()<<"账号或密码错误,重新输入";}
}//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();signals: //自定义信号void sendSign(QString, QString);private slots:void on_pushButton_clicked();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
相关文章:
【QT】QT中的信号与槽
QT中的信号与槽 一、信号与槽函数的作用二、如何关联信号与槽函数1、借助集成开发环境,右键转到槽函数示例代码: 2、调用connect函数手动关联信号与槽函数 三、扩展四、总结信号与槽的特点1、一个类如果要使用信号以及槽函数,那么该类的定义中…...
使用Python爬虫获取1688商品(按图搜索)接口
一、引言 随着电商行业的不断发展,消费者对商品搜索的效率和准确性要求越来越高。1688作为国内领先的B2B电商平台,提供了丰富的商品搜索功能,其中按图搜索功能(类似于淘宝的拍立淘)极大地提升了用户的购物体验。本文将…...
C/C++ JSON 库综合对比及应用案例(六)
第六部分:C/C JSON 库综合对比及应用案例 📢 快速掌握 JSON!文章 视频双管齐下 🚀 如果你觉得阅读文章太慢,或者更喜欢 边看边学 的方式,不妨直接观看我录制的 JSON 课程视频!🎬 …...
AI Agent拐点已至,2B+2C星辰大海——行业深度报告
大家好,我是吾鳴。 今天吾鳴要给大家分享一份由开源证券出品的关于AI Agent的报告,报告从AI Agent商业化应用、C端B端应用与布局,投资建议等方向介绍2025AI Agent新元年。报告一共28页PDF,文末有完整版下载地址。 内容摘要 2025年…...
【CSS】- 表单控件的 placeholder 如何控制换行显示?
表单控件的 placeholder 如何换行展示? HTML 中,<textarea> 元素的 placeholder 属性默认情况下不支持换行。不过,可以通过以下几种方法来实现换行效果: 模版字符串 模板字符串可以轻松地创建多行字符串,而不…...
Mac 终端命令大全
—目录操作— ꔷ mkdir 创建一个目录 mkdir dirname ꔷ rmdir 删除一个目录 rmdir dirname ꔷ mvdir 移动或重命名一个目录 mvdir dir1 dir2 ꔷ cd 改变当前目录 cd dirname ꔷ pwd 显示当前目录的路径名 pwd ꔷ ls 显示当前目录的内容 ls -la ꔷ dircmp 比较两个目录的内容 d…...
常用天然地震链接
一些常用的天然地震链接汇总: 天然地震数据 - IRIS Wilber 3 DATA: NSF SAGE: Wilber 3: Select Event地震学入门知识 - 地震“学”网站:地震“学”地震数据处理Matlab code - github :The GISMO Toolbox - seismic data analysis in MATLAB…...
node.js、npm相关知识
Node.js 是一个基于 Chrome V8 JavaScript 引擎 构建的开源、跨平台的 JavaScript 运行时环境,主要用于服务器端编程。它允许开发者使用 JavaScript 编写高性能的后端服务,突破了 JavaScript 仅在浏览器中运行的限制。 npm(Node Package Man…...
基于HTML5和CSS3实现3D旋转相册效果
基于HTML5和CSS3实现3D旋转相册效果 这里写目录标题 基于HTML5和CSS3实现3D旋转相册效果项目介绍技术栈核心功能实现原理1. HTML结构2. CSS样式设计2.1 基础样式设置2.2 容器样式2.3 图片样式 3. JavaScript实现4. 交互功能实现4.1 触摸和鼠标拖拽4.2 播放控制 项目亮点技术难点…...
在 Fedora 系统下备份远程 Windows SQL Server 数据库的完整方案
一、环境准备与工具安装 1. 安装 Microsoft SQL Server 命令行工具 Fedora 需安装 mssql-tools 和 ODBC 驱动: # 添加 Microsoft 仓库 sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/8/prod.repo# 安装工具包 …...
上市电子制造企业如何实现合规的质量文件管理?
浙江洁美电子科技股份有限公司成立于2001年,是一家专业为片式电子元器件(被动元件、分立器件、集成电路及LED)配套生产电子薄型载带、上下胶带、离型膜、流延膜等产品的国家高新技术企业,主要产品有分切纸带、打孔经带、压孔纸带、上下胶带、塑料载带及其…...
什么是SSE和websocket
以下是 SSE(Server-Sent Events) 和 WebSocket 在大模型(如 ChatGPT)流式输出中的实际例子对比,包含代码实现和场景分析: —### 1. SSE(Server-Sent Events)#### 场景 大模型生成文本…...
QT操作Word文档
虽然 Qt 没有原生支持 Word 文档操作的模块,但可以通过以下几种方式实现 Word 文档的读写和操作: 1、使用 ActiveX/COM (仅限 Windows) 2、使用第三方库 (跨平台),比如: libopendocument等。 3、直接操作 DOCX 文件 (DOCX 是 ZIP+XML) 4、使用 HTML 作为中介格式 一、使…...
Redis 源码硬核解析系列专题 - 第一篇:Redis源码入门与整体架构
1. 引言 Redis作为一个高性能的内存键值数据库,其源码以简洁高效著称。通过解析Redis源码,我们可以深入理解其单线程模型、事件驱动机制以及模块化设计的精髓。本篇将从Redis的源码目录结构入手,剖析其整体架构,并聚焦启动流程和事件循环的核心实现。 2. Redis源码目录结构…...
vscode中的【粘滞滚动】的基本概念和作用,关闭了以后如何开启
1、粘滞滚动的基本概念和作用 VSCode中的“粘滞”功能主要是指编辑器在滚动时的一种特殊效果,使得编辑器在滚动到某个位置时会“粘”在那里,而不是平滑滚动到底部或顶部。 粘滞滚动的基本概念和作用 粘滞滚动功能可以让用户在滚动时更直观地看到当前…...
APIPost接口测试完整流程指南
APIPost接口测试完整流程指南 APIPost是一款国产的API开发测试工具,结合了Postman、Swagger和Mock的功能。以下是详细的APIPost接口测试流程: 一、环境准备 下载安装 官网下载:Apipost-API 文档、设计、调试、自动化测试一体化协作平台 支…...
IDEA如何设置以新窗口打开新项目
在 IntelliJ IDEA 中设置以新窗口打开新项目,可以通过以下两种方式实现: 方法 1:通过对话框提示选择新窗口 打开项目时: 当通过 File > Open(或欢迎界面点击 Open)选择新项目时,IDEA 会弹出对…...
【含文档+PPT+源码】基于微信小程序的社交摄影约拍平台的设计与实现
项目介绍 本课程演示的是一款基于微信小程序的社交摄影约拍平台的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系…...
C#使用用户名密码连接共享文件夹
C#使用用户名密码连接共享文件夹 创建连接 using System.ComponentModel; using System.Runtime.InteropServices;namespace Tests.ConsoleApp {public class ShareDirectoryConnect : IDisposable{private static readonly HashSet<Guid> _TOKENS new HashSet<Gui…...
Springboot集成Dubbo和Zookeeper框架搭建
目录 1.搭建环境 2.搭建步骤 3.效果展示 4.注意项 1.搭建环境如下图所示: 2.搭建步骤 2.1 目标概述 一共三个服务,一个公共接口服务,一个提供者服务,一个消费者服务。最终以浏览器或者postman查询接口,实现订单信息回显。最终项目结构如图所示: 2.2 …...
发票管理自动化-发票查验接口让财务告别繁琐的核验流程
发票管理的效率与准确性直接影响着企业运营的顺畅性,在过去,财务人员查验发票时,需手工输入发票代码、号码、日期、金额、验证码等信息一张一张进行核验。整个过程不仅操作繁琐,而且极易出错。若遇到验证码难以辨认的情况…...
小程序28-事件传参-data-*自定义数据
事件传参:在触发事件时,将一些数据作为参数传递给事件处理函数的过程,就是事件传参 在微信小程序中,我们经常会在组件上添加一些自定义数据,然后在事件处理函数中获取这些自定义数据,从而完成业务逻辑的开…...
基于modbusTcp连接Modbus Slave本地模拟服务通讯(C#编写ModbusTcp类库)(一)
C#编写ModbusTcp类库,模拟plc进行本地通信测试 Modbus是一个应用层协议,常用于工业自动化设备之间的通信,主要有两种传输方式:RTU和TCP。 常见的功能码包括读取线圈(01)、读取离散输入(02)、读保持寄存器(03)、读输入寄存器(04)、写单个线圈(05)、写单个寄存器(…...
IS-IS:单区域集成配置与多区域集成配置
一、IS-IS概述 IS-IS(Intermediate System to Intermediate System) 是一种链路状态内部网关协议(IGP),设计用于自治系统(AS)内部的路由选择。最初由ISO为OSI模型的无连接网络服务(…...
Open GL ES ->GLSurfaceView正交投影与透视投影方法中近远平面取值参考
坐标系 OpenGL ES使用右手坐标系,相机默认朝向负z方向 相机位置|vz轴<----- 0 -----> -near -----> -far -----不可见 可见区域 不可见裁剪规则 far>near>0,只有z值在[-far, -near]范围内的物体可见, 当z > -near…...
API 安全之认证鉴权
作者:半天 前言 API 作为企业的重要数字资源,在给企业带来巨大便利的同时也带来了新的安全问题,一旦被攻击可能导致数据泄漏重大安全问题,从而给企业的业务发展带来极大的安全风险。正是在这样的背景下,OpenAPI 规范…...
Gateway实战入门(四)、断言-请求头以及请求权重分流等
spring cloud-Gateway:断言-请求头以及请求权重分流等 一、断言Header信息要求项目前置环境要求案例一、断言-请求头信息-匹配X-Request-Id1、配置文件及代码2、测试案例二、断言-请求头信息-匹配API版本场景主要配置信息案例三、断言-请求头信息:匹配请求来源场景主要配置信…...
【人工智能】从 Llama 到 DeepSeek:开源大模型的演进与技术对比
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着人工智能的迅猛发展,开源大语言模型(LLM)在自然语言处理领域扮演着越来越重要的角色。本文从 Meta 的 Llama 系列开始,追溯开源大模…...
[测试] Google Test | 主流的 C 测试框架
目录 GoogleTest 2. 准备工作 3. 测试 4.怎么用 Attention is All You Need 写项目代码的时候 边写边测试 非常重要,这样可以帮助我们减少很多的问题。 这篇文章后面 主要以 GoogleTest 为例,进行介绍最近找了些 gtest 相关的资料,学习了下.后面主要…...
OpenCV 图形API(3)高层次设计概览
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 描述 G-API 是一个异构框架,提供了统一的 API 来使用多个支持的后端编程图像处理流水线。 关键的设计理念是在指定使用哪些内核和设备时保持流…...
