【Qt无门槛入门】信号以及信号机制及其常用控件(1)

信号与信号槽

信号源:由哪个控件发出的信号。
信号的类型:用户进行不同的操作,就可能出发不同的信号。
信号处理的方式:槽(slot)某个对象接收到这个信号之后,就会做一些相关的处理动作。但是Qt对象不会无故收到某个信号,要想让一个对象收到另一个对象发出的信号,这时候需要建立连接(connect)

QPushButton * quitBtn = new QPushButton("关闭窗口",this);
  connect(quitBtn,&QPushButton::clicked,this,&MyWidget::close);

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

自定义信号和槽

Qt框架默认提供的标准信号和槽不足以完成我们日常应用开发的需求,比如说点击某个按钮让另一个按钮的文字改变,这时候标准信号和槽就没有提供这样的函数。但是Qt信号和槽机制提供了允许我们自己设计自己的信号和槽。
第一种自定义槽函数的方法:

public slots

此处的slots是Qt自己扩展的关键字,Qt里广泛使用了元编程技术(基于代码,生成代码)qmake构建Qt项目的时候,就会调用专门的扫描器,扫描代码中特定的关键字。
第二种自定义槽函数的方法
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在Qt中,除了通过connect来连接信号槽之外,还可以通过函数名字的方式来自动连接

1.所谓Qt信号,本质上也是一个函数,但是信号则是一类非常特殊的函数,程序员只要写出函数声明,并且告诉Qt这是一个信号即可。这个函数定义,是Qt在编译过程中自动生成的。
2.作为信号函数,这个函数的返回值,必须是void.有没有参数都可以甚至可以支持重载。

signals:

这个也是Qt自己拓展出来的关键字,qmake的时候,调用一些代码的分析,扫描到类中包含signals这个关键字的时候,就会自动把下面的函数声明认为是信号,并且给这些函数自动的生成函数定义。
信号和槽也可以带参数。
当信号带有参数的时候,槽的参数必须和信号的参数一致,此时发射信号的时候,就可以给信号函数传递实参,与之对应的这个参数就会被传递到槽函数中。
在这里插入图片描述

在这里插入图片描述
传参可以起到复用代码的效果,有多个逻辑,逻辑上整体一致,但是涉及到的数据不同。就可以通过函数-参数来复用代码,并且在不同的场景中传入不同的参数即可。
信号函数的参数个数,超过了槽函数的参数个数,此时都是可以正常使用的。信号函数的参数个数,少于槽函数的参数个数时,代码无法编译通过。
直观的思考,应该是要求信号的参数个数和槽的参数个数,严格一致。一个槽函数,有可能会绑定多个信号。如果我要求参数一致,就意味着信号绑定到槽的要求变高了,换言之,当下的规则就允许信号和槽之间的绑定更灵活了。
在这里插入图片描述
在这里插入图片描述

关于信号槽两个补充

1.使用disconnect来断开信号槽的连接,disconnect使用的方式和connect是非常类似的。disconnect用的比较少,通常是把信号和槽连接上了之后就不必管了。
2.定义槽函数时也可以使用lambda表达式。
在这里插入图片描述
lambda表达式是一个回调函数,这个函数无法直接获取上层作用域的变量,为了解决上述问题,引入了变量捕获语法,获取到外层作用域中的变量。
在这里插入图片描述
如果我们对应的槽函数比较简单,而且是一次性使用的,就经常会写这种lambda表达式。

Qt控件

控件概述

Widget 是 Qt 中的核⼼概念. 英⽂原义是 “⼩部件”, 我们此处也把它翻译为 “控件” .
控件是构成⼀个图形化界⾯的基本要素.
在这里插入图片描述
Qt 作为⼀个成熟的 GUI 开发框架, 内置了⼤量的常⽤控件. 这⼀点在 Qt Designer 中就可以看到端倪.并且 Qt 也提供了 “⾃定义控件” 的能⼒, 可以让程序猿在现有控件能满⾜需求的时候, 对现有控件做出扩展, 或者⼿搓出新的控件.

enabled

