【Qt学习】02:信号和槽机制

2023-11-02

信号和槽机制


信号槽机制是 Qt 框架引以为豪的机制之一。

所谓信号槽实际就是观察者模式,将要处理的信号自己的一个函数/槽slot绑定来处理信号,当某个事件发生之后检测对象就会发出信号(无目的的广播),如果有其他对象对这个信号感兴趣就会使用connect函数进行连接。

即当信号发出时,被连接的槽函数会自动被回调。类似观察者模式:当发生了感兴趣的事件,某个操作就会被自动触发。

一、系统自带信号与槽

信号槽的优点:松散耦合,信号发送方和接收方本身是没有关联的,通过connect连接将两端耦合在一起

QPushButton * quitBtn = new QPushButton("quit",this);//创建关闭按钮
connect(quitBtn, &QPushButton::clicked, this, &QWidget::close);//信号槽使用方式

函数connect(sender, signal, receiver, slot);参数解释:

  • sender:发出信号的对象
  • signal:发送对象发出的信号
  • receiver:接收信号的对象
  • slot:接收对象在接收到信号之后所需要调用的函数(槽函数)

利用帮助文档了查找系统自带的信号和槽,在帮助文档中如按钮的点击信号输入QPushButton,首先我们可以在Contents中寻找关键字 signals信号的意思,但是我们发现并没有找到,这时候我们应该想到也许这个信号的被父类继承下来的,因此我们去他的父类QAbstractButton中就可以找到该关键字,点击signals索引到系统自带的信号有如下几个。

这里的clicked就是我们要找到,槽函数的寻找方式和信号一样,只不过他的关键字是slot。

二、自定义信号与槽

使用connect可使用系统提供的信号和槽,

但Qt的信号槽机制并不仅仅是使用系统提供那部分,其还允许开发者设计自己的信号和槽,

1.基本使用

student.cpp
#ifndef STUDENT_H
#define STUDENT_H

#include <QObject>

class Student : public QObject {
    Q_OBJECT
public:
    explicit Student(QObject *parent = nullptr);
signals:

public slots:
    //槽函数slot 返回值是void 需要声明需要实现 可以有参数(发生重载)
    void treat();
};

#endif // STUDENT_H
#include "student.h"
#include <QDebug>

Student::Student(QObject *parent) : QObject(parent) { }

void Student::treat() {
    qDebug() << "debug: receive signal. student treats teacher.";
}
teacher.cpp
#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>

class Teacher : public QObject {
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = nullptr);
signals:
    //信号signal 返回值是void 只需要声明不需要实现 可以有参数(发生重载)
    void hungry();
public slots:

};

#endif // TEACHER_H
#include "teacher.h"

Teacher::Teacher(QObject *parent) : QObject(parent) { }
widget.cpp
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "teacher.h"
#include "student.h"

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget {
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void classIsOver();
private:
    Ui::Widget *ui;
    Teacher *tch;
    Student *stu;
};

#endif // WIDGET_H
#include <QPushButton>
#include <QDebug>
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
    ui->setupUi(this);
    //1.第一次绑定 使用系统自带信号与槽函数
    QPushButton *mybtn = new QPushButton("myBtn", this);
    mybtn->resize(100, 30);
    connect(mybtn, &QPushButton::clicked, this, &Widget::classIsOver);//按钮触发classIsOver函数
    //2.第二次绑定 使用自定义信号与槽函数
    tch = new Teacher(this);//初始化老师对象
    stu = new Student(this);//初始化学生对象
    connect(tch, &Teacher::hungry, stu, &Student::treat);//老师饿了时学生主动请客的connect连接
}

Widget::~Widget() {
    delete ui;
}

void Widget::classIsOver() {
    qDebug() << "debug: btn is pushed and Widget::classIsOver was called. emitting signal...";
    emit tch->hungry();//函数被调用 则触发发送老师饿了的信号
}
main.cpp
#include <QApplication>
#include "widget.h"

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

在这里插入图片描述

2.信号与槽重载

student.cpp
#ifndef STUDENT_H
#define STUDENT_H

#include <QObject>

class Student : public QObject {
    Q_OBJECT
public:
    explicit Student(QObject *parent = nullptr);
signals:

public slots:
    //槽函数slot 返回值是void 需要声明需要实现 可以有参数(发生重载)
    void treat();
    void treat(QString food);
};

#endif // STUDENT_H
#include "student.h"
#include <QDebug>

