当前位置: 首页 > news >正文

【Qt基础篇】信号和槽

文章目录

  • 一些常见的bug:
    • 字符集不对产生的错误
    • VS平台中文乱码
  • QT的优点
  • 关于.pro文件
  • QtCreator快捷键
  • 最简单的qt程序
  • 按钮的创建
  • 对象模型
  • **Qt窗口坐标**体系
  • 信号和槽机制
    • connect函数
    • 系统自带的信号和槽
      • 案例:实现点击按钮-关闭窗口的案例
    • 自定义信号和槽
      • 案例:下课->老师触发饿了信号->学生响应信号请吃饭
      • 案例:使用lambda表达式实现点击按钮关闭窗口功能
    • 信号槽的扩展
    • QT4版本的信号槽写法
  • 总结

一些常见的bug:

字符集不对产生的错误

image-20231003112340386

该bug的产生原因:字符集不对的原因

解决办法:记事本打开该文件 => 另存为 => 编码改为带有BOM 的 UTF-8 (更改该文件的编码格式)

image-20231003112404027


VS平台中文乱码

乱码原因:QT使用的utf-8编码进行字符串处理,VS使用的是GB2312 ,二者编码格式不匹配,所以中文就会乱码

解决办法1:在字符串加上u8

QWidget w;
w.setWindowTitle(u8"windows 芒果");
w.show();

解决办法2:按照上面字符集不对产生的错误解决之后 => 项目=>命令行增加一个选项 /utf-8

image-20231003112817430

解决办法3:安装拓展

image-20231003112904558

作用:自动将文件编码格式保存为utf-8。而如果改为编写C语言文件的时候,需要禁用该拓展

image-20231003112931656


方法4:在头文件当中增加

#pragma execution_character_set("utf-8")

QT的优点

  • 跨平台,几乎支持所有的平台
  • 接口简单,容易上手,学习QT框架对学习其他框架有参考意义。
  • 一定程度上简化了内存回收机制
  • 开发效率高,能够快速的构建应用程序
  • 有很好的社区氛围,市场份额在缓慢上升
  • 可以进行嵌入式开发

关于.pro文件

.pro就是工程文件(project),它是qmake自动生成的用于生产makefile的配置文件

QT       += core gui   Qt包含的模块greaterThan(QT_MAJOR_VERSION, 4): QT += widgets  //大于4版本以上 包含 widget模块TARGET = 01_FirstProject  //目标   生成的.exe程序的名称
TEMPLATE = app       	  //模板   应用程序模板  Application  SOURCES += main.cpp\      //源文件mywidget.cppHEADERS  += mywidget.h    //头文件   

解释:

【1】.注释:从“#”开始,到这一行结束

【2】.模板变量:告诉qmake为这个应用程序生成哪种makefile。下面是可供使用的选择:TEMPLATE = app

  • app -建立一个应用程序的makefile,这是默认值,所以如果模板没有被指定,这个将被使用
  • lib - 建立一个库的makefile
  • vcapp - 建立一个应用程序的VisualStudio项目文件
  • vclib - 建立一个库的VisualStudio项目文件
  • subdirs -这是一个特殊的模板,它可以创建一个能够进入特定目录并且为一个项目文件生成makefile并且为它调用make的makefile

【3】.指定生成的应用程序名:TARGET = QtDemo

【4】.工程中包含的头文件:HEADERS += include/painter.h

【5】.工程中包含的.ui设计文件:FORMS += forms/painter.ui

【6】.工程中包含的源文件:SOURCES += sources/main.cpp sources

【7】.工程中包含的资源文件:RESOURCES += qrc/painter.qrc

【8】.greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

这条语句的含义是,如果QT_MAJOR_VERSION大于4(也就是当前使用的Qt5及更高版本)需要增加widgets模块。如果项目仅需支持Qt5,也可以直接添加“QT += widgets”一句。不过为了保持代码兼容,最好还是按照QtCreator生成的语句编写


QtCreator快捷键