API说明
isEnabled()获取到控件的可⽤状态.
setEnabled设置控件是否可使⽤. true 表⽰可⽤, false 表⽰禁⽤.

• 所谓 “禁⽤” 指的是该控件不能接收任何⽤⼾的输⼊事件, 并且外观上往往是灰⾊的.
如果⼀个 widget 被禁⽤, 则该 widget 的⼦元素也被禁⽤.

Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QPushButton* btn = new QPushButton(this);
btn->setText("这是个被禁⽤的按钮");
btn->setEnabled(false);
}

代码⽰例: 通过按钮2 切换按钮1 的禁⽤状态.

  1. 使⽤ Qt Designer 拖两个按钮到 Widget 中
    两个按钮的 objectName 分别为 pushButton 和 pushButton_2
    QObject 的 objectName 属性介绍:
    QObject 是 QWidget 的⽗类. ⾥⾯最主要的属性就是 objectName
    在⼀个 Qt 程序中, objectName 相当于对象的⾝份标识, 彼此之间不能重复.在使⽤ Qt Designer 时, 尤其是界⾯上存在多个 widget 的时候, 可以通过 objectName获取到指定的 widget 对象.
    Qt Designer ⽣成的 ui ⽂件, 本⾝是 xml 格式的. qmake 会把这个 xml ⽂件转换成 C++ 的 .h⽂件(这个⽂件⽣成在 build ⽬录中), 构成⼀个 ui_widget 类.
    每个 widget 的 objectName 最终就会成为 ui_widget 类的属性名字.
    最终这个类的实例, 就是 Ui::Widget *ui , 因此就可以通过形如 ui->pushButton 或者 ui->pushButton_2 这样的代码获取到界⾯上的 widget 对象了.
  2. ⽣成两个按钮的 slot 函数.
    使⽤ isEnabled 获取当前按钮的可⽤状态.
    使⽤ setEnabled 修改按钮的可⽤状态. 此处是直接针对原来的可⽤状态进⾏取反后设置
void Widget::on_pushButton_clicked()
{
qDebug() << "按下按钮";
}
void Widget::on_pushButton_2_clicked()
{
bool flag = this->ui->pushButton->isEnabled();
this->ui->pushButton->setEnabled(!flag);
}
1

运⾏程序, 可以看到, 初始情况下, 上⾯的按钮是可⽤状态.
点击下⽅按钮, 即可使上⽅按钮被禁⽤; 再次点击下⽅按钮, 上⽅按钮就会解除禁⽤.(禁⽤状态的按钮为灰⾊, 且不可点击).
在这里插入图片描述

geometry

位置和尺⼨. 其实是四个属性的统称:
• x 横坐标
• y 纵坐标
• width 宽度
• height ⾼度

API说明
geometry()获取到控件的位置和尺⼨. 返回结果是⼀个 QRect, 包含了 x, y, width, height. 其中 x, y 是左上⻆的坐标.
setGeometry(QRect),setGeometry(int x, int y,int width, int height)设置控件的位置和尺⼨. 可以直接设置⼀个 QRect, 也可以分四个属性单独设置.

代码示例: 控制按钮的位置

  1. 在界⾯中拖五个按钮.
    五个按钮的 objectName 分别为 pushButton_target , pushButton_up ,
    pushButton_down , pushButton_left , pushButton_right
  2. 在 widget.cpp 中编写四个按钮的 slot 函数
void Widget::on_pushButton_up_clicked()
{
QRect rect = ui->pushButton_target->geometry();
rect.setY(rect.y() - 5);
ui->pushButton_target->setGeometry(rect);
}
void Widget::on_pushButton_down_clicked()
{
QRect rect = ui->pushButton_target->geometry();
rect.setY(rect.y() + 5);
ui->pushButton_target->setGeometry(rect);
}
void Widget::on_pushButton_left_clicked()
{
QRect rect = ui->pushButton_target->geometry();
rect.setX(rect.x() - 5);
ui->pushButton_target->setGeometry(rect);
}
void Widget::on_pushButton_right_clicked()
{
QRect rect = ui->pushButton_target->geometry();
rect.setX(rect.x() + 5);
ui->pushButton_target->setGeometry(rect);
}

