请添加图片描述

文章目录

  • 前言
  • 一、信号的本质
  • 二、槽的本质
  • 三、 信号和槽的使⽤
    • 3.1 连接信号和槽
  • 四、使用步骤
    • 4.1 通过QtCreator⽣成信号槽代码
  • 五、 ⾃定义信号和槽
    • 5.1 ⽰例1:信号和槽函数初步使用
    • 5.2 ⽰例2 两个类使用
    • 5.3 示例3 按钮使用触发信号
  • 六、 带参数的信号和槽
    • 6.1 ⽰例1:重载信号槽
    • 6.2 ⽰例2:信号槽参数列表匹配规则
    • 6.3 ⽰例3:信号的参数个数可以多于槽函数的参数个数,但是槽的参数个数不能多于信号参数个数
  • 🚩总结


前言

在Qt中,⽤⼾和控件的每次交互过程称为⼀个事件。⽐如"⽤⼾点击按钮"是⼀个事件,"⽤⼾关闭窗⼝"也是⼀个事件。每个事件都会发出⼀个信号,例如⽤⼾点击按钮会发出"按钮被点击"的信号,⽤⼾关闭窗⼝会发出"窗⼝被关闭"的信号。

Qt 中的所有控件都具有接收信号的能⼒,⼀个控件还可以接收多个不同的信号。对于接收到的每个信号,控件都会做出相应的响应动作。例如,按钮所在的窗⼝接收到"按钮被点击"的信号后,会做出"关闭⾃⼰"的响应动作;再⽐如输⼊框⾃⼰接收到"输⼊框被点击"的信号后,会做出"显⽰闪烁的
光标,等待⽤⼾输⼊数据"的响应动作。在Qt中,对信号做出的响应动作就称之为槽。

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


一、信号的本质

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

  • 按钮单击、双击
  • 窗⼝刷新
  • ⿏标移动、⿏标按下、⿏标释放
  • 键盘输⼊
    那么在Qt中信号是通过什么形式呈现给使⽤者的呢?
  • 我们对哪个窗⼝进⾏操作,哪个窗⼝就可以捕捉到这些被触发的事件。
  • 对于使⽤者来说触发了⼀个事件我们就可以得到Qt框架给我们发出的某个特定信号。
  • **信号的呈现形式就是函数,**也就是说某个事件产⽣了,Qt框架就会调⽤某个对应的信号函数,通知使⽤者。

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

二、槽的本质

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

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

实现:"点击按钮会关闭窗⼝"的功能,其实就是clicked()函数调⽤close()函数的效果。

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

  • 信号函数⽤ signals关键字修饰,槽函数⽤publicslotsprotectedslots或者privateslots修饰。signalsslotsQtC++的基础上扩展的关键字,专⻔⽤来指明信号函数和槽函数;

信号函数只需要声明,不需要定义(实现),⽽槽函数需要定义(实现)。

信号函数的定义是Qt⾃动在编译程序之前⽣成的.编写Qt应⽤程序的程序猿⽆需关注
这种⾃动⽣成代码的机制称为元编程(MetaProgramming).这种操作在很多场景中都能⻅到.

三、 信号和槽的使⽤

3.1 连接信号和槽

代码如下(示例):
Qt中,QObject类提供了⼀个静态成员函数connect(),该函数专⻔⽤来关联指定的信号函数和槽
函数。

关于QObject
QObject 是Qt内置的⽗类.Qt中提供的很多类都是直接或者间接继承⾃QObject.
这⼀点的设定和Java是⾮常相似的.

connect() 函数原型:

// 普通成员函数作为槽
template<typename Func1, typename Func2>
QMetaObject::Connection connect(const QObject *sender,    // 信号发送对象Func1 signal,             // 发送的信号(函数指针)const QObject *receiver,  // 信号接收对象Func2 slot,               // 接收的槽函数(函数指针)Qt::ConnectionType type = Qt::AutoConnection  // 连接类型
);// 静态成员函数作为槽
template<typename Func1, typename Func2>
QMetaObject::Connection connect(const QObject *sender, Func1 signal, Func2 slot, Qt::ConnectionType type = Qt::AutoConnection
);
connect (const Q0bject *sender,//sender:信号的发送者;const char * signal ,		//signal:发送的信号(信号函数);const Q0bject * receiver ,		//receiver:信号的接收者;const char *method ,			//method:接收信号的槽函数;Qt: :ConnectionType type = Qt: :AutoConnection )type:⽤于指定关联⽅式,默认的关联⽅式为Qt::AutoConnection,通常不需要⼿动设定。

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

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{QPushButton * btn = new QPushButton("关闭按钮");//创建按钮resize(800, 600); //调整窗口大小//关联信号和槽,实现点击“按钮”, 关闭“窗口”connect(btn, &QPushButton::clicked, this, &QWidget::close);}

在这里插入图片描述
2.2 查看内置信号和槽
系统⾃带的信号和槽通常是通过"**Qt帮助⽂档"**来查询。
如上述⽰例,要查询"按钮"的信号,在帮助⽂档中输⼊:QPushButton,

  • ⾸先可以在"Contents"中寻找关键字signals

如果没有找到,继续去⽗类中查找.因此我们去他的⽗类QAbstractButton中继续查找关键字signals
在这里插入图片描述
这⾥的clicked()就是要找的信号。槽函数的寻找⽅式和信号⼀样,只不过它的关键字是slot

四、使用步骤

4.1 通过QtCreator⽣成信号槽代码

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

**代码⽰例:**在窗⼝中设置⼀个按钮,当点击"按钮"时关闭"窗⼝".

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

  1. 双击widget.ui⽂件,进⼊UI设计界⾯;

在这里插入图片描述

  1. 在U设计窗口中拖入一个"按钮",并且修改"按钮"的名称及字体大小等;
    在这里插入图片描述

  2. 可视化生成槽函数;
    在这里插入图片描述

当单击"转到槽…"之后,出现如下界面:对于按钮来说,当点击时发送的信号是: clicked(),所以此处选择: clicked()
在这里插入图片描述

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

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

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

但是咱们⽇常写代码的时候,除⾮是IDE⾃动⽣成,否则最好还是不要依赖命名规则,⽽是显式使⽤connect更好.
⼀⽅⾯显式connect可以更清晰直观的描述信号和槽的连接关系.
另⼀⽅⾯也防⽌信号或者槽的名字拼写错误导致连接失效.
(当然,是配置⼤于约定,还是约定⼤于配置,哪种更好,这样的话题业界尚存在争议.此处我个
⼈还是更建议优先考虑显式connect)

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

五、 ⾃定义信号和槽

基本语法
在Qt中,允许⾃定义信号的发送⽅以及接收⽅,即可以⾃定义信号函数和槽函数。但是对于⾃定义的信号函数和槽函数有⼀定的书写规范。
1、⾃定义信号函数书写规范
(1)⾃定义信号函数必须写到"signals"下;
(2)返回值为void,只需要声明,不需要实现;
(3)可以有参数,也可以发⽣重载;

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

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

5.1 ⽰例1:信号和槽函数初步使用

1、在widget.h中声明⾃定义的信号和槽,如图所⽰;

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void EmitSignal();signals:void MySignal(); //信号声明public slots:void MySlots(); //槽声明private:Ui::Widget *ui;
};
#endif // WIDGET_H

在这里插入图片描述
2、在widget.cpp中实现槽函数,并且关联信号和槽

注意:图中的①和②的顺序不能颠倒。
原因是,⾸先关联信号和槽,⼀旦检测到信号发射之后就会⽴⻢执⾏关联的槽函数。反之,若先发射
信号,此时还没有关联槽函数,当信号发射之后槽函数不会响应.

#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{//关联自定义的信号和槽connect(this, &Widget::MySignal, this, &Widget::MySlots);//发射信号EmitSignal();ui->setupUi(this);
}void Widget::MySlots()
{qDebug() <<"我的信号和槽";
}void Widget::EmitSignal()
{emit MySignal();
}Widget::~Widget()
{delete ui;
}

在这里插入图片描述

5.2 ⽰例2 两个类使用

⽰例2:当⽼师说"上课了",学⽣们就"回到座位,开始学习"
1、在源文件中新建两个类,一个是老师类,一个是学生类;首先选中项目名称,鼠标右键----->“addnew…”

在这里插入图片描述
点击"addnew…"之后,出现如下界⾯:

在这里插入图片描述

选择"choose"出现如下界⾯.

注意:
在Qt中新建类时,要选择新建类的⽗类.
显然,当前项⽬中还没啥类适合做新类的⽗类,同时新的类也不是⼀个"窗⼝"或者"控件".这种情况⼀般选择QObject作为基类
这样做的好处是这个新类的对象可以搭配Qt的对象树机制.便于对象的正确释放

在这里插入图片描述
选择"下一步",出现如下界面:
在这里插入图片描述

对于"学⽣类"以上述同样的⽅式进⾏添加,添加完成之后,项⽬⽬录新增⽂件如下:

在这里插入图片描述
在teacher.h中声明信号函数:

#ifndef TEACHER_H
#define TEACHER_H#include <QObject>class Teacher : public QObject
{Q_OBJECT
public:explicit Teacher(QObject *parent = nullptr);signals:void MySignal(); //自定义信号函数声明
};#endif // TEACHER_H

在这里插入图片描述

在student.h中声明槽函数:

#ifndef STUDENT_H
#define STUDENT_H#include <QObject>class Student : public QObject
{Q_OBJECT
public:explicit Student(QObject *parent = nullptr);signals:public slots:void StartStudy(); //自定义槽函数
};#endif // STUDENT_H

在这里插入图片描述
在widget.h中实例化"⽼师类对象"和"学⽣类对象";

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include "student.h"
#include "teacher.h"QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void EmitSignal();
private:Teacher *tch;Student *stu;Ui::Widget *ui;
};
#endif // WIDGET_H

在这里插入图片描述

在student.cpp中实现槽函数:

#include "student.h"
#include <QDebug>Student::Student(QObject *parent): QObject{parent}
{}void Student::StartStudy()
{qDebug() << "回到座位,继续学习";
}

在这里插入图片描述
在widget.cpp中连接⾃定义信号和槽;

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{this->tch = new Teacher(this);this->stu = new Student(this);connect(tch, &Teacher::MySignal, stu, &Student::StartStudy);EmitSignal();ui->setupUi(this);
}void Widget::EmitSignal()
{emit tch->MySignal();
}Widget::~Widget()
{delete ui;
}

在这里插入图片描述

运⾏结果如下图⽰:
在这里插入图片描述

5.3 示例3 按钮使用触发信号

示例3:老师点击"按钮"触发学生上课;

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{this->tch = new Teacher(this);this->stu = new Student(this);QPushButton * btn = new QPushButton("上课了", this);resize(800, 600);btn->move(100, 100);connect(tch, &Teacher::MySignal, stu, &Student::StartStudy);connect(btn, &QPushButton::clicked, tch, &Teacher::MySignal);EmitSignal();ui->setupUi(this);
}void Widget::EmitSignal()
{emit tch->MySignal();
}Widget::~Widget()
{delete ui;
}

在这里插入图片描述
运⾏结果如下图⽰:
在这里插入图片描述

六、 带参数的信号和槽

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

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

6.1 ⽰例1:重载信号槽

(1)在"widget.h"头⽂件中声明重载的信号函数以及重载的槽函数;如下图所⽰:
在这里插入图片描述
(2)在"Widget.cpp"⽂件实现重载槽函数以及连接信号和槽。

注意:在定义函数指针时要指明函数指针的作⽤域。

在这里插入图片描述

(3)执⾏结果如下图所⽰

在这里插入图片描述

6.2 ⽰例2:信号槽参数列表匹配规则

1、在"widget.h"头⽂件中声明信号和槽函数;
在这里插入图片描述

2、在"widget.cpp"⽂件中实现槽函数以及连接信号和槽;

在这里插入图片描述

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

6.3 ⽰例3:信号的参数个数可以多于槽函数的参数个数,但是槽的参数个数不能多于信号参数个数

1、在"widget.h"头⽂件中声明信号和槽函数;

在这里插入图片描述

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


🚩总结

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91985.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91985.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/91985.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【OD机试题解法笔记】文件缓存系统

题目描述 请设计一个文件缓存系统&#xff0c;该文件缓存系统可以指定缓存的最大值&#xff08;单位为字节&#xff09;。 文件缓存系统有两种操作&#xff1a; 存储文件&#xff08;put&#xff09;读取文件&#xff08;get&#xff09; 操作命令为&#xff1a; put fileName …