注释  ctrl + /
运行  ctrl + r
编译  ctrl + b
字体缩放 ctrl + 鼠标滚轮
查找  ctrl + f
整行移动 ctrl + shift + ↑ 或者↓
帮助文档 F1
自动对齐  ctrl + i;
同名之间的.h 和 .cpp切换  F4
帮助文档 第一种方式 F1  第二种 左侧按钮  第三种:QT安装路径下的bin目录,例如: C:\Qt\Qt5.6.0\5.6\mingw49_32\bin

最简单的qt程序

main函数入口

//main程序入口  argc命令行变量的数量  argv命令行变量的数组
int main(int argc, char *argv[])
{//a应用程序对象,在Qt中,应用程序对象 有且仅有一个QApplication a(argc, argv);Widget w; //窗口对象w.show();//窗口对象 默认不会显示,必须要调用show方法显示窗口//让应用程序对象进入消息循环  让代码阻塞到这行return a.exec();
}

QApplication应用程序类:是Qt的整个后台管理的命脉它包含主事件循环,在其中来自窗口系统和其它资源的所有事件处理和调度。它也处理应用程序的初始化和结束,并且提供对话管理

  • 对于任何一个使用Qt的图形用户界面应用程序,都只能存在一个QApplication 对象,而不论这个应用程序在同一时间内是不是有0、1、2或更多个窗口

a . e x e c ( ) a.exec() a.exec()程序进入消息循环,等待对用户输入进行响应。这里main()把控制权转交给Qt,Qt完成事件处理工作,当应用程序退出的时候exec()的值就会返回。在exec()中,Qt接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。


按钮的创建

在Qt程序中,最常用的控件之一就是按钮,一个按钮其实就是一个QPushButton类对象,其中有两种创建方式:

  • 如果只是创建出对象,是无法显示到窗口中的,所以我们需要依赖一个父窗口,也就是指定一个父亲利用setParent函数即可
  • 如果想设置按钮上显示的文字利用setText,移动按钮位置用move
#include <QPushButton>
//创建方式1:
QPushButton * btn = new QPushButton; 
btn->setParent(this);//设置父亲  让btn对象依赖在当前Widget窗口中
btn->setText("德玛西亚");//设置文字
btn->move(100,100);//移动位置//创建方式2:
QPushButton * btn2 = new QPushButton("孙悟空",this);
//下述的this都可以省略
this->resize(600,400);//重新指定窗口大小
this->setWindowTitle("第一个项目");//设置窗口标题
this->setFixedSize(600,400);//限制窗口大小 => 不可以拖拽去扩大/缩小大小
//重置窗口大小
resize(600,400); //this->resize(...)

对于窗口而言,我们可以修改左上角窗口的标题setWindowTitle,重新指定窗口大小:resize,或者设置固定的窗口大小setFixedSize;

image-20231003100004313

注意:如果是在Widget的构造函数当中:

QPushButton btnStack;
btnStack.setParent(this);

此时该按钮并不会显示在窗口当中,因为该对象是在栈上创建的,一旦Widget的构造函数执行完成之后,该对象就会被销毁,因此它不会显示在窗口中。要使 btnStack 对象显示在窗口中,你应该将它的生命周期延长,使其在窗口的整个生命周期内都存在 =>可以选择 将btnStack声明为类的成员变量


对象模型

image-20231003155443912

在Qt中创建对象的时候需要提供一个Parent对象指针,因为QObject是以对象树的形式组织起来的,当你创建一个对象时,会看到该对象的构造函数接收一个QObject指针作为参数,这个参数就是 parent,也就是父对象指针。

image-20231003100343298