如果想让整个按钮都移动, 可以改成下列代码:

void Widget::on_pushButton_up_clicked()
{
QRect rect = ui->pushButton_target->geometry();
ui->pushButton_target->setGeometry(rect.x(), rect.y() - 5, rect.width(),
rect.height());
}
void Widget::on_pushButton_down_clicked()
{
QRect rect = ui->pushButton_target->geometry();
ui->pushButton_target->setGeometry(rect.x(), rect.y() + 5, rect.width(),
rect.height());
}
void Widget::on_pushButton_left_clicked()
{
QRect rect = ui->pushButton_target->geometry();
ui->pushButton_target->setGeometry(rect.x() - 5, rect.y(), rect.width(),
rect.height());
}
void Widget::on_pushButton_right_clicked()
{
QRect rect = ui->pushButton_target->geometry();
ui->pushButton_target->setGeometry(rect.x() + 5, rect.y(), rect.width(),
rect.height());
}

代码⽰例: 感受 geometry 和 frameGeometry 的区别.

  1. 在界⾯上放置⼀个按钮.
  2. 在按钮的 slot 函数中, 编写代码
void Widget::on_pushButton_clicked()
{
QRect rect1 = this->geometry();
QRect rect2 = this->frameGeometry();
qDebug() << rect1;
qDebug() << rect2;
}
  1. 在构造函数中, 也添加同样的代码
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QRect rect1 = this->geometry();
QRect rect2 = this->frameGeometry();
qDebug() << rect1;
qDebug() << rect2;
}

在这里插入图片描述

windowTitle

API说明
windowTitle()获取到控件的窗⼝标题.
setWindowTitle(const,QString& title)setWindowTitle(constQString& title)

代码⽰例: 设置窗⼝标题

Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 设置窗⼝标题
this->setWindowTitle("这是标题");
}

windowIcon

API说明
windowIcon()获取到控件的窗⼝图标. 返回 QIcon 对象.
setWindowIcon(const,QIcon& icon)设置控件的窗⼝图标.
  1. 修改 widget.cpp
#include <QIcon>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建图标对象
QIcon icon("d:/rose.jpg");
// 设置图标
this->setWindowIcon(icon);
}

注意: Windows 下路径的分隔符可以使⽤ / 也可以使⽤ \ . 但是如果在 字符串 中使⽤ \ , 需要写作转义字符的形式 \ . 因此我们还是更推荐使⽤ / .
3) 运⾏程序, 可以看到窗⼝图标已经成为上述图⽚
实际开发中, 我们⼀般不会在代码中通过绝对路径引⼊图⽚. 因为我们⽆法保证程序发布后, ⽤⼾的电脑上也有同样的路径.如果使⽤相对路径, 则需要确保代码中的相对路径写法和图⽚实际所在的路径匹配 (⽐如代码中写作 “./image/rose.jpg”, 就需要在当前⼯作⽬录中创建 image ⽬录, 并把 rose.jpg 放进去).
代码⽰例: 获取当前的⼯作⽬录

  1. 在界⾯上创建⼀个⽐较⼤的 label, 确保能把路径显⽰完整. objectName 使⽤默认的 label 即可.
  2. 修改 widget.cpp
    • 使⽤ QDir::currentPath() 即可获取到当前⼯作⽬录