Python中的sys.path与PYTHONPATH全解析:模块导入路径的底层机制与最佳实践

在Python项目开发中&#xff0c;很多人遇到过类似“模块导入失败”、“路径找不到”、“相对导入与绝对导入混乱”等问题。而这些问题的根源&#xff0c;几乎都绕不开一个核心概念——Python模块搜索路径。 今天&#xff0c;我们围绕sys.path 和 PYTHONPATH环境变量&#xff0…

python:如何调节机器学习算法的鲁棒性,以支持向量机SVM为例,让伙伴们看的更明白

鲁棒性&#xff08;Robustness&#xff09;指模型在噪声数据或异常值干扰下保持性能稳定的能力。想详细了解的可参考本人之前的博文 python机器学习&#xff1a;评价智能学习算法性能与效果的常见术语&#xff1a;不收敛、过拟合、欠拟合、泛化能力、鲁棒性一句话、一张图给您…

号源加锁升级思路(解决高并发问题)

原先逻辑链接&#xff1a;号源预约加锁思路_java 预约 接口加锁-CSDN博客 一、进行治疗项目和号源数据缓存 1.新建一个定时任务&#xff0c;主要在凌晨时缓存治疗项目和号源数据 1.1.类中使用redission获取锁&#xff08;用于分布式系统获取数据&#xff0c;保证原子性&…

MCP革命:AI世界的“USB-C”接口如何重塑智能体与外部工具的连接

> 一条标准化的数据通道,让AI从“对话专家”蜕变为“行动专家”,背后是一场由协议驱动的工具连接革命。 2024年11月,Anthropic公司开源了**Model Context Protocol(MCP)**。在短短9个月内,这项技术彻底改变了AI与外部世界的交互方式。截至2025年8月,MCP服务数量**从…

启用“安全登录”组合键(Ctrl+Alt+Delete)解锁

文章目录背景目标功能操作步骤效果背景 在日常工作中&#xff0c;我们有时需要让电脑长期开机运行&#xff08;如处理长任务、作为服务器等&#xff09;。然而&#xff0c;这其中存在一个潜在风险&#xff1a;当电脑处于锁屏或登录界面时&#xff0c;如果有人无意中触碰键盘比…

【08】C++实战篇——C++ 生成动态库.dll 及 C++调用DLL,及实际项目中的使用技巧

文章目录一、创建动态库dll (方法一)1 生成C 动态库dll1.1 创建项目MyDLL1.2 编写.h 和 .cpp文件1.3 设置 及 生成 DLL2 调用 C 动态库dll2.1 创建C 空项目DLLtest2.2 动态库配置 及代码调用测试3 实际项目中的使用技巧3.1 设置dll输出路径3.2 设置头文件引入路径3.3 改进后 测…

kettle插件-kettle http client plus插件,轻松解决https接口无法调用文件流下载问题

场景&#xff1a;小伙伴在使用kettle调用https接口过程中无法正常调用&#xff0c;程序出错问题&#xff0c;今天演示下用自研插件轻松解决这个问题。1、使用openssl 生成自签名证书openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 3652、使用…

C#中的除法

在C#中&#xff0c;除法操作可以通过使用 / 运算符执行。这个运算符可以进行整数除法或浮点除法&#xff0c;这取决于操作数的类型。整数除法当两个整数相除时&#xff0c;结果将自动向下取整到最接近的整数。这意味着结果是一个整数&#xff0c;而不是小数。int a 10; int b …

PPT文件密码解密工具推荐:Tenorshare PassFab for PPT绿色免安装一键解除密码限制,附详细教程和下载地址

前段时间&#xff0c;我帮朋友做一个商业演示的 PPT&#xff0c;为了防止文件被误操作或者内容泄露&#xff0c;我给 PPT 设置了密码。结果等朋友来拿文件的时候&#xff0c;我居然把密码忘得干干净净&#xff0c;这下可把我俩都急坏了。朋友那边马上就要用这个 PPT 去参加重要…

【数据结构】二叉树接口实现指南:递归方法的高效运用 (附经典算法OJ)