【1】.在创建对象时,可以提供一个其父对象,我们创建的这个QObject对象会自动添加到其父对象的children()列表当父对象析构的时候,这个列表中的所有对象也会被析构。(注意,这里的父对象并不是继承意义上的父类

【2】.QWidget继承自QObject,因此也继承了这种对象树关系。一个孩子自动地成为父组件的一个子组件

  • 例如,当用户关闭一个对话框的时候,应用程序将其删除,那么,我们希望属于这个对话框的按钮、图标等应该一起被删除。事实就是如此,因为这些都是对话框的子组件

【3】.我们也可以自己删除子对象,它们会自动从其父对象列表中删除

  • 当我们删除了一个工具栏时,其所在的主窗口会自动将该工具栏从其子对象列表中删除,并且自动调整屏幕显示

Qt 引入对象树的概念,在一定程度上解决了内存问题

  • 当一个QObject对象在堆上创建的时候,Qt 会同时为其创建一个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的
    • 任何对象树中的 QObject对象 delete 的时候,如果这个对象有 parent,则自动将其从 parent 的children()列表中删除
    • 如果有孩子,则自动 delete 每一个孩子
    • Qt 保证没有QObject会被 delete 两次,这是由析构顺序决定的
  • 如果QObject在栈上创建,Qt 保持同样的行为
{QWidget window;QPushButton quit("Quit", &window);
}

作为父组件的 window 和作为子组件的 quit 都是QObject的子类,此时这段代码是正确的,quit 的析构函数不会被调用两次,因为标准 C++要求,局部对象的析构顺序应该按照其创建顺序的相反过程,这段代码在超出作用域时,会先调用 quit 的析构函数,将其从父对象 window 的子对象列表中删除,然后才会再调用 window 的析构函数

错误代码

{QPushButton quit("Quit");QWidget window;quit.setParent(&window);
}

此时:1.父对象的 window 会首先被析构,因为它是最后一个创建的对象。在析构过程中,它会调用子对象列表中每一个对象的析构函数,也就是说, quit 此时就被析构了

2.在 window 析构之后,quit 也会被析构,因为 quit 也是一个局部变量,在超出作用域的时候当然也需要析构。但是,这时候已经是第二次调用 quit 的析构函数了,C++ 不允许调用两次析构函数,因此,程序崩溃了

结论:尽量在构造的时候就指定 parent 对象,并且大胆在堆上创建。当创建的对象在堆区时候,如果指定的父亲是QObject类或者父类是QObject子类派生下来的类,可以不用管理释放的操作,将对象会放入到对象树中,一定程度上简化了内存回收机制


Qt窗口坐标体系

以左上角为原点(0,0),x以右为正方向,y以下为正方向

image-20231003101103992

如果是对于嵌套窗口,其坐标是相对于父窗口来说的


信号和槽机制

信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal),但是这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调


connect函数

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

信号槽的优点:松散耦合,信号的发送端和接收端本身没有任何关联,二者通过connect函数进行关联,将两端耦合在一起


系统自带的信号和槽

在帮助文档中输入QPushButton,首先我们可以在Contents中寻找关键字 signals,但是我们发现并没有找到,这时候我们应该想到也许这个信号的被父类继承下来的,因此我们去他的父类QAbstractButton中就可以找到该关键字

image-20231003102143720

点击signals索引到系统自带的信号有如下几个:

image-20231003102205487

槽函数的寻找方式和信号一样,只不过他的关键字是slot


案例:实现点击按钮-关闭窗口的案例

testQt::testQt(QWidget* parent): QWidget(parent)
{ui.setupUi(this);QPushButton* btn = new QPushButton(u8"关闭窗口", this);btn->move(100, 200);resize(500, 500);//参数1  信号的发送者 参数2  发送的信号(函数的地址) 参数3  信号的接受者 参数4  处理的槽函数connect(btn, &QPushButton::clicked, this, &QWidget::close);
}

自定义信号和槽

案例:下课->老师触发饿了信号->学生响应信号请吃饭

image-20231003153906028

testQt.cpp