#include <QDir>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 获取到当前⼯作⽬录
QString currentDir = QDir::currentPath();
// 设置⼯作⽬录到 label 中.
ui->label->setText(currentDir);
}
  1. 直接在 Qt Creator 中执⾏程序, 可以看到当前⼯作⽬录是项⽬的构建⽬录.
  2. 进⼊上述构建⽬录, 把⾥⾯的 exe 拷⻉到其他⽬录中, ⽐如 D: 中. 再次执⾏程序, 可以看到当前⼯作⽬录已经发⽣改变.
    注意, 上述 构建⽬录, 是随时可删除的. ⽐如点击菜单栏中的 “构建” -> “清理项⽬” , 就会把这个⽬录中的内容清空掉.
    因此如果我们把图⽚⽂件放到构建⽬录中, 可能在不⼩⼼删除后就丢失了.我们还是希望能够把图⽚和源代码放到⼀起, 并且使我们的程序⽆论拷⻉到任何位置中都能正确使⽤图⽚.
    Qt 使⽤ qrc 机制帮我们⾃动完成了上述⼯作, 更⽅便的来管理项⽬依赖的静态资源.
    qrc
    qrc ⽂件是⼀种XML格式的资源配置⽂件, 它⽤XML记录硬盘上的⽂件和对应的随意指定的资源名称. 应⽤程序通过资源名称来访问这些资源.
    在Qt开发中, 可以通过将资源⽂件添加到项⽬中来⽅便地访问和管理这些资源. 这些资源⽂件可以位于qrc⽂件所在⽬录的同级或其⼦⽬录下.
    在构建程序的过程中, Qt 会把资源⽂件的⼆进制数据转成 cpp 代码, 编译到 exe 中. 从⽽使依赖的资源变得 “路径⽆关”.
  1. 右键项⽬, 创建⼀个 Qt Resource File (qrc ⽂件), ⽂件名随意起(不要带中⽂), 此处叫做resource.qrc .
    在这里插入图片描述2. 在 qrc 编辑器中, 添加前缀
    在这里插入图片描述

  2. 在 资源编辑器 中, 点击 add Files 添加资源⽂件. 此处我们需要添加的是 rose.jpg
    注意: 添加的⽂件必须是在 qrc ⽂件的同级⽬录, 或者同级⽬录的⼦⽬录中. 因此我们需要把之前 D 盘中的 rose.jpg 复制到上述⽬录中.

  1. 在代码中使⽤ rose.jpg
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 访问到 rose.jpg 资源
QIcon icon(":/rose.jpg");
// 设置图标
this->setWindowIcon(icon);
}

注意上述路径的访问规则.
• 使⽤ : 作为开头, 表⽰从 qrc 中读取资源.
• / 是上⾯配置的前缀
• rose.jpg 是资源的名称
需要确保代码中编写的路径和添加到 qrc 中资源的路径匹配. 否则资源⽆法被访问 (同时也不会有报错提⽰).
5) 运⾏程序, 可以看到图标已经能正确设置.
在这里插入图片描述
上述 qrc 这⼀套资源管理⽅案, 优点和缺点都很明显.
优点: 确保了图⽚, 字体, 声⾳等资源能够真正做到 “⽬录⽆关”, ⽆论如何都不会出现资源丢失的情况.
缺点: 不适合管理体积⼤的资源. 如果资源⽐较⼤ (⽐如是⼏个 MB 的⽂件), 或者资源特别多,⽣成的最终的 exe 体积就会⽐较⼤, 程序运⾏消耗的内存也会增⼤, 程序编译的时间也会显著增加.

windowOpacity

API说明
windowOpacity()获取到控件的不透明数值. 返回 float, 取值为 0.0 -> 1.0 其中 0.0 表⽰全透明, 1.0 表⽰完全不透明.
setWindowOpacity(float n)设置控件的不透明数值.
代码⽰例: 调整窗⼝透明度
  1. 在界⾯上拖放两个按钮, 分别⽤来增加不透明度和减少不透明度.
    objectName 分别为 pushButton_add 和 pushButton_sub
  2. 编写 wdiget.cpp, 编写两个按钮的 slot 函数
    • 点击 pushButton_sub 会减少不透明度, 也就是窗⼝越来越透明.
    • 点击 pushButton_add 会增加不透明度, 窗⼝会逐渐恢复.
void Widget::on_pushButton_add_clicked()
{
float opacity = this->windowOpacity();
if (opacity >= 1.0) {
return;
}
qDebug() << opacity;
opacity += 0.1;
this->setWindowOpacity(opacity);
}
void Widget::on_pushButton_sub_clicked()
{
float opacity = this->windowOpacity();
if (opacity <= 0.0) {
return;
}
qDebug() << opacity;
opacity -= 0.1;
this->setWindowOpacity(opacity);
}
  1. 执⾏程序, 可以看到, 点击了⼏下 - 之后, 就可以透过窗⼝看到后⾯的猫猫头了. 点击 + ⼜会逐渐恢复.
    注意, C++ 中 float 类型遵守 IEEE 754 标准, 因此在进⾏运算的时候会有⼀定的精度误差. 因此 1 -0.1 的数值并⾮是 0.9 .