Student::Student(QObject *parent) : QObject(parent) { }

void Student::treat() {
    qDebug() << "debug: receive signal. student treats teacher.";
}

void Student::treat(QString food) {
    qDebug() << "debug: receive signal. student treats teacher with " << food.toUtf8().data();
}
teacher.cpp
#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>

class Teacher : public QObject {
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = nullptr);
signals:
    //信号signal 返回值是void 只需要声明不需要实现 可以有参数(发生重载)
    void hungry();
    void hungry(QString food);
public slots:

};

#endif // TEACHER_H
#include "teacher.h"

Teacher::Teacher(QObject *parent) : QObject(parent) { }
widget.cpp
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "teacher.h"
#include "student.h"

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget {
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void classIsOver1();
    void classIsOver2();
private:
    Ui::Widget *ui;
    Teacher *tch;
    Student *stu;
};

#endif // WIDGET_H
#include <QPushButton>
#include <QDebug>
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
    ui->setupUi(this);
    //1.第一次绑定 使用系统自带信号与槽函数
    QPushButton *mybtn1 = new QPushButton("myBtn1", this);
    mybtn1->resize(100, 30);
    connect(mybtn1, &QPushButton::clicked, this, &Widget::classIsOver1);//按钮触发classIsOver函数
    QPushButton *mybtn2 = new QPushButton("myBtn2", this);
    mybtn2->move(100, 0);
    mybtn2->resize(100, 30);
    connect(mybtn2, &QPushButton::clicked, this, &Widget::classIsOver2);//按钮触发classIsOver函数

    tch = new Teacher(this);//初始化老师对象
    stu = new Student(this);//初始化学生对象
    //2.第二次绑定 使用自定义信号与槽函数
    void(Teacher::*tchsignal_)() = &Teacher::hungry;
    void(Student::*stusignal_)() = &Student::treat;
    connect(tch, tchsignal_, stu, stusignal_);//老师饿了时学生主动请客的connect连接
    //3.第三次绑定 使用自定义信号与槽函数
    //定义函数指针 用于识别重载的函数地址
    void(Teacher::*tchsignal)(QString) = &Teacher::hungry;
    void(Student::*stusignal)(QString) = &Student::treat;
    connect(tch, tchsignal, stu, stusignal);
}

Widget::~Widget() {
    delete ui;
}

void Widget::classIsOver1() {
    qDebug() << "debug: btn1 is pushed and Widget::classIsOver1 was called. emitting signal...";
    emit tch->hungry();//函数被调用 则触发发送老师饿了的信号
}

void Widget::classIsOver2() {
    qDebug() << "debug: btn2 is pushed and Widget::classIsOver2 was called. emitting signal...";
    emit tch->hungry("apple pie");
}
main.cpp
#include <QApplication>
#include "widget.h"

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

在这里插入图片描述

3.信号连接信号

之前的使用中都是利用槽函数实现的,点击btn按钮触发函数调用,函数调用后emit发出信号再触发slot槽函数,从而实现连续的效果。

也可以使用另一种方式信号触发信号完成,利用点击btn按钮的信号去触发另一个信号,

主要对widget.cpp中的内容进行修改,修改后如下:

#include <QPushButton>
#include <QDebug>
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
    ui->setupUi(this);
    //1.第一次绑定 使用系统自带信号与槽函数
    QPushButton *mybtn1 = new QPushButton("myBtn1", this);
    mybtn1->resize(100, 30);
    //connect(mybtn1, &QPushButton::clicked, this, &Widget::classIsOver1);//按钮触发classIsOver函数

    QPushButton *mybtn2 = new QPushButton("myBtn2", this);
    mybtn2->move(100, 0);
    mybtn2->resize(100, 30);
    //connect(mybtn2, &QPushButton::clicked, this, &Widget::classIsOver2);//按钮触发classIsOver函数

    tch = new Teacher(this);//初始化老师对象
    stu = new Student(this);//初始化学生对象
    //2.第二次绑定 使用自定义信号与槽函数
    void(Teacher::*tchsignal_)() = &Teacher::hungry;
    void(Student::*stusignal_)() = &Student::treat;
    connect(tch, tchsignal_, stu, stusignal_);//老师饿了时学生主动请客的connect连接
    connect(mybtn1, &QPushButton::clicked, tch, tchsignal_);//信号连接信号

    //3.第三次绑定 使用自定义信号与槽函数
    //定义函数指针 用于识别重载的函数地址
    void(Teacher::*tchsignal)(QString) = &Teacher::hungry;
    void(Student::*stusignal)(QString) = &Student::treat;
    connect(tch, tchsignal, stu, stusignal);
    //connect(mybtn2, &QPushButton::clicked, tch, tchsignal);//信号连接信号
    connect(mybtn2, &QPushButton::clicked, this, [=](){
        emit tch->hungry("apple pie");
    });
}