testQt::testQt(QWidget* parent): QWidget(parent)
{ui.setupUi(this);//1.创建老师和学生对象this->teacher = new Teacher(this);this->stu = new Student(this);//点击按钮触发下课QPushButton* btn = new QPushButton(u8"下课", this);btn->move(200, 200);btn->resize(100, 100);//2.0:无参 信号和槽函数连接 =>假设没有重载版本时的调用情况=>只有treat()和hungry()/*connect(teacher, SIGNAL(hungry()), stu, SLOT(treat())); //QT4写法connect(teacher, &Teacher::hungry, stu, &Student::treat);   *///2.1:无参 信号和槽函数连接 =>有重载版本时的调用情况/*void(Teacher:: * teacherSignal)() = &Teacher::hungry;void(Student:: * studentSlot)() = &Student::treat;connect(teacher, teacherSignal, stu, studentSlot);connect(btn, &QPushButton::clicked, teacher, teacherSignal); //信号可以连接信号 => 当点击事件发生=>触发teacherSignal信号=>触发studentSlot槽函数*///2.2:有参 信号和槽函数连接 =>有重载版本时的调用情况/*void(Teacher:: * teacherSignal)(QString) = &Teacher::hungry;void(Student:: * studentSlot)(QString) = &Student::treat;connect(teacher, teacherSignal, stu, studentSlot);//connect(btn, &QPushButton::clicked, teacher, teacherSignal); //err,原因:信号和槽的参数类型不匹配//clicked的第一个参数为bool teacherSignal函数的参数为QString,信号和槽函数的参数 必须类型一一对应*///3.调用下课函数ClassOver();
}void testQt::ClassOver()
{//emit teacher->hungry();//触发老师饿了信号 ->无参版本emit teacher->hungry(u8"宫保鸡丁"); //触发老师饿了信号 ->带参版本
}

案例:使用lambda表达式实现点击按钮关闭窗口功能

 QPushButton* btn = new QPushButton(u8"close Widget", this);btn->move(200, 200);btn->resize(100, 100);connect(btn, &QPushButton::clicked,[=]() {qDebug() << u8"关闭窗口";close(); //this->close(); 关闭窗口
});

注意:如果第三个参数是this,第四个参数是lambda表达式,那么第三个参数可以省略


注意:

【1】.如果有两个重名的自定义信号和自定义的槽,直接连接会报错,所以需要利用函数指针来明确指向函数地址, 然后再做连接

connect(teacher,&Teacher::hungury,student,&Student::treat); //void hungury()和void treat()连接//自定义的信号 hungry带参数,需要提供重载的自定义信号和 自定义槽
//void hungury(QString name);  自定义信号
//void treat(QString name );    自定义槽
void (Teacher:: *teacherSingal)(QString) = &Teacher::hungury;
void (Student:: * studentSlot)(QString) = &Student::treat;
connect(teacher,teacherSingal,student,studentSlot);

补充:关于函数指针指向的是类当中的成员函数:

class A
{
public:void func(){cout << "A::func()" << endl;}
};
void (A::*PFunc)() = &A::func;
int main()
{A obj;(obj.*PFunc)();//成员函数需要一个对象实例来调用/*obj:这是一个已经创建的类A的对象实例。成员函数需要一个对象实例来操作类的数据成员和执行操作。.*:这是成员函数指针运算符。它用于将成员函数指针与对象实例关联在一起,以便调用成员函数。PFunc:这是一个指向成员函数的指针,它保存了要调用的成员函数的地址。在这种情况下,它指向类A的func()成员函数。():这是函数调用运算符,用于调用函数。在这里,我们使用它来调用与对象实例obj关联的成员函数PFunc指向的成员函数。*/return 0;
}

【2】发送者和接收者都需要是QObject的子类

  • ​ 例外:槽函数是全局函数、Lambda 表达式等无需接收者

【3】信号和槽函数返回值是 void信号只需要声明,不需要实现槽函数需要声明也需要实现。信号和槽函数都可以进行重载

  • 自定义信号写到$signals$当中,自定义槽函数写到public slot当中或者public函数或者全局函数

【4】槽函数是普通的成员函数,作为成员函数,会受到 public、private、protected 的影响

【5】使用 emit 在恰当的位置发送信号使用connect()函数连接信号和槽

【6】任何成员函数、static 函数、全局函数和 Lambda 表达式都可以作为槽函数

【7】信号槽要求信号和槽的参数一致,所谓一致,是参数类型一致。如果信号和槽的参数不一致,允许的情况是:槽函数的参数可以比信号的少,但是此时槽函数存在的那些参数的顺序也必须和信号的前面几个一致,因为,你可以在槽函数中选择忽略信号传来的数据(也就是槽函数的参数比信号的少)