cursor

API说明
cursor()获取到当前 widget 的 cursor 属性, 返回 QCursor 对象.当⿏标悬停在该 widget 上时, 就会显⽰出对应的形状
setCursor(const QCursor& cursor)设置该 widget 光标的形状. 仅在⿏标停留在该 widget 上时⽣效.
QGuiApplication::setOverrideCursor(const QCursor& cursor)设置全局光标的形状. 对整个程序中的所有 widget 都会⽣效. 覆盖上⾯的 setCursor 设置的内容.

代码⽰例: 在 Qt Designer 中设置按钮的光标
在这里插入图片描述
2) 直接在右侧属性编辑区修改 cursor 属性为 “等待”
在这里插入图片描述
3) 运⾏程序, ⿏标悬停到按钮上, 即可看到光标的变化
代码⽰例: 通过代码设置按钮的光标

  1. 编写 widget.cpp
    • 其中 Qt::WaitCursor 就是⾃带的沙漏形状的光标
#include <QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建按钮
QPushButton* button = new QPushButton(this);
button->resize(100, 50);
button->move(100, 100);
button->setText("这是⼀个按钮");
// 设置按钮的 cursor
button->setCursor(QCursor(Qt::WaitCursor));
}

代码⽰例: ⾃定义⿏标光标
Qt ⾃带的光标形状有限. 我们也可以⾃⼰找个图⽚, 做成⿏标的光标.

  1. 创建 qrc 资源⽂件, 添加前缀 / , 并加⼊ huaji.png
    在这里插入图片描述
#include <QPixmap>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建⼀个位图对象, 加载⾃定义光标图⽚
QPixmap pixmap(":/huaji.png");
// 缩放图⽚为 64 * 64 的尺⼨.
pixmap = pixmap.scaled(64, 64);
// 创建 QCursor 对象, 并指定 "热点" 为 (2, 2) 坐标位置.
// 所谓 "热点" 就是⿏标点击时⽣效的位置.
QCursor cursor(pixmap, 2, 2);
// 设置光标
this->setCursor(cursor);
}

font

代码⽰例: 在 Qt Designer 中设置字体属性

  1. 在界⾯上创建⼀个 label
    在这里插入图片描述
  2. 在右侧的属性编辑区, 设置该 label 的 font 相关属性在这⾥调整上述属性, 可以实时的看到⽂字的变化.
    在这里插入图片描述
  3. 运⾏程序, 观察效果
    在这里插入图片描述

toolTip

API说明
setToolTip设置 toolTip.⿏标悬停在该 widget 上时会有提⽰说明.
setToolTipDuring设置 toolTip 提⽰的时间. 单位 ms.时间到后 toolTip ⾃动消失.

toolTip 只是给⽤⼾看的. 在代码中⼀般不需要获取到 toolTip

Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->pushButton_yes->setToolTip("这个是 yes 按钮");
ui->pushButton_yes->setToolTipDuration(3000);
ui->pushButton_no->setToolTip("这个是 no 按钮");
ui->pushButton_no->setToolTipDuration(10000);
}

focusPolicy

设置控件获取到焦点的策略. ⽐如某个控件能否⽤⿏标选中或者能否通过 tab 键选中
所谓 “焦点” , 指的就是能选中这个元素. 接下来的操作 (⽐如键盘操作), 就都是针对该焦点元素进⾏的了. 这个对于 输⼊框, 单选框, 复选框等控件⾮常有⽤的.

API说明
focusPolicy()获取该 widget 的 focusPolicy, 返回 Qt::FocusPolicy
setFocusPolicy(Qt::FocusPolicy policy)设置 widget 的 focusPolicy.