Widget::~Widget() {
    delete ui;
}

void Widget::classIsOver1() {
    qDebug() << "debug: btn1 is pushed and Widget::classIsOver1 was called. emitting signal...";
    emit tch->hungry();//函数被调用 则触发发送老师饿了的信号
}

void Widget::classIsOver2() {
    qDebug() << "debug: btn2 is pushed and Widget::classIsOver2 was called. emitting signal...";
    emit tch->hungry("apple pie");
}

在这里插入图片描述

btn触发信号连接信号,跳过了classIsOver函数的中间调用过程,直接实现了最终结果的输出。

4.Lambda表达式

C++11中的Lambda表达式用于定义并创建匿名的函数对象以简化编程工作,Lambda表达式的基本构成:

[capture](parameters)mutable->returnType {
	statement
}
  1. 函数对象参数;[],标识一个Lambda的开始,这部分必须存在不能省略。函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。函数对象参数只能使用那些到定义Lambda为止时Lambda所在作用范围内可见的局部变量(包括Lambda所在类的this)。函数对象参数有以下形式:

    • void,没有使用任何函数对象参数。
    • =,函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)
    • &,函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)
    • this,函数体内可以使用Lambda所在类中的成员变量
    • a,将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的。要修改传递进来的a的拷贝,可以添加mutable修饰符
    • &a,将a按引用进行传递
    • a, &b,将a按值进行传递,b按引用进行传递。
    • =,&a, &b,除a和b按引用进行传递外,其他参数都按值进行传递。
    • &, a, b,除a和b按值进行传递外,其他参数都按引用进行传递。
  2. 操作符重载函数参数;标识重载的 () 操作符的参数,没有参数时这部分可以省略。参数可以通过按值(如:(a,b))和按引用(如:(&a,&b))两种方式进行传递

  3. 可修改标示符;mutable 声明,这部分可以省略。按值传递函数对象参数时,加上mutable修饰符后,可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)

    QPushButton * myBtn = new QPushButton (this);
    QPushButton * myBtn2 = new QPushButton (this);
    myBtn2->move(100,100);
    int m = 10;
    
    connect(myBtn,&QPushButton::clicked,this,[m] ()mutable { m = 100 + 10; qDebug() << m; });
    connect(myBtn2,&QPushButton::clicked,this,[=] ()  { qDebug() << m; });
    qDebug() << m;
    
  4. 函数返回值;-> 返回值类型,标识函数返回值的类型,当返回值为void,或者函数体中只有一处return的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略。

  5. 是函数体;{},标识函数的实现这部分不能省略,但函数体可以为空。

利用Lambda表达式简化信号与槽的使用机制:利用lambda表达式实现点击按钮,关闭窗口:

QPushButton *btn = new QPushButton;
btn->setText("quit");
connect(btn, &QPushButton::clicked, this, [=](){
    this->close();
});

5.信号与槽总结

在这里插入图片描述

自定义信号槽需要注意的事项:

  1. 发送者和接收者都需要是QObject的子类(槽函数是全局函数、Lambda 表达式等无需接收者的时候除外);
  2. 自定义信号signal返回值是 void,只需要声明不需要实现,可以有参数(发生重载)
  3. 槽函数是普通的成员函数,需要声明也需要实现,会受到 public、private、protected 的影响(早期必须写到public slots作用域下)
  4. 任何成员函数、static 函数、全局函数和 Lambda 表达式都可以作为槽函数