文章目录 1、前置说明 1、定义二叉树结点结构 2、创建新节点 3、手动创建二叉树 2、二叉树的遍历 1、前序&#xff0c;中序和后序遍历 1.1、二叉树前序遍历 1.2、二叉树中序遍历 1.3、二叉树后序遍历 2、二叉树层序遍历 3、二叉树的基础操作 1、二叉树节点总数 2、…

自动驾驶控制算法——LQR控制算法

自动驾驶控制算法——LQR控制算法 文章目录自动驾驶控制算法——LQR控制算法**一、LQR 是什么&#xff1f;**二、LQR 原理2.1 线性状态空间模型 (State–Space Model)2.2 二次型性能指标 JJJ2.3 代数黎卡提方程 (ARE)2.4 特点总结2.5 一句话总结 LQR 原理&#xff1a;2.5.1 场景…

Jotai:React轻量级原子化状态管理,告别重渲染困扰

简介 Jotai 是一个为 React 提供的原子化状态管理库&#xff0c;采用自下而上的方法来进行状态管理。Jotai 受 Recoil 启发&#xff0c;通过组合原子来构建状态&#xff0c;并且渲染基于原子依赖性进行优化。这解决了 React 上下文的额外重新渲染问题&#xff0c;并消除了对 m…

C语言数据结构(7)贪吃蛇项目2.贪吃蛇项目实现

8. 核心逻辑实现分析 8.1 游戏主逻辑 程序开始就设置程序支持本地模式&#xff0c;然后进入程序的主逻辑。 主逻辑分为3个过程&#xff1a; • 游戏开始&#xff08;GameStart&#xff09;完成游戏的初始化。 • 游戏运行&#xff08;GameRun&#xff09;完成游戏运行逻辑的…

知识蒸馏 - 最小化KL散度与最小化交叉熵是完全等价的

知识蒸馏 - 最小化KL散度与最小化交叉熵是完全等价的 flyfish KL散度与交叉熵的数学关系 对于两个概率分布 PPP&#xff08;真实分布&#xff09;和 QQQ&#xff08;模型预测分布&#xff09;&#xff0c;KL散度的定义是&#xff1a; DKL(P∥Q)∑xP(x)log⁡(P(x)Q(x)) D_{KL}(P…

设计心得——网络包的处理

一、介绍 在程序的开发中&#xff0c;网络开发是一个重要的应用场景。毕竟这些年IT行业之所以火&#xff0c;主要还是互联网&#xff08;移动互联网&#xff09;带来的。网络开发&#xff0c;有各种平台、框架以及系统和库提供的API&#xff0c;如果说网络开发是一个特别复杂和…

sqli-labs通关笔记-第30关GET字符注入(WAF绕过 双引号闭合 手工注入+脚本注入两种方法)

目录 一、源码分析 1、index.php代码审计 2、login.php代码审计 3、java_implimentation函数 4、whitelist函数 5、SQL安全性分析 二、渗透实战 1、进入靶场 2、WAF探测 &#xff08;1&#xff09;触发WAF &#xff08;2&#xff09;绕过WAF 3、手工注入 &#xf…

【openlayers框架学习】九:openlayers中的交互类(select和draw)

文章目录openlayers进阶28 openlayers中的事件29 openlayers中select交互类的使用30 openlayers中select常见的配置选项31 openlayers中绘制交互类&#xff08;Draw&#xff09;openlayers进阶 28 openlayers中的事件 常用进行事件交互的对象&#xff1a;map\view\source29 o…

Java企业级应用性能优化实战

在企业级Java应用开发中,性能优化是确保系统稳定运行的关键因素。本文将从多个维度深入分析Java应用性能瓶颈,并提供实战优化方案。 🎯 性能优化核心领域 1. 对象操作性能优化 在企业应用中,对象拷贝是一个高频操作,特别是在分层架构中的DO、DTO、VO转换。选择合适的拷…

LLM Prompt与开源模型资源(3)如何写一个好的 Prompt

学习材料&#xff1a;https://www.hiascend.com/developer/courses/detail/1935520434893606913 &#xff08;3.5&#xff09;学习时长&#xff1a; 预计 60 分钟学习目的&#xff1a; 了解提示工程的定义与作用熟悉提示工程的关键技术相关概念掌握基于昇腾适配的大模型提示工程…