信号槽的扩展

【1】一个信号可以和多个槽相连

  • 如果是这种情况,这些槽会一个接一个的被调用,但是它们的调用顺序不确定

【2】多个信号可以连接到一个槽,只要任意一个信号发出,这个槽就会被调用

【3】一个信号可以连接到另外的一个信号

  • 当第一个信号发出时,第二个信号被发出。除此之外,这种信号-信号的形式和信号-槽的形式没有什么区别

【4】信号槽可以被取消链接,可以disconnect断开

  • 这种情况并不经常出现,因为当一个对象delete之后,Qt自动取消所有连接到这个对象上面的槽
disconnect(teacher,teacherSignal2,stu,studentSlot2); //断开信号  和 信号连接的格式一致

【5】l 使用Lambda 表达式

在使用QT5 的时候,能够支持QT5的编译器都是支持 Lambda 表达式的。在连接信号和槽的时候,槽函数可以使用Lambda表达式的方式进行处理


QT4版本的信号槽写法

connect(teacher,teacherSingal,student,studentSlot); //QT5  teacherSingal和studentSlot是函数指针
connect(teacher,SIGNAL(hungry(QString)),student,SLOT(treat(QString))); //QT4版本的写法//connect( 信号的发送者,发送的信号SIGNAL(信号),信号接受者,槽函数SLOT(槽函数))

优点:参数直观

缺点:编译器不会检测参数类型

使用了SIGNAL和SLOT这两个宏,作用是:将两个函数名转换成了字符串,一旦出现连接不成功的情况,Qt4是没有编译错误的,而是在运行时给出错误。这无疑会增加程序的不稳定性


总结

image-20231003155855925

相关文章:

【Qt基础篇】信号和槽

文章目录 一些常见的bug&#xff1a;字符集不对产生的错误VS平台中文乱码 QT的优点关于.pro文件QtCreator快捷键最简单的qt程序按钮的创建对象模型**Qt窗口坐标**体系信号和槽机制connect函数系统自带的信号和槽案例&#xff1a;实现点击按钮-关闭窗口的案例 自定义信号和槽案例…...

.netCore用DispatchProxy实现动态代理

在 .NET Core 中&#xff0c;你可以使用 DispatchProxy 类来实现动态代理。DispatchProxy 允许你在运行时创建一个代理对象&#xff0c;该代理对象可以拦截对其所代理的对象的方法调用&#xff0c;并在方法调用前后执行自定义的逻辑。这在 AOP&#xff08;面向切面编程&#xf…...

好奇喵 | Tor浏览器——访问.onion网址,揭开Dark Web的神秘面纱

前言 在之前的博客中&#xff1a; 1.Surface Web —&#xff1e; Deep Web —&#xff1e; Dark Web&#xff0c;我们解释了表层网络、深层网络等的相关概念&#xff1b; 2.Tor浏览器——层层剥开洋葱&#xff0c;我们阐述了Tor的历史和基本工作原理&#xff1b; 3.Tor浏览器…...

Maven 中引用其他项目jar包出现BOOT-INF问题

问题 在B项目中引入A项目的类&#xff0c;但是发现怎么也引入不进来 A项目打包之后&#xff0c;想在B项目中引用jar 在B项目中发现类文件无法引用 参考网上进行清缓存等一系列操作都没有解决。 最后发现引用的jar包中包含BOOT-INF&#xff0c; 然后去A项目中查找&#xff…...

PHP框架面试题

目录 1、什么是PHP框架&#xff1f; 2、常见的PHP框架有哪些&#xff1f; 3、为什么要使用PHP框架&#xff1f; 4、什么是路由&#xff1f;PHP框架中的路由是如何实现的&#xff1f; 5.TP的特性有哪些? 6.laravel有那些特点? 7.TP框架和Laravel框架的区别 8.tp5和tp6区…...

如何清理C盘