Qt::FocusPolicy 是⼀个枚举类型. 取值如下
• Qt::NoFocus :控件不会接收键盘焦点
• Qt::TabFocus :控件可以通过Tab键接收焦点
• Qt::ClickFocus :控件在⿏标点击时接收焦点
• Qt::StrongFocus :控件可以通过Tab键和⿏标点击接收焦点 (默认值)
• Qt::WheelFocus : 类似于 Qt::StrongFocus , 同时控件也通过⿏标滚轮获取到焦点 (新增的选项, ⼀般很少使⽤).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/354310.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

02-Linux入门

说明&#xff1a;01-VMware还没有写笔记&#xff0c;因为这个VMware我很久之前就装好了&#xff0c;先给自己挖个坑&#xff0c;回头有空了补一下01-VMware&#xff08;包括安装、使用、xshell的操作等 说明&#xff09;的笔记吧。 下面关于Linux的笔记是根据黑马的视频所写的&…

Notepad 将多行转换成字符串,合并成一行

notepad 将多行转换成字符串&#xff0c;合并成一行 (1) 快捷键 ctrl H &#xff0c;选择 【替换】&#xff0c; (2) 【查找目标】&#xff0c;输入 \r\n &#xff0c; 这个正则表达式的含义是 换行回到行首&#xff0c;相当于 windows的 enter 键&#xff1a; \r&#xff…

十分钟搭建本地Linux开发运行环境

十分钟搭建本地开运行环境 linux环境请参考&#xff1a;5分钟搭建本地linux开发环境 环境&#xff1a;宝塔、Jdk、Mysql、Redis 1、宝塔&#xff1a; 官网地址&#xff1a;宝塔官网 yum install -y wget && wget -O install.sh https://download.bt.cn/install/in…

【labVIEW】学习记录

【labVIEW】学习记录 一、简介二、安装及激活三、使用 回到目录 一、简介 labVIEW&#xff08;Laboratory Virtual Instrument Engineering Workbench&#xff09;是一款由美国国家仪器公司&#xff08;National Instruments&#xff09;开发的可视化编程环境和开发平台。LabV…

scrapy框架核心知识Spider,Middleware,Item Pipeline,scrapy项目创建与启动,Scrapy-redis与分布式

scrapy项目创建与启动 创建项目 在你的工作目录下直接使用命令: scrapy startproject scrapytutorial运行后创建了一个名为scrapytutorial的爬虫工程 创建spider 在爬虫工程文件内&#xff0c;运行以下命令&#xff1a; scrapy genspider quotes创建了名为quotes的爬虫 …

Logistics 逻辑回归概念

1. sigmoid函数 逻辑回归算法的拟合函数&#xff0c;叫做sigmoid函数&#xff1a; 函数图像如下&#xff08;百度图片搜到的图&#xff09;&#xff1a; sigmoid函数是一个s形曲线&#xff0c;就像是阶跃函数的温和版&#xff0c;阶跃函数在0和1之间是突然的起跳&#xff0c;…

Unity中URP下额外灯角度衰减

文章目录 前言一、额外灯中聚光灯的角度衰减二、AngleAttenuation函数的传入参数1、参数&#xff1a;spotDirection.xyz2、_AdditionalLightsSpotDir3、参数&#xff1a;lightDirection4、参数&#xff1a;distanceAndSpotAttenuation.zw5、_AdditionalLightsAttenuation 三、A…

【Git】windows系统安装git教程和配置

一、何为Git Git(读音为/gɪt/)是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 二、git安装包 有2种版本&#xff0c;Git for Windows Setup和Git for Windows Portable(便携版)两个版本都可以。 三、Git for Windows Por…

【服务器】宝塔面板的使用手册

目录 &#x1f337;概述 &#x1f33c;1. 绑定域名 &#x1f33c;2. 添加端口 &#x1f33c;3. 安装docker配置docker​​​​​​​ &#x1f33c;4. 软件商店 &#x1f33c;5. 首页 &#x1f337;概述 宝塔面板的安装教程&#xff1a;【服务器】安装宝塔面板 &#x1f…

[BJDCTF2020]The mystery of ip

hint 猜测ip和XFF有关 加一个XFF 下面这一步是看了wp出来的&#xff1a;存在ssti 这里尝试用jinja的注入方法&#xff0c;页面回显了是php的smarty框架 查了一下smarty的注入方法&#xff0c;发现可以直接执行php命令 在根目录找到flag

