信号槽【QT】
文章目录
- 对象树
- 字符集
- 信号槽
- QT坐标系
- 信号与槽
- connect
- 自定义槽
- 自定义信号
- disconnect
对象树
#ifndef MYLABEL_H
#define MYLABEL_H#include<QLabel>
class MyLabel : public QLabel
{
public:// 构造函数使用带 QWidget* 版本的.// 确保对象能够加到对象树上MyLabel(QWidget * parent);~MyLabel() ;
};#endif // MYLABEL_H
上述代码,在 Qt 中不会产生内存泄露。
label 对象会在合适的时候被析构释放~~(虽然没有手动写 delete,确实能释放)
之所以能够把对象释放掉,主要是因为把这个对象是挂到了对象树上。
使用对象树,把这些内容组织起来,最主要的目的,就是为了能够在合适的时机 (窗口关闭/销毁)
把这些对象统一进行释放.
如果对象树的某个对象提前销毁,此时就会导致对应的控件就在界面上不存在了
#include "mylabel.h"
#include<iostream>
#include<QDebug>
MyLabel::MyLabel(QWidget * parent):QLabel(parent)
{}MyLabel::~MyLabel()
{//打印日志//会出现乱码//std::cout << "MyLabel 被销毁!" << std::endl;//QDebug 是 Qt 中的类。又不会直接使用这个类。这个宏,封装了 QDebug 对象。//直接使用 qDebug() 可以当做 cout来使用qDebug() << "MyLabel 被销毁!";
}
析构函数是执行了,虽然没有手动 delete,但是由于把 MyLabel 挂到了对象树上。此时窗口被销毁的时候,就会自动销毁对象树中的所有对象。MyLabel 的析构是执行了
解决乱码方案:
Qt 中提供了一个 qDebug() 工具,可以完成打印日志的过程。很好的处理字符编码
QDebug 是 Qt 中的类。又不会直接使用这个类。这个宏,封装了 QDebug 对象。
直接使用 qDebug() 这个东西就可以当做 cout 来使用。
使用 qDebug,打印的调试日志,是可以统一进行关闭的,qDebug 可以通过编译开关,来实现一键式关闭
字符集
出现乱码, 就是编码方式不匹配( 不局限于 C++)
如果字符串本身是 utf8 编码的,但是终端(控制台)是按照 gbk 的方式来解析显示的(拿着 utf8 这里的数值,去查询 gbk 的码表),就会出现乱码
用记事本方式来打开文件,将文件另存为,并查看文件字符集
显示的是 UTF-8,说明这个文件就是 UTF-8 编码
显示的是 ANSI,说明这个文件就是 GBK 编码
信号槽
Qt 中的 connect 是 QObject 这个类提供的静态函数。这个函数的作用就是 “连接信号和槽”
在 Qt Designer 中创建一个控件时,此时就会给这个控件分配一个 objectName 属性。这个属性的值,要求是在界面中得是唯一的(不能重复)
QPushButton :
qmake 在预处理 .ui 文件的时候,就会根据这里的 objectName 生成对应的 C++ 代码。C++ 代码中该 QPushButton 对象的变量名字就是这里的 objectName。这个变量就是 ui 属性中的成员变量。
widget.cpp文件中通过connect连接信号与槽函数
通过图形化界面的方式,实现的按钮版 hello world
此时按钮对象,不需要new , new 对象的操作已经是被 Qt 自动生成了
而且这个按钮对象,已经作为 ui 对象里的一个成员变量了。
也无需作为 Widget 的成员
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->myButton ,&QPushButton::clicked ,this , &Widget::handleClick );
}Widget::~Widget()
{delete ui;
}void Widget::handleClick()
{//获取文本是hello Worldif(ui->myButton->text() == QString("hello World")){// 当按钮被点击之后,就把按钮中的文本,进行切换ui->myButton->setText("hello qt");}//获取文本不是hello Worldelse{// 当按钮被点击之后,就把按钮中的文本,进行切换ui->myButton->setText("hello World");}
}
widget.cpp
纯代码方式实现Hello World
纯代码版本:
myButton按钮对象是new 的
为了保证其他函数中能够访问到这个变量,就需要把myButton按钮对象设定为 Widget 类的成员变量
#include "widget.h"
#include "ui_widget.h"
#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);myButton = new QPushButton(this) ;myButton->setText("hello world") ;//将信号与槽函数关联connect(ui->pushButton ,&QPushButton::clicked ,this , &Widget::handleClick );
}Widget::~Widget()
{delete ui;
}
//槽函数void Widget::handleClick (){//检查myButton按钮的当前文本 是否为"hello world"if(myButton->text() == QString("hello world")){myButton->setText("hellp qt") ;}else{myButton->setText("hellp world") ; }}
QT坐标系
坐标系的原点 (0, 0) 就是屏幕的左上角 / 窗口的左上角
给 Qt 的某个控件,设置位置,就需要指定坐标。对于这个控件来说,坐标系原点就是相对于父窗口/控件的。
例如:
QPushButton 的父元素/父控件/父窗口 是 QWidget
QWidget 没有父元素 (NULL),就相当于父元素就是整个显示器桌面了~~
信号与槽
Qt 中,谈到信号,也是涉及到三个要素
信号源:由哪个控件发出的信号。
信号的类型:用户进行不同的操作,就可能触发不同的信号。
例如:点击按钮,触发点击信号。在输入框中移动光标,触发移动光标的信号。勾选一个复选框,选择一个下拉框,都会触发出不同的信号。
信号的处理方式:槽(slot),就是函数
Qt 中可以使用 connect 这样的函数,把一个信号和一个槽关联起来。后续只要信号触发了,Qt 就会自动的执行槽函数
槽函数,本质上也是一种"回调函数" (callback)
一定是先把信号的处理方式准备好,再触发信号
Qt 中,一定是先关联号信号和槽,然后再触发这个信号,顺序不能颠倒,否则信号就不知道如何处理了
connect
connect,这个函数和 Linux 中TCP的socket 中建立连接的函数,没有任何关系,只是名字恰巧一样了。
connect是 QObject 提供的静态的成员函数。
connect(const QObject *sender,const char *signal,const QObject *receiver,const char *method,Qt::ConnectionType type = Qt::AutoConnection);
sender : 当前信号是哪个控件发出来的
signal : 信号的类型
receiver : 哪个对象(控件)负责处理
method: 这个对象如何处理 (要处理信号的对象提供的成员函数)
type : 很少使用,暂时不考虑
例如:
#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton * button = new QPushButton(this) ;button->setText("关闭") ;button->move(200,300);//close是QWidget内置的槽函数. Widget继承自QWidget,也就继承了QWidget的槽函数.//close:关闭当前的窗口/控件connect(button ,&QPushButton::clicked , this , &Widget::close) ;
}
Widget::~Widget()
{delete ui;
}
自定义槽
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置按钮//点击按钮就修改窗口标题QPushButton * button = new QPushButton (this) ; //this,挂到对象树上button->setText("按钮");button->move(100,100); //移动坐标connect(button , &QPushButton::clicked , this , &Widget::handleClicked) ;}Widget::~Widget()
{delete ui;
}void Widget::handleClicked()
{//点击按钮就修改窗口标题setWindowTitle("按钮已经按下");}
自定义槽函数 ,用ui界面
在Qt 中,除了通过connect来连接信号槽之外,还可以通过函数名字的方式来自动连接
选择clicked() ,就会在widget.cpp 生成on_pushButton_clicked 函数的定义
当函数名符合上述规则之后,Qt就能自动的把信号和槽给建立上联系
自定义信号
Qt 的信号,本质上也就是一个“函数”
Qt 5 以及更高版本中,槽函数和普通的成员函数之间,基本没有差别
但是信号,则是一类非常特殊的函数。
程序员只要写出函数声明,并且告诉 Qt,这是一个“信号”即可。
这个函数的定义,是 Qt 在编译过程中自动生成的。(自动生成的过程,程序员无法干预)
作为信号函数,这个函数的返回值,必须是void ,有没有参数都可以, 甚至也可以支持重载
signals : 是 Qt 自己扩展出来的关键字
qmake 的时候,调用一些代码的分析/生成工具,
扫描到类中包含signals 这个关键字的时候.此时,就会自动的把下面的函数声明认为是信号,并且给这些信号函数自动的生成函数定义
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();//自定义信号
signals:void mysignal() ;//自定义槽函数
public slots: //qt5以上 ,public slots可以省略void handleMySignal() ; private:Ui::Widget *ui;
};
#endif // WIDGET_H
如何才能触发出自定义的信号呢?
Qt 内置的信号,不需要手动通过代码来触发
用户在 GUI,进行某些操作,就会自动触发对应信号。(发射信号的代码已经内置到 Qt 框架中了)
例:
widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//将自定义信号与槽函数绑定connect (this, &Widget::mysignal , this, &Widget::handleMySignal) ;}Widget::~Widget()
{delete ui;
}void Widget::handleMySignal()
{setWindowTitle("处理自定义信号");
}void Widget::on_pushButton_clicked()
{//发送信号的操作,也可以在任意合适的代码中.不一定非得在构造函数里//此时就是点击按钮的时候,发送自定义信号了emit mysignal();// 发出自定义的信号//emit可以省略
}
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();//自定义信号
signals:void mysignal() ;//自定义槽函数
public slots:void handleMySignal() ;//槽函数
private slots:void on_pushButton_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H
信号和槽也可以带参数
当信号带有参数的时候,槽的参数必须和信号的参数一致~~
此时发射信号的时候,就可以给信号函数传递实参。与之对应的这个参数就会被传递到对应的槽函数中。
这里的参数类型必须要一致
个数可以不一致,但是 信号的参数的个数必须要比槽的参数个数要更多。
个数可以不一致,但是 信号的参数的个数必须要比槽的参数个数要更多 ,原因:
一个槽函数,有可能会绑定多个信号,如果我们严格要求参数个数一致,就意味着信号绑定到槽的要求就变高了。换而言之,当下这样的规则,就允许信号和槽之间的绑定更灵活了。更多的信号可以绑定到这个槽函数上了
例如:
参数类型必须要一致 ,个数一致
widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//将自定义信号与槽函数绑定connect (this, &Widget::mysignal , this, &Widget::handleMySignal) ;}Widget::~Widget()
{delete ui;
}void Widget::handleMySignal(const QString & text )
{setWindowTitle(text);
}void Widget::on_pushButton_clicked()
{//发送信号的操作,也可以在任意合适的代码中.不一定非得在构造函数里//此时就是点击按钮的时候,发送自定义信号了emit mysignal("把标题设置为标题1");// 发出自定义的信号
}void Widget::on_pushButton_2_clicked()
{emit mysignal("把标题设置为标题2");// 发出自定义的信号
}
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();//自定义信号
signals:void mysignal(const QString & text) ;//自定义槽函数
public slots:void handleMySignal(const QString & text) ;//槽函数
private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H
参数类型必须要一致 ,信号的参数的个数必须要比槽的参数个数要更多
例如:
widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//将自定义信号与槽函数绑定connect (this, &Widget::mysignal , this, &Widget::handleMySignal) ;}Widget::~Widget()
{delete ui;
}void Widget::handleMySignal(const QString & text)
{setWindowTitle(text);
}void Widget::on_pushButton_clicked()
{//发送信号的操作,也可以在任意合适的代码中.不一定非得在构造函数里//此时就是点击按钮的时候,发送自定义信号了emit mysignal("把标题设置为标题1","");// 发出自定义的信号
}void Widget::on_pushButton_2_clicked()
{emit mysignal("把标题设置为标题2","");// 发出自定义的信号
}
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();//自定义信号
signals:void mysignal(const QString & text,const QString & text2) ;//自定义槽函数
public slots:void handleMySignal(const QString & text) ;//槽函数
private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H
Q_OBJECT:
Qt硬性规定:Qt中如果要让某个类能够使用信号槽(可以在类中定义信号和槽函数)
必须要在类最开始的地方,写下 Q_OBJECT 宏。
一个信号,可以 connect到多个槽函数上
一个槽函数,也可以被多个信号 connect
例如:
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();
signals://自定义信号void mySignal1() ;void mySignal2() ;void mySignal3() ;
public slots://自定义槽函数void mySlot1();void mySlot2();void mySlot3();private:Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//信号与槽函数 ,形成多对多的关系connect(this, &Widget::mySignal1, this, &Widget::mySlot1);connect(this, &Widget::mySignal1, this, &Widget::mySlot2);connect(this, &Widget::mySignal2, this, &Widget::mySlot1);connect(this, &Widget::mySignal2, this, &Widget::mySlot3);
}Widget::~Widget()
{delete ui;
}void Widget::mySlot1()
{qDebug() << "mySlots1" ;
}
void Widget::mySlot2()
{qDebug() << "mySlots2" ;
}
void Widget::mySlot3()
{qDebug() << "mySlots3" ;
}
disconnect
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();
public slots :void handClick() ;
public slots :void handClicked2();
private slots:void on_pushButton_2_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//将信号与槽函数关联connect(ui->pushButton ,& QPushButton::clicked, this , &Widget::handClick) ;
}Widget::~Widget()
{delete ui;
}void Widget::handClick()
{setWindowTitle("修改窗口的标题");qDebug() <<"handClick";
}void Widget::handClicked2()
{setWindowTitle("修改窗口的标题2");qDebug() <<"handClicked2";
}
void Widget::on_pushButton_2_clicked()
{//1、先断开pushButton 的信号槽disconnect(ui->pushButton ,&QPushButton::clicked, this, &Widget::handClick );//2、重新绑定信号槽connect(ui->pushButton ,&QPushButton::clicked, this , &Widget::handClicked2) ;
}
定义槽函数使用lambda
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();private:Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置一个按钮,并将按钮移动位置QPushButton * button= new QPushButton(this) ;button->setText("按钮" ) ;button->move(200,200) ;//关联信号与槽函数//lambda就是槽函数connect(button ,&QPushButton::clicked , this ,[button,this](){qDebug()<<"lambda被执行了";button->move(500,500) ;this->move(500,500);} );}Widget::~Widget()
{delete ui;
}
相关文章:
信号槽【QT】
文章目录 对象树字符集信号槽QT坐标系信号与槽connect自定义槽自定义信号disconnect 对象树 #ifndef MYLABEL_H #define MYLABEL_H#include<QLabel> class MyLabel : public QLabel { public:// 构造函数使用带 QWidget* 版本的.// 确保对象能够加到对象树上MyLabel(QWi…...
【JAVA】JAVA接口公共返回体ResponseData封装
一、JAVA接口公共返回体ResponseData封装,使用泛型的经典 例子 public class ResponseData<T> implements Serializable { /** * */ private static final long serialVersionUID 7098362967623367826L; /** * 响应状态码 */ …...
如何评估并持续优化AI呼出机器人的使用效果
如何评估并持续优化AI呼出机器人的使用效果 作者:开源呼叫中心FreeIPCC 随着人工智能技术的发展,AI呼出机器人在企业中的应用越来越广泛。这些智能系统不仅提高了工作效率、降低了成本,还改善了客户体验。然而,要确保AI呼出机器…...
SQL注入漏洞详解
SQL注入是一种常见且十分严重的安全漏洞。它利用应用程序对用户输入的验证不充分,从而导致恶意的SQL查询被执行,可能导致数据泄露、篡改、甚至系统被攻陷。本文将详细解析SQL注入攻击的原理,举例说明其实现过程,并提供多种防范方案…...
爬虫逆向学习(十四):分享一下某数通用破解服务开发经验
阅前须知 这篇博客不是教大家怎么实现的,而且告知大家有这个东西,或者说一种趋势,借此分享自己大致的实现经验。具体的实现我也不好整理,毕竟是在别人的基础上缝缝补补。 前言 使用补环境方式破解过某数的同学都知道࿰…...
同步升压芯片-FP6276BXR-G1不能工作的原因
电源管理芯片FP6276BXR-G1是一个升压稳压电源,我用来把一节锂电池升压到5V电源 这个芯片是一个神奇的芯片,为什么专门拉出来写一篇文章呢,就是焊接好后,发现点不亮,这个就糟糕了。 这个是网友 memoff的一张图&#…...
Iris简单实现Go web服务器
package mainimport ("github.com/kataras/iris" )func main() {app : iris.New() // 实例一个iris对象//配置路由app.Get("/", func(ctx iris.Context) {ctx.WriteString("Hello Iris")})app.Get("/aa", func(ctx iris.Context) {ct…...
基于Spring Boot的营销项目系统
一、系统背景与意义 随着互联网技术的飞速发展,电子商务已成为现代商业活动的重要组成部分,深刻改变了人们的购物习惯和消费模式。然而,面对日益激烈的市场竞争和消费者需求的多样化,传统的电商管理系统往往存在功能单一、数据处…...
百度飞桨:零基础入门深度学习
目录 前言一、概念:机器学习&深度学习1. 机器学习2. 深度学习 二、实操:波士顿房价预测任务1. 线性回归模型2. 线性回归模型的神经网络结构3. 数据处理4. 模型设计5. 训练配置6. 训练过程6.1. 梯度下降法6.2. 计算梯度6.3. 使用Numpy进行梯度计算6.4…...
架构信息收集(小迪网络安全笔记~
附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正! 2.2 架构信息收集 引子:一个Web应用的构成,由诸多组件&服务相结合,而域名仅是处于Web架构中最表…...
【Python】pandas库---数据分析
大学毕业那年,你成了社会底层群众里,受教育程度最高的一批人。 前言 这是我自己学习Python的第四篇博客总结。后期我会继续把Python学习笔记开源至博客上。 上一期笔记有关Python的NumPy数据分析,没看过的同学可以去看看:【Pyt…...
天猫魔盒M17/M17S_超级UI 线刷固件包-可救砖(刷机取消双勾)
在智能电视盒子的领域中,天猫魔盒 M17 以其独特魅力占据一席之地,然而,原厂设置有时难以满足进阶用户的多元需求。此刻,刷机成为开启全新体验的关键钥匙,为您的盒子注入鲜活能量。 一、卓越固件特性概览 此款精心打造的…...
【Flink-scala】DataStream编程模型之延迟数据处理
DataStream API编程模型 1.【Flink-Scala】DataStream编程模型之数据源、数据转换、数据输出 2.【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 3.【Flink-scala】DataStream编程模型之水位线 4.【Flink-scala】DataStream编程模型之窗口计算-触发器-…...
samout llm解码 幻觉更低更稳定
这段代码定义了一个简单的对话生成系统,包括模型加载、词汇表加载、以及基于给定提示生成文本的功能。下面是对代码的解析: load_model_and_voc(device"cpu"): 该函数用于加载预训练的模型和词汇表(vocabulary)。它首先…...
python学opencv|读取图像(十六)修改HSV图像HSV值
【1】引言 前序学习进程中,我们已经掌握了对HSV通道和BGR通道的拆分和合并,并通过自由组合的形式,获得了和初始图像完全不一样的新图像,相关文章可以参考下述链接: python学opencv|读取图像(十四…...
nginx自定义错误页面
一、Nginx 自定义错误页面笔记 error_page 指令 语法:error_page error_code [|answer-code] uri;作用:用于定义当特定的 HTTP 错误发生时,Nginx 应该返回给客户端的自定义页面。error_code 是需要自定义页面的 HTTP 错误码,例如 …...
通过枚举值调用函数
在做业务的时候,需要根据前端传递的不同枚举参数(比如说0,1)返回对应固定的值。但是这个值需要根据时间又有所变化。我们可以使用if-else去实现对应的逻辑,比如说,当前端传递参数为0是,需要返回…...
[手机Linux] 六,ubuntu18.04私有网盘(NextCloud)安装
一,LNMP介绍 LNMP一键安装包是一个用Linux Shell编写的可以为CentOS/RHEL/Fedora/Debian/Ubuntu/Raspbian/Deepin/Alibaba/Amazon/Mint/Oracle/Rocky/Alma/Kali/UOS/银河麒麟/openEuler/Anolis OS Linux VPS或独立主机安装LNMP(Nginx/MySQL/PHP)、LNMPA(Nginx/MySQ…...
powershell(1)
免责声明 学习视频来自 B 站up主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 泷羽sec官网:http…...
Message Processing With Spring Integration高级应用:自定义消息通道与端点
一、Spring Integration 简介 Spring Integration 是 Spring 框架的扩展,支持企业集成模式(EIP),提供轻量级的消息处理功能,帮助开发者构建可维护、可测试的企业集成解决方案。 核心目标: 提供简单的模型…...
CUDA从入门到精通(六)——CUDA编程模型(二)
1. 核函数类型限定符 CUDA 核函数的常用函数类型限定符及其相关信息的表格: 限定符执行端调用方式备注__global__设备端(GPU)从主机代码使用 <<<...>>> 调用核函数用于声明核函数,在 GPU 上执行。只能从主机代…...
*【每日一题 基础题】 [蓝桥杯 2023 省 B] 飞机降落
题目描述 N 架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 Ti 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 Di 个单位时间,即它最早可以于 Ti 时刻开始降落,最晚可以于 Ti Di 时刻开始降落。降落过程需要 Li个单位时间…...
作业Day4: 链表函数封装 ; 思维导图
目录 作业:实现链表剩下的操作: 任意位置删除 按位置修改 按值查找返回地址 反转 销毁 运行结果 思维导图 作业:实现链表剩下的操作: 1>任意位置删除 2>按位置修改 3>按值查找返回地址 4>反转 5>销毁 任意…...
线性规划中的几种逻辑表达式
线性规划中的几种逻辑表达式 注意: 摘录字刘博士的《数学建模与数学规划》, 以便用时可查。 实际上Gurobi API 中自身放啊变的逻辑表达式函数,下面列出自定义的实现方式。 1 逻辑与 如果 x 1 1 x_1 1 x11, x 2 1 x_2 1 x21, 那…...
NX二次开发通过内部函数获取面的面积MW_face_ask_area
获取动态库libmold.dll的路径 void TcharToChar(const TCHAR* tchar, char* _char) {int iLength; #if UNICODE//获取字节长度 iLength WideCharToMultiByte(CP_ACP, 0, tchar, -1, NULL, 0, NULL, NULL);//将tchar值赋给_char WideCharToMultiByte(CP_ACP, 0, tchar, -…...
初学stm32 ——— 串口通信
目录 STM32的串口通信接口 UART异步通信方式特点: 串口通信过程 STM32串口异步通信需要定义的参数: USART框图: 常用的串口相关寄存器 串口操作相关库函数 编辑 串口配置的一般步骤 STM32的串口通信接口 UART:通用异步收发器USART&am…...
分割双声道音频-Audacity和ffmpeg
双声道音频资源: https://download.csdn.net/download/yudelian/90135217 1、ffmpeg分割双声道音频 ffmpeg -i input.wav -map_channel 0.0.0 left.wav -map_channel 0.0.1 right.wav 2、audacity分割双生音频并且播放 选择分离立体声轨 可以看出分离出了两个音频…...
在 Spring Boot 3 中实现基于角色的访问控制
基于角色的访问控制 (RBAC) 是一种有价值的访问控制模型,可增强安全性、简化访问管理并提高效率。它在管理资源访问对安全和运营至关重要的复杂环境中尤其有益。 我们将做什么 我们有一个包含公共路由和受限路由的 Web API。受限路由需要数据库中用户的有效 JWT。 现在用户…...
MySQL追梦旅途之慢查询分析建议
一、找到慢查询 查询是否开启慢查询记录 show variables like "%slow%";log_slow_admin_statements: 决定是否将慢管理语句(如 ALTER TABLE 等)记录到慢查询日志中。 log_slow_extra : MySQL 和 MariaDB 中的一个系…...
电子应用设计方案-60:智能床垫系统方案设计
智能床垫系统方案设计 一、引言 智能床垫作为智能家居的一部分,旨在为用户提供更舒适的睡眠体验和健康监测功能。本方案将详细描述智能床垫系统的设计理念、功能模块及技术实现。 二、系统概述 1. 系统目标 - 实时监测睡眠状态,包括心率、呼吸、体动等…...
聊聊航空航天软件中常用的SIFT(Software-Implemented Fault Tolerance)三版本方案
一、SIFT技术 在软件程序控制流程中,特别是在SIFT(Software-Implemented Fault Tolerance)系统中使用三版本编程(Three-Version Programming, 3VP)意味着为同一个任务创建三个独立的软件版本。每个版本由不同的开发团…...
智能座舱进阶-应用框架层-Jetpack主要组件
Jetpack的分类 1. DataBinding:以声明方式将可观察数据绑定到界面元素,通常和ViewModel配合使用。 2. Lifecycle:用于管理Activity和Fragment的生命周期,可帮助开发者生成更易于维护的轻量级代码。 3. LiveData: 在底层数据库更…...
2024年底-Sre面试回顾
前言 背景: 2024.11月底 公司不大行了, 裁员收缩, 12月初开始面试, 2周大概面试了十几家公司, 3个2面要去线下, 有1个还不错的offer, 想结束战斗但还没到时候 个人情况: base上海 5年经验(2年实施3年运维半年开发) 面试岗位: Sre、云原生运维、驻场运维、高级运维、实施交付 …...
vue2使用render,js中写html
1、js部分table.js export default {name: "dadeT",data() {return {dades: 6666};},render(h) {return h(div, [h(span, 组件数据:${this.dades}), // 利用data里的dades数据,展示在页面上h(span, 89855545)]);} };2、vue部分 <templat…...
L2tp环境搭建笔记- Openwrt平台
L2tp环境搭建笔记- Openwrt平台 安装L2tp服务配置L2tp serverL2TP客户端配置(使用配置文件)L2TP客户端配置(LUCI)客户端 拔号(命令行方式)defaultroute路由问题L2TP(Layer 2 Tunneling Protocol)是一种工作在二层的隧道协议,是一种虚拟专用网络(VPN)协议。L2TP通常基…...
解决Nginx + Vue.js (ruoyi-vue) 单页应用(SPA) 404问题的指南
问题描述 在使用Vue.js构建的单页应用(SPA)中,特别是像ruoyi-vue这样的框架,如果启用了HTML5历史记录模式进行路由管理,那么用户直接访问子路径或刷新页面时可能会遇到404错误。这是因为当用户尝试访问一个非根路径时…...
Leetcode打卡:找到稳定山的下标
执行结果:通过 题目: 3258 找到稳定山的下标 有 n 座山排成一列,每座山都有一个高度。给你一个整数数组 height ,其中 height[i] 表示第 i 座山的高度,再给你一个整数 threshold 。 对于下标不为 0 的一座山…...
51c嵌入式~单片机~合集3
我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、STM32代码远程升级之IAP编程 IAP是什么 有时项目上需要远程升级单片机程序,此时需要接触到IAP编程。 IAP即为In Application Programming,解释为在应用中编程,用户自己的…...
基于vue3实现小程序手机号一键登录
在Vue 3中实现小程序手机号一键登录,你需要结合小程序的API和Vue 3的框架特性。以下是一个基本的实现步骤和示例代码: 步骤 创建Vue 3项目:如果你还没有Vue 3项目,你需要先创建一个。这可以通过Vue CLI或者其他方式来完成。 集成…...
车辆重识别代码笔记12.19
1、resnet_ibn_a和resnet网络的区别 ResNet-IBN-A 是在 ResNet 基础上进行了一些改进的变种,具体来说,它引入了 Instance Batch Normalization (IBN) 的概念,这在某些任务中(如图像识别、迁移学习等)有显著的性能提升。…...
c语言---预处理
预处理的概念 预处理是C语言编译过程的第一个阶段。在这个阶段,预处理器会根据预处理指令对源程序进行处理,这些指令以#开头,比如#include、#define等。预处理的主要目的是对源程序进行文本替换和文件包含等操作,为后续的编译步骤…...
Spring Cloud Sleuth 分布式链路追踪入门
您好,我是今夜写代码,今天学习下分布式链路组件Spring Cloud Sleuth。 本文内容 介绍了分布式链路的思想 Sleuth 和 Zipkin 简单集成Demo,并不涉及 Sleuth原理。 为什么要用链路追踪? 微服务架构下,一个复杂的电商应用,完成下…...
无人机航测系统技术特点!
一、无人机航测系统的设计逻辑 无人机航测系统的设计逻辑主要围绕实现高效、准确、安全的航空摄影测量展开。其设计目标是通过无人机搭载相机和传感器,利用先进的飞行控制系统和数据处理技术,实现对地表信息的全方位、高精度获取。 需求分析࿱…...
uniapp使用腾讯地图接口的时候提示此key每秒请求量已达到上限或者提示此key每日调用量已达到上限问题解决
要在创建的key上添加配额 点击配额之后进入分配页面,分配完之后刷新uniapp就可以调用成功了。...
【Prompt Engineering】3.文本概括
一、引言 文本信息量大,LLM在文本概括任务上展现出强大能力。本章介绍如何通过编程方式调用API接口实现文本概括功能。 首先,我们需要引入 zhipuAI 包,加载 API 密钥,定义 getCompletion 函数。 from zhipuai import ZhipuAIke…...
5G 模组 初始化状态检测
5G 模组 上电检测 5G 模组 上电检测 #终端上电后,待模组正常启动,再进入 控制台。 #vim /etc/profile##新增 until [ -c /dev/ttyUSB1 ] doecho -e "Wait module[5G] up ... "sleep 5 done ##新增The End....
常用的前端框架介绍
在前端开发中,有几个常用的框架技术,它们各自具有独特的特点和优势。 1. React: • 组件化开发:React 鼓励将 UI 拆分成可复用的组件,每个组件负责渲染 UI 的一部分。 • 虚拟 DOM:React 使用虚拟 DOM 来提…...
python飞机大战游戏.py
python飞机大战游戏.py import pygame import random# 游戏窗口大小 WINDOW_WIDTH 600 WINDOW_HEIGHT 800# 颜色定义 BLACK (0, 0, 0) WHITE (255, 255, 255)# 初始化Pygame pygame.init()# 创建游戏窗口 window pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))…...
PPO: 一种通过近端策略优化提高模型性能的方法
PPO: 一种通过近端策略优化提高模型性能的方法 PPO(Proximal Policy Optimization)是一种强化学习中的策略优化算法,主要用于训练智能体以改善在环境中表现的能力。PPO通过以下几个关键点来提高模型性能: 近端优化:PP…...
Docker创建一个mongodb实例,并用springboot连接 mongodb进行读写文件
一、通过Docker 进行运行一个 mongodb实例 1、拉取镜像 docker pull mongo:5.0.5 2、创建 mongodb容器实例 docker run -d --name mongodb2 \-e MONGO_INITDB_ROOT_USERNAMEsalaryMongo \-e MONGO_INITDB_ROOT_PASSWORD123456 \-p 27017:27017 \mongo:5.0.5 3、进入容器&am…...