当前最棘手的问题是C盘满了&#xff0c;如何清理成了一个大问题&#xff0c;在本篇文章中我将记录我在清理c盘空间过程中的探索。 2023-10-06探索无果&#xff0c;记录于此。...

计算机网络基础知识

1 计算机网络是指将多台计算机连接在一起&#xff0c;以便它们可以相互通信和共享资源的系统。在本文中&#xff0c;我们将详细介绍计算机网络的基础知识&#xff0c;包括网络的分类、网络协议、网络拓扑、网络设备和网络安全等方面的内容。 网络分类 计算机网络可以根据其范…...

Go语言面经进阶10问

1.Golang可变参数 函数方法的参数&#xff0c;可以是任意多个&#xff0c;这种我们称之为可以变参数&#xff0c;比如我们常用的fmt.Println()这类函数&#xff0c;可以接收一个可变的参数。可以变参数&#xff0c;可以是任意多个。我们自己也可以定义可以变参数&#xff0c;可…...

大厂真题:【DP】米哈游2023秋招-米小游与魔法少女-奇运

题目描述与示例 题目描述 米小游都快保底了还没抽到希儿&#xff0c;好生气哦&#xff01;只能打会活动再拿点水晶。 米小游和世界第一可爱的魔法少女 TeRiRi 正在打 BOSS&#xff0c;BOSS 的血量为h&#xff0c;当 BOSS 血量小于等于0时&#xff0c;BOSS 死亡。TeRiRi 有一…...

后端面经学习自测(一)

文章目录 1、MySQL-MVCC2、MySQL-原子性怎么实现3、MySQL-持久性怎么实现隔离性怎么实现 4、操作系统-死锁产生手写死锁死锁排查 5、操作系统-避免死锁死锁的四个必要条件预防死锁 6、操作系统-pageCache是什么零拷贝 7、计算机网络-TCP的可靠性和顺序性怎么实现8、计算机网络-…...

win10、win11安装Ubuntu 22.04

目前为止&#xff08;2023年10月6日&#xff09;&#xff0c;最新的 Ubuntu 版本是 Ubuntu 22.04。你可以按照以下步骤在 Windows 上使用 WSL 安装 Ubuntu 22.04&#xff1a; 检查系统要求&#xff1a; 确保你的操作系统是 Windows 10 或更高版本&#xff0c;并已安装 Windows …...

golang gin框架1——简单案例以及api版本控制