信号与槽的连接:connect函数

  1. 一个信号可以和多个槽函数相连:如果是这种情况,这些槽会一个接一个的被调用,但是它们的调用顺序是不确定的
  2. 多个信号可以连接到一个槽:只要任意一个信号发出,这个槽就会被调用
  3. 一个信号可以连接到另外的一个信号:当第一个信号发出时第二个信号被发出,除此之外这种信号-信号的形式和信号-槽的形式没有什么区别。
  4. 信号槽要求信号和槽的参数类型对应(参数的个数信号可以多于槽函数,反之报错)
  5. 若信号和槽的参数不一致,允许的情况是,槽函数的参数可以比信号的少,即便如此,槽函数存在的那些参数的顺序也必须和信号的前面几个一致起来。这是因为可以在槽函数中选择忽略信号传来的数据(也就是槽函数的参数比信号的少)。
  6. 槽可以被取消链接:这种情况并不经常出现,因为当一个对象delete之后,Qt自动取消所有连接到这个对象上面的槽
  7. 使用Lambda 表达式:在使用 Qt 5 的时候,能够支持 Qt 5 的编译器都是支持 Lambda 表达式的,在连接信号和槽的时候,槽函数可以使用Lambda表达式的方式进行处理。

QT4版本的信号槽写法:Qt5在语法上完全兼容Qt4。

connect(tch, SIGNAL(hungry(QString)), stu, SLOT(treat(QString)));

这里使用了SIGNAL和SLOT这两个宏,将两个函数名转换成了字符串。注意到connect函数的signal和slot都是接受字符串,一旦出现连接不成功的情况,Qt4是没有编译错误的(因为一切都是字符串编译期是不检查字符串是否匹配),而是在运行时给出错误。这无疑会增加程序的不稳定性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Qt学习】02:信号和槽机制 的相关文章

  • 从 Qt 更改屏幕分辨率?

    我想更改屏幕分辨率 然后使用一个 ActiveX 控件 Flash 播放器 进入全屏 显然 仅适用于 Windows 的解决方案就可以了 有 Qt api 吗 还是我需要深入研究 winapi 如果是这样 我该在哪里查找 关键字 谢谢您的帮
  • QMessageBox::about 可以根据标题长度调整大小吗?

    我想创建一个简单的 关于 对话框 但注意到QMessageBox about不会根据标题的长度调整其大小 由于字体较大 标题通常会更长 至少在我的桌面环境中 仅根据内容调整其大小 有没有办法确保对话框足够大以显示所有标题 我当然可以向 ab
  • Android 版 Qt 和 BoringSSL

    我正在开发一个基于 Qt 的 Android 应用程序 它使用 QSslSocket 下载数据 由于 Android 从 OpenSSL 转向 BoringSSL 因为依赖 OpenSSL 库的 Marshmallow Qt 程序在 And
  • QFileDialog 作为 TableView 的编辑器:如何获取结果?

    我正在使用一个QFileDialog作为某些专栏的编辑QTableView 这基本上有效 对一些焦点问题取模 请参阅here https stackoverflow com questions 22854242 qfiledialog as
  • C++ QT libXL 错误:“启动期间程序退出,代码为 0xc0000135”

    我正在尝试编写一个使用 libXL 的 QT 应用程序 但是当我尝试编译时 我收到一个弹出框 显示 During Startup program exited with code 0xc0000135 我已经准确地找出了哪一行导致了问题 它
  • 如何使用bind将成员函数作为函数指针传递?

    我试图将成员函数作为函数指针传递 这样我就不需要依赖单例或全局函数来处理 Qt 5 中的 Qt 消息 据我所知 我的 std function 是正确的类型 它具有正确的签名 并且绑定应该允许我插入隐式this指针 本质上是将成员函数传递为
  • 如何从键盘为 QTableWidget 创建信号?

    我有一张桌子 可以通过左 右 上 下按钮在里面移动 现在 当我停留在某个单元格并按空格键时 我需要创建一个信号 该信号还应该带来该单元格的坐标 我尝试使用 QTableWidget 的标准信号 但它不起作用 我该如何解决这个问题 创建一个单
  • Qt 码头调整大小事件

    有没有办法在 Qt 中捕捉码头的调整大小事件 我需要能够检测到扩展坞何时调整大小 而不仅仅是其位置或 功能 发生变化时 看起来 QDockWidget 没有 调整大小 信号 如果您不希望子类化以仅获得调整大小事件控件 您可以安装事件过滤器
  • 在 Windows 上静默安装 Qt55 Enterprise

    编辑 在 Qt 支持的帮助下 我已经解决了如何自动化 Qt 企业安装程序的这两个部分 下面是脚本调用 我正在尝试在 Windows 8 1 和 Windows 10 上静默安装 Qt 5 5 1 Enterprise 使用 script 开
  • PyQt:使用 alpha 通道创建 QPixmap,而不是预乘颜色通道

    我想创建一个 QPixmap 来使用 QPainter 进行绘制 QPixmap 应支持透明度 而不使用预乘颜色通道 目前 我通过创建具有所需尺寸的 QPixmap 并用每个通道 包括 alpha 设置为零的 QColor 填充它来实现此目
  • QGraphicsView 在完整布局中未最大化

    I have following GUI having four QGraphicView objects 正如您在每个视图下看到的那样 它有四个工具按钮 为了最大化视图 我连接了工具按钮的信号来隐藏其他三个视图的插槽 并将大小策略设置为扩
  • 在 Qt 中构建 Android 项目不再有效

    所以我对 Android SDK NDK 和 Apache Ant 进行了一些更新 现在我无法构建任何 Android 项目 我收到一条警告 然后它说找不到 build xml 文件 错误 Warning Android platform
  • PyQt QFileDialog exec_ 很慢

    我正在使用自定义QFileDialog因为我想选择多个目录 但是exec 功能非常慢 我不明白为什么 我正在使用最新版本的 PyQt 代码片段 from PyQt4 import QtGui QtCore QtNetwork uic cla
  • 在未安装 Qt VS Tools 的情况下以 Qt/MsBuild 格式编译 Qt 项目

    我在 Visual Studio 中有很多 Qt 项目 使用新的 Qt MsBuild 格式 https blog qt io blog 2018 02 16 qt visual studio improving performance 由
  • 如何在 PySide/PyQt 中制作一个位于屏幕中央的小部件?

    这段代码有效 但我想知道是否有更简单的方法 def center self qr self frameGeometry cp gui QDesktopWidget availableGeometry center qr moveCenter
  • 关于在 Qt 中使用未记录的类

    使用无证文件是否安全QObjectUserData类和QObject setUserData in Qt 相反 你可以看看使用QObject setProperty http doc qt io qt 5 qobject html setP
  • C++:头文件中全局函数的多重定义错误

    该函数是全局的 在头文件中定义 暂时地我想把它留在那里 头文件还构成一个具有内联函数的特定类 其中一个函数调用this全局函数 源文件不包含任何有问题的全局函数 有关错误原因的任何提示吗 如果有人感兴趣的话我可以发布代码 mainwindo
  • QGraphicsScene没有删除QWidget的功能

    QGraphicsScene 有一个addWidget QWidget 有函数 但是没有对应的removeWidget QWidget 它只有removeItem QGraphicsItem 如何删除 QWidget 这是一个基本示例 看看
  • 如何在Qt无框窗口中实现QSizeGrip?

    如何使用 Qt 无框窗口实现 QSizeGrip 代码会是什么样的 您只需在布局内窗口的一角添加 QSizeGrip 即可使其保持在该角落 QDialog dialog new QDialog 0 Qt FramelessWindowHin
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo

随机推荐

  • bat获取所有的参数

    bat默认只能获取到1 9个参数 分别用 1 2 9引用 如果传给bat的参数大于9个 就必须用shift 工作需要 要写个bat脚本 获取所有的参数 再将所有的参数传给Java 代码如下 allparam就是获取到的所有参数字符串 ech
  • Window 窗口属性及嵌入窗口到D3D渲染窗口顶层

    Window窗口有很多属性 可以通过设定window的style和ex style中知道 这些属性有时候在实现某些效果的时候 是非常非常重要 以前都没有怎么详细了解 只是在用到对应的API时看一下 根本没有详细深入 这里想记录一下最近工作上
  • Python 创建Windows窗口(GUI)

    创建Windows窗口 GUI py 基本的四要素 import tkinter 导入tkinter模块 root tkinter Tk 创建Window窗口对象 root title 我的第一个GUI程序 窗口标题 root mainlo
  • 屏幕截图的实现和源代码

    最近打算写一些入门相关的小应用程序开发实例 个人感觉学习程序开发 其关键的一步就是阅读源代码 RTFSC 呵呵 然后尝试自己动手编写 这里所谓的自己动手编写并不是让你照着源代码一句话一句的敲 也不是复制粘贴 而是阅读了源代码以后 学习其中的
  • 使用vscode 连接服务器 进行深度学习代码调试

    博主本来在Win上已经配好环境了 但是在跑代码的过程中 因为tensor拼接得太大了 导致笔记本内存不足 因此需要到服务器上跑 为什么选择vscode 如果直接用xshell连接服务器 在命令行运行py文件 不是很直观 也不能debug 还
  • Linux HugePage

    1 闲聊 有一段时间 数据库上出现过CPU消耗非常高的问题 最后分析到了Linux HugePage 发现自己对这一块都没什么了解 于是做了 些了解 Linux 下的大页分为两种类型 标准大页 Huge Pages 和透明大页 Transp
  • ZK实现SASL认证+Kafka连接ZK

    ZK实现SASL认证 Kafka连接ZK 关键词 zk sasl kfaka 未授权认证 参考文档 搭建Kafka集群时 对ZooKeeper认证与权限控制 http ohmycat me 2019 05 08 kafka with zoo
  • VUE element-ui之table表格中嵌套输入框,且输入框失焦自动勾选当前行

    步骤 表格中直接插槽法
  • linux tasklet 的分析与使用

    linux tasklet 的分析与使用 目录 linux tasklet 的分析与使用 tasklet 源码分析 tasklet shedule 调度的分析 tasklet 执行 tasklet 使用简单示例 结论 tasklet 是利用
  • HTTP协议深度剖析及其在各个阶段的作用

    作者 禅与计算机程序设计艺术 1 简介 HTTP HyperText Transfer Protocol 即超文本传输协议 是互联网中使用的基于TCP IP通信协议 HTTP是一个属于应用层的协议 由于其简洁 灵活 易用 快速的方式 越来越
  • three.js简介 —— 3D框架

    随着HTML5的普及 网页的表现能力越来越强大 浏览器提供了WebGL接口 可以通过调用对应API进行3D图形的绘制 Three js在这些基础接口之上又做了一层封装 原文链接 特点 Three js特点 掩盖了3D渲染细节 面向对象 功能
  • 大数据之数据仓库与信息采集平台实战

    一 Kylin前置概念 1 Kylin术语 1 Data Warehouse 数据仓库 数据仓库是一个各种数据 包括历史数据和当前数据 的中心存储系统 是BI business intelligence 商业智能 的核心部件 这里所谈的数据
  • Fegin的GET请求传对象

    学习笔记 Fegin的GET请求如何传递对象 近期做项目发现使用Fegin的GET请求时 如果使用了对象进行传输 会被当做POST请求处理 解决方法如下 1 接口使用 ModelAttribute注解 GetMapping getTest
  • Rose 画序列图

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家拍砖 一 1 序列图的定义 在 UML 的表示中 序列图将交互关系表示为一个二维图 其中 纵向是时间轴 时间沿竖线向下延伸 横向代表了在协作中各
  • 在这里,读懂中国人工智能发展史

    2022年末 由OpenAI开发的大数据模型ChatGPT横空出世 激发了社会各界对于人工智能的极大兴趣 支持者有之 反对者亦不乏 我国的百度 华为 阿里巴巴等科技企业都已向人工智能领域投入了大量资源 并已取得初步成果 由于人工智能的新发展
  • 设置路由器显示检查代理服务器连接失败,路由器设置成功了可检测认证连接失败是为什?...

    希望我的回答对你有用 拨号的时候有没有出现错误代码 提示错误的代码是什么 ADSL拨号错误代码详解 错误 602 The port is already open 问题 拨号网络网络由于设备安装错误或正在使用 不能进行连接 原因 RasPP
  • openCV上图片显示中文c++

    准备材料 1 中文汉字库 2 中文显示扩展类 cvxFont h ifndef OPENCVUNICODE CVXFONT H define OPENCVUNICODE CVXFONT H include
  • FPN(Feature Pyramid Networks) 网络

    FPN 网络 1 前言 通常在神经网络中 浅层特征图 feature maps 的感受野比较小 包含语义信息比较少 但是其空间位置信息准确 而深层网络 感受野大 语义信息强 但是由于 pooling 等造成了像素位置信息丢失等 所以空间位置
  • Python - 字节byte数组与int之间的转换

    将byte数组转int 方式一 b b x00 x00 x03 xE8 或使用 0x0 0x0 0x3 0xE8 亦可 需将列表转为字节b bytes b i1 struct unpack gt i b 0 print i1 1000 方式
  • 【Qt学习】02:信号和槽机制

    信号和槽机制 OVERVIEW 信号和槽机制 一 系统自带信号与槽 二 自定义信号与槽 1 基本使用 student cpp teacher cpp widget cpp main cpp 2 信号与槽重载 student cpp teac