SpringBoot深入解析:掌握自动装配机制及其定制化原理

推荐一款我一直在用的ChatGPT4.0国内站点&#xff0c;每日有免费使用额度&#xff0c;支持PC、APP、VScode插件同步使用 SpringBoot篇&#xff1a;SpringBoot的自动装配原理 SpringBoot是一个旨在简化Spring应用初始搭建以及开发过程的框架。它利用了Spring框架的依赖注入特性…

(免费分享)基于springboot,vue疗养中心管理系统

前端&#xff1a;vueelementUI 技术&#xff1a;springbootmybatisredis 数据库&#xff1a;mysql 功能&#xff1a;系统管理、信息管理、膳食管理、护理管理、床位管理、后勤管理、费用管理等 获取完整源码&#xff1a; 大家点赞、收藏、关注、评论啦 、查看 &#x1f447;…

Java实现木马文件检测系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 木马分类模块2.3 木马软件模块2.4 安全资讯模块2.5 脆弱点模块2.6 软件检测模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 木马分类表3.2.2 木马软件表3.2.3 资讯表3.2.4 脆弱点表3.2.5 软件检测表…

「 典型安全漏洞系列 」07.OS命令注入详解

引言&#xff1a;什么是操作系统命令注入&#xff0c;如何防御和利用漏洞&#xff1f; 1. 简介 操作系统命令注入&#xff08;OS command injection&#xff09;是一种Web安全漏洞&#xff0c;允许攻击者在运行应用程序的服务器上执行任意操作系统&#xff08;OS&#xff09;命…

静态分析Golang语言生成函数调用关系的利器——go-callvis

目录 升级go删除旧版本安装新版本配置环境变量载入环境修改当前环境修改之后进入的环境 分析安装go-callvis分析其他包总结 导出文件总结 清晰主体脉络总结 其他 参考资料 不同于之前分析C语言项目的工具&#xff0c;go-callvis还是很方便使用。只要把两项工作做好就能顺利的使…

条件变量、线程池以及线程的GDB调试学习笔记

目录 一、条件变量 二、线程池概念和实现 三、线程的GDB调试 一、条件变量 应用场景&#xff1a;生产者消费者问题&#xff0c;是线程同步的一种手段。 必要性&#xff1a;为了实现等待某个资源&#xff0c;让线程休眠&#xff0c;提高运行效率 使用步骤&#xff1a; 初始…

SpringMVC 的请求流程(高频面试题)

文章目录 SpringMVC是什么&#xff0c;好处请求流程 SpringMVC 是什么&#xff0c;好处 Spring MVC 是Spring上最重要的框架。它是Web 框架&#xff0c;按照MVC 的模式&#xff0c;实现代码的解耦。Model 业务层、View 视图层、Controller 控制层。 将view层的请求数据在con…

【Android】在电脑连接操控手机上的Termux终端实现步骤

在Android手机上有一个Termux APP&#xff0c;可运行类似 Linux 终端的模拟器&#xff0c;想要学习Linux命令操作的话&#xff0c;可以用来练习&#xff0c;手机上输入命令不方便的话&#xff0c;可以用电脑连接手机终端输入命令练习的&#xff0c;来看看怎么实现连接。 文章目…

Advances in Deep Concealed Scene Understanding (伪装场景理解综述解读)

论文地址&#xff1a;https://link.springer.com/article/10.1007/s44267-023-00019-6 摘要 伪装场景理解是一个热门的计算机视觉课题&#xff0c;旨在感知展示伪装的物体&#xff0c;当前技术和应用的繁荣需要最新的研究调查&#xff0c;这可以帮助研究人员更好的了解全球CS…

【大数据】Flink 架构(四):状态管理

Flink 架构&#xff08;四&#xff09;&#xff1a;状态管理 1.算子状态2.键值分区状态3.状态后端4.有状态算子的扩缩容4.1 带有键值分区状态的算子4.2 带有算子列表状态的算子4.3 带有算子联合列表状态的算子4.4 带有算子广播状态的算子 在前面的博客中我们指出&#xff0c;大…