gin框架 gin是golang的一个后台WEB框架 简单案例 package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {r : gin.Default()r.GET("/ping", func(c *gin.Context) {//以json形式输出&#xff0c;还可以xml protobufc.JSON…...

Redisson—分布式对象

每个Redisson对象实例都会有一个与之对应的Redis数据实例&#xff0c;可以通过调用getName方法来取得Redis数据实例的名称&#xff08;key&#xff09;。 RMap map redisson.getMap("mymap"); map.getName(); // mymap 所有与Redis key相关的操作都归纳在RKeys这…...

alsa pcm接口之在unix环境的传输方法

在unix环境,数据片段响应被接受通过standard I/O call或事件等待路径(poll或select功能),为完成列表,异步通知响应该被列举出来.ALSA实现那些方法被描述在ALSA transfers部分. 标准I/O传输(Standadrd I/O transfers) 这个标准I/O传输常常使用read和write C语言函数集,对于那些函…...

小谈设计模式(20)—组合模式

小谈设计模式&#xff08;20&#xff09;—组合模式 专栏介绍专栏地址专栏介绍 组合模式对象类型叶节点组合节点 核心思想应用场景123 结构图结构图分析 Java语言实现首先&#xff0c;我们需要定义一个抽象的组件类 Component&#xff0c;它包含了组合节点和叶节点的公共操作&a…...

sheng的学习笔记-【中文】【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第三周测验

课程1_第3周_测验题 目录&#xff1a;目录 第一题 1.以下哪一项是正确的&#xff1f; A. 【  】 a [ 2 ] ( 12 ) a^{[2](12)} a[2](12)是第12层&#xff0c;第2个训练数据的激活向量。 B. 【  】X是一个矩阵&#xff0c;其中每个列都是一个训练示例。 C. 【  】 a 4 […...

一文详解动态链表和静态链表的区别

1、引言 本文主要是对动态链表和静态链表的区别进行原理上的讲解分析&#xff0c;先通过对顺序表和动态链表概念和特点的原理性介绍&#xff0c;进而引申出静态链表的作用&#xff0c;以及其概念。通过这些原理性的概述&#xff0c;最后总结归纳出动态链表和静态链表的区别。本…...

[C国演义] 第十三章

第十三章 三数之和四数之和 三数之和 力扣链接 根据题目要求: 返回的数对应的下标各不相同三个数之和等于0不可包含重复的三元组 – – 即顺序是不做要求的 如: [-1 0 1] 和 [0, 1, -1] 是同一个三元组输出答案顺序不做要求 暴力解法: 排序 3个for循环 去重 — — N^3, …...

<二>Qt斗地主游戏开发:过场动画的实现

1. 过场动画效果 2. 思路分析 过场动画较为简单&#xff0c;只有一个进度条在进行滚动&#xff0c;因此实现起来不需要动画相关处理&#xff0c;仅需要图片和定时器设定&#xff0c;让进度条动起来即可。我们可以创建一个对话框&#xff0c;设定背景图片以及对话框透明无边框&a…...

链式法则(Chain Rule)

定义 链式法则&#xff08;Chain Rule&#xff09;是概率论和统计学中的一个基本原理&#xff0c;用于计算联合概率分布或条件概率分布的乘积。它可以用于分解一个复杂的概率分布为多个较简单的条件概率分布的乘积&#xff0c;从而简化概率分析问题。 链式法则有两种常见的形…...

AUTOSAR COM模块框架梳理

框架&#xff1a; COM的功能主要就是两个&#xff1a; 把IPDU内的signal提取出来提供给SWC使用&#xff0c;把SWC发送的signal拷贝到IPDU buffer内 所以&#xff0c;COM的关键字是 signal, signal group, IPDU, IPDU group Signal group 是为了保证 Complex Data Types 的数…...

详细介绍区块链之挖矿

对不起&#xff0c;大家&#xff0c;这篇文章对作者来说实在是太有意义和含金量了&#xff0c;作者想把它设置为关注博主才能见全文&#xff0c;请大家理解&#xff01;如果觉得还是看不懂&#xff0c;抱歉耽误大家的时间&#xff0c;就请取消关注&#xff01;&#xff01;&…...

华为OD机试真题-路灯照明问题(Java/C++/Go/Python)

【华为OD机试真题】路灯照明问题(Java/C++/Go/Python) 题目描述 在一条笔直的公路上安装了N个路灯,从位置0开始安装,路灯之间间距固定为100米。 每个路灯都有自己的照明半径,请计算第一个路灯和最后一个路灯之间,无法照明的区间的长度和。 输入描述 第一行为一个数N…...

嵌入式技术面试基本规则

潜规则1&#xff1a;面试的本质不是考试&#xff0c;而是告诉面试官你会做什么 经验不够的小伙伴特别容易犯的一个错误&#xff0c;不清楚面试官到底想问什么&#xff0c;其实整个面试中面试官并没有想难倒你的意思&#xff0c;只是想通过提问的方式来知道你会什么。 比如stm…...

osg实现自定义插件读取自定义格式的模型文件到场景

目录 1. 前言 2. 预备知识 3. 工具、原料 4. 代码实现 1. 前言 osg提供了很多插件来读取模型文件到场景中&#xff0c;这些插件支持大约70种格式类型的文件&#xff0c;但现实中的文件是各式各样&#xff0c;osg不可能囊括所有类型文件&#xff0c;当osg不支持某种类型格式…...

redis进阶

redis.conf 启动的时候就通过配置文件来启动的&#xff01; # 这个不是配置的&#xff0c;就是在这儿说明一下 # 当配置中需要配置内存大小时&#xff0c;可以使用 1k, 5GB, 4M 等类似的格式&#xff0c;其转换方式如下(不区分大小写) # # 1k > 1000 bytes # 1kb > 102…...

(一)正点原子STM32MP135移植——准备

一、简述 使用板卡&#xff1a;正点原子的ATK-DLMP135 V1.2 从i.mx6ull学习完过来&#xff0c;想继续学习一下移植uboot和内核的&#xff0c;但是原子官方没有MP135的移植教程&#xff0c;STM32MP157的移植教程用的又是老版本的代码&#xff0c;ST官方更新后的代码不兼容老版本…...

Kotlin的关键字 lateinit 和 lazy

序、完善一下曾经的草稿。 Kotlin通常要求我们在定义属性后立即对起进行初始化&#xff0c;当我们不知道理想的初始值时&#xff0c;这样做似乎很奇怪&#xff0c;尤其是在生命周期驱动android属性的情况下。 lateinit 简介 lateinit&#xff0c;Kotlin提供的一个可以延迟初…...

阿里云服务器ECS详细介绍_云主机_服务器托管_弹性计算

阿里云服务器ECS英文全程Elastic Compute Service&#xff0c;云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务&#xff0c;阿里云提供多种云服务器ECS实例规格&#xff0c;如经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等&#xff0c;阿里云服务器网分享阿…...

12、建立健全人员培训体系

9、大小屏分离与精细化审核 10、质量审核的设立与合并 11、视频分类建议 内容仓为公司其他部门输送了许多人才&#xff0c;既包括有潜力的主管&#xff0c;也有表现突出或者具备某些特殊能力的员工&#xff0c;从内容仓走出的同事&#xff0c;有些已经成为公司重要业务某个方…...

东坑镇做网站/网页开发

vue是一个轻量级框架&#xff0c;与其他重量级的框架不同的是&#xff0c;vue采用自底向上增量开发的设计。使用vue只需要关注视图层&#xff0c;不过使用起来让我感觉最不错的是vue的响应式数据绑定和组合试图组件。今天给大家分享一下提升效率的7个新vue实战技巧&#xff0c;…...

南京医院手机网站建设/宁波seo推广服务电话

MySQL的四种事务隔离级别 一、事务的基本要素&#xff08;ACID&#xff09; 1、原子性&#xff08;Atomicity&#xff09;&#xff1a;事务开始后所有操作&#xff0c;要么全部做完&#xff0c;要么全部不做&#xff0c;不可能停滞在中间环节。事务执行过程中出错&#xff0c…...

网站的站长是什么意思/山西seo顾问

写过PHP的都知道&#xff0c;其有个extract()非常方便&#xff0c;可以便捷的将字典转换为变量&#xff0c;当然到ASP中则要受限很多&#xff0c;特别是VBScript脚本&#xff0c;本文叙述的就是一种转换的思路&#xff0c;可以实现类似的功能。下面我就直接提供ASP版本的extrac…...

无忧商务网/江苏seo团队

// 递归函数&#xff1a;函数内部自己调用自己&#xff0c;这个函数就是递归函数 // 不断开辟空间&#xff0c;会发生栈溢出。 // 要加入退出条件 function fn(){fn(); }fn();递归题目&#xff1a; 1.求 123……*n 阶乘 function fn(n) {if(n 1){return 1;}return n * fn(n…...

地板网站源码/友情链接英文翻译

Android studio findViewById 返回null 问题 有没有遇到Android studio建的APP工程&#xff0c;本来findViewById能够正常获得对象的&#xff0c;但是&#xff0c;突然有部分不能获得对象&#xff0c;导致工程不能运行。网上有些解决方案是&#xff0c;通过获得本页面的view …...

wordpress设置文章第一张/网推怎么做

今天给大家带来的依然是JS解密实战&#xff0c;我们的目标是阿里文学网。随手点进一本书&#xff0c;通过谷歌浏览器来分析一下请求。很容易我们就发现这个XHR是一个GET请求&#xff0c;但是其请求链接包含了下图中的bookid&#xff0c;chapterid&#xff0c;ut,num,ver,aut参数…...