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

初识 QT

初始QT

  • 什么是QT
  • QT发展史
  • QT支持的平台
  • QT的优点
  • QT的应用场景
  • 搭建QT开发环境
    • QT的开发工具概述
    • QT下载安装
  • 使用QT创建项目
  • QT 实现Hello World程序
    • 使用按钮控件来实现
    • 使用标签控件来实现
  • 项目文件解析
    • widget.h
    • main.cpp
    • widget.cpp
    • widget.ui
    • .pro文件
  • 对象树
  • QT 窗口坐标体系

什么是QT

Qt 是⼀个跨平台的C++图形⽤⼾界⾯应⽤程序框架。它为应⽤程序开发者提供了建⽴艺术级图形界⾯所需的所有功能。它是完全⾯向对象的,很容易扩展。Qt为开发者提供了⼀种基于组件的开发模式,开发者可以通过简单的拖拽和组合来实现复杂的应⽤程序,同时也可以使⽤C++语⾔进⾏⾼级开发。

图形用户界面: 指采⽤图形⽅式显⽰的计算机操作⽤⼾界⾯,是计算机与其使⽤者之间的对话接⼝,是计算机系统的重要组成部分。

QT发展史

1991 年Qt最早由奇趣科技开发;
1996 年进⼊商业领域,它也是⽬前流⾏的Linux桌⾯环境KDE的基础;
2008 年奇趣科技被诺基亚公司收购,Qt称为诺基亚旗下的编程语⾔;
2012 年Qt⼜被Digia公司收购;
2014 年4⽉跨平台的集成开发环境QtCreator3.1.0发布,同年5⽉20⽇发布了Qt5.3正式版,⾄此Qt实现了对IOS、Android、Embedded等各平台的全⾯⽀持。

QT支持的平台

  1. Windows‒XP、Vista、Win7、Win8、Win2008、Win10
  2. Unix/X11‒Linux、SunSolaris、HP-UX、CompaqTru64UNIX、IBMAIX、SGIIRIX、FreeBSD、BSD/OS、和其他很多X11平台
  3. Macintosh‒MacOSX
  4. Embedded‒有帧缓冲⽀持的嵌⼊式Linux平台,WindowsCE
  5. Android

QT的优点

  1. 跨平台,⼏乎⽀持所有的平台;
  2. 接⼝简单,容易上⼿,学习QT框架对学习其他框架有参考意义。
  3. ⼀定程度上简化了内存回收机制;
  4. 开发效率⾼,能够快速的构建应⽤程序。
  5. 有很好的社区氛围,市场份额在缓慢上升。
  6. 可以进⾏嵌⼊式开发。

QT的应用场景

桌面应用程序: Qt 能够创建各种类型的桌⾯应⽤程序,包括⽂件管理器、媒体播放器、绘图程序等。Qt应⽤程序⽀持多种操作系统,可以运⾏在Windows、Linux、macOS等桌⾯操作系统上。

移动应用程序: Qt ⽀持Android和IOS移动操作系统,为应⽤程序提供了强⼤的跨平台能⼒。可以使⽤Qt构建各种移动应⽤程序,例如社交应⽤、游戏、娱乐等。

嵌入式系统: Qt 在嵌⼊式领域应⽤⾮常⼴泛,它可以构建⾯向各种设备的图形应⽤程序,在机顶盒、⻋载娱乐系统、安防监控设备等领域具有⼴泛的应⽤。

搭建QT开发环境

QT的开发工具概述

QT Creator: Qt Creator 是⼀个轻量级的跨平台集成开发环境(IDE),专为使⽤Qt框架进⾏应⽤程序开发⽽设计。它是⼀个功能强⼤、易于使⽤、快速且⾼效的⼯具,被⼴泛⽤于编写各种类型的应⽤程序,如桌⾯应⽤程序、移动应⽤程序和嵌⼊式系统等。Qt Creator 提供了⼀个可视化的界⾯设计器和代码编辑器,可以帮助开发者更快捷地创建复杂的⽤⼾界⾯和处理各种事件。它还包含了调试⼯具、版本控制⼯具、⾃动完成和智能提⽰等功能,以及⽀持多语⾔和跨平台的开发环境。
QtCreator 的主要特点包括:

  1. 紧密集成的Qt框架:QtCreator专⻔为Qt开发⽽设计,因此它与Qt框架集成得⾮常紧密,使开
    发者可以更容易地管理和部署他们的应⽤程序。
  2. 强⼤的编辑器:QtCreator具有⼀些先进的编辑器功能,如语法⾼亮、代码折叠、智能提⽰、⾃动
    完成和代码重构。
  3. 集成的调试器:QtCreator内置了调试器,允许开发⼈员在代码中设置断点以及检查变量、堆栈和
    调⽤树等信息。
  4. ⾼效的构建系统:QtCreator提供了⼀个⾼效的构建系统,可以⾃动构建和部署应⽤程序,同时⽀
    持使⽤不同的编译器和平台。
  5. 可视化界⾯设计器:QtCreator具有⼀个可视化界⾯设计器,它允许开发⼈员在没有编写代码的情
    况下创建复杂的⽤⼾界⾯。
  6. 多语⾔⽀持:QtCreator⽀持多种编程语⾔,包括C++、QML、JavaScript等。

VisualStudio: Visual Studio 是由微软公司开发的集成开发环境(IDE)。它可以⽤来开发多种类型的应⽤程序。包括Windows桌⾯应⽤程序、Web应⽤程序、移动应⽤程序、游戏等。VisualStudio提供了丰富的开发⼯具和功能,包括代码编辑器、调试器、⾃动完成、代码重构、版本控制等等。它⽀持多种编程语⾔,如:C++、C#、VisualBasic、F#、Python等。VisualStudio还可以与其他开发⼯具和服务集成,如Azure 云服务、GitHub、Jenkins等。
Visual Studio 具有以下⼀些主要特点:

  1. 多语⾔⽀持:VisualStudio⽀持多种编程语⾔,包括C++、C#、VisualBasic、F#、Python、
    JavaScript 等;
  2. 丰富的⼯具集:VS提供了各种开发⼯具,包括代码编辑器、调试器、代码分析⼯具等,以提⾼开
    发⼈员的效率;
  3. 可视化设计:VS提供了可视化的设计⼯具,如窗体设计器、WPF设计器等,使开发⼈员可以直观
    地设计⽤⼾界⾯;
  4. 跨平台开发:VS⽀持跨平台开发,可以开发适⽤于Windows、Linux和macOS等多个平台的应
    ⽤程序;
  5. 集成的调试器:VS集成了强⼤的调试器,可以进⾏代码的单步调试、断点调试等操作来帮助开发
    ⼈员查找和修复错误;
  6. 丰富的扩展性:VS可以通过安装扩展来扩展其功能,开发⼈员可以根据⾃⼰的需求选择并安装适
    合的扩展。

Eclipse: Eclipse 是著名的跨平台的⾃由集成开发环境(IDE)。最初主要⽤来Java语⾔开发,但是⽬前亦有⼈通过插件使其作为其他计算机语⾔⽐如C++和Python的开发⼯具。Eclipse的本⾝只是⼀个框架平台,但是众多插件的⽀持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发⾃⼰的IDE。Qt框架可以与Eclipse集成,使开发者可以使⽤Eclipse的强⼤功能来开发Qt应⽤程序。

QT下载安装

Qt下载官⽹:http://download.qt.io/archive/qt/
国内清华源: https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/

  1. 打开任意一个网站,进入如下界面:
    在这里插入图片描述
  2. 选择要下载的版本(推荐QT 5系列)
    在这里插入图片描述
  3. 找到下载的文件并双击运行,双击后会出现下面的界面:
    在这里插入图片描述
  4. 在选择安装路径的时候,不要出现中文,否则可能导致安装好了也无法正常使用;
    在这里插入图片描述
  5. 选择安装组件;这⾥我们安装的是QtCreator。如果电脑磁盘空间允许,建议全选以便后续使
    ⽤,如果空间不允许,请看第6步
    在这里插入图片描述
  6. 选择部分组件;说明:其他未安装的组件在使⽤时可以另⾏添加;
    在这里插入图片描述
    在这里插入图片描述
  7. 同意安装协议,然后无脑下一步.
  8. 双击打开QtCreator⼯具,并进⼊到"欢迎模式"下的"⽰例"界⾯;
    在这里插入图片描述
  9. 在"⽰例"中任选其中⼀个,单击打开该⽰例。在单击之后会弹出⼀个窗⼝,关闭即可;
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  10. 如果能构建并运⾏,说明安装⽆误。运⾏结果如下图在这里插入图片描述

QT环境变量配置:

  1. 找到Qt的安装路径,复制 “bin” 路径;
    在这里插入图片描述
  2. “此电脑”------> ⿏标右键,“属性”------>“⾼级系统设置”------> “环境变量”
    在这里插入图片描述
  3. “新建”------>填⼊"bin"路径------> “确定”;
    在这里插入图片描述
  4. 注意:在关掉所有窗⼝时,⼀定要点击"确定",否则上述配置⽆效

使用QT创建项目

  1. 打开QtCreator,在菜单栏中选中:“⽂件”--------> “新建⽂件或项⽬”;或者使⽤快捷键:Ctrl+
    n;或者直接点击:“new”;
    在这里插入图片描述
  2. 在欢迎模式下,直接点击New,如下图⽰:
    在这里插入图片描述
  3. 选择项⽬模板,弹出如下对话框:
    在这里插入图片描述
  4. 选择项⽬路径,给Qt项⽬命名及选择保存项⽬的路径;
    在这里插入图片描述
  5. 选择构建系统,选择Qt项⽬的构建系统,使⽤默认的"qmake" 即可
    在这里插入图片描述
  6. 填写类信息设置界⾯
    在这里插入图片描述
  7. 选择语⾔和翻译⽂件,点击"下⼀步"进⼊如下界⾯:此处选择的语⾔是"汉语",“英语"这样的语⾔.⽽不是"编程语⾔”
    在这里插入图片描述
  8. 选择Qt套件
    在这里插入图片描述
  9. 选择版本控制系统
    点击"下⼀步"进⼊项⽬管理界⾯;在项⽬管理界⾯可以设置作为⼦项⽬,以及加⼊版本控制系统管
    理。这两个功能暂时⽤不到,都⽤默认的,然后点击"完成"。
    在这里插入图片描述
  10. 最终效果
    在这里插入图片描述

QT 实现Hello World程序

使用按钮控件来实现

  1. 纯代码的方式:
    在这里插入图片描述
    最终实现效果:
    在这里插入图片描述
    2. 可视化操作实现:
    在这里插入图片描述
    在这里插入图片描述
    然后直接运行:
    在这里插入图片描述

使用标签控件来实现

  1. 纯代码方式实现:
    在这里插入图片描述
    实现效果:
    在这里插入图片描述
  1. **可视化操作实现: **
    在这里插入图片描述
    在这里插入图片描述
    最后运行效果:
    在这里插入图片描述

项目文件解析

widget.h

在这里插入图片描述

  1. 在QT中如果某个类想要使用信号与槽的机制,那么必须引入Q_OBJECT这个宏,并且要将这个宏写在这个类的前面,这时候QT编译器就允许这个类自定义信号和槽函数;
  2. Ui::Widget *ui;这个指针是在namespace Ui里的Widget类里面定义的,并且这个ui指针实际上是只想可视化设计的界面的,后面要访问这个可视化界面上的控件都是通过这个指针去访问的;

main.cpp

使用QT创建一个任意一个工程过后,main.cpp文件中都会自动生成以下代码:
在这里插入图片描述

  1. Qt系统提供的标准类名声明头⽂件没有.h后缀;
  2. Qt⼀个类对应⼀个头⽂件,类名就是头⽂件名;
  3. QApplication 为应⽤程序类;QApplicationa;(a为应⽤程序对象,有且仅有⼀个。)
    3.1 QApplication管理图形⽤⼾界⾯应⽤程序的控制流和主要设置。
    3.2 QApplication是Qt的整个后台管理的命脉。它包含主事件循环,在其中来⾃窗⼝系统和其它
    资源的所有事件处理和调度。它也处理应⽤程序的初始化和结束,并且提供对话管理。
    3.3 对于任何⼀个使⽤Qt的图形⽤⼾界⾯应⽤程序,都正好存在⼀个QApplication对象,⽽不论
    这个应⽤程序在同⼀时间内是不是有0、1、2或更多个窗⼝。
  4. Widget w; 实例化窗口对象
  5. w.show() 显示窗口对象,与之对应的w.close()隐藏窗口对象;
  6. a.exec() 程序进⼊消息循环,等待对⽤⼾输⼊进⾏响应。这⾥main()把控制权转交给Qt,Qt完
    成事件处理⼯作,当应⽤程序退出的时候exec()的值就会返回。在 exec()中,Qt 接受并处理⽤⼾
    和系统的事件并且把它们传递给适当的窗⼝部件。

widget.cpp

widget.cpp是Widget类的源码实现,所有窗口上要添加的的功能都在这个文件中添加:
在这里插入图片描述

widget.ui

widget.ui 是窗体界⾯定义⽂件,是⼀个XML⽂件,定义了窗⼝上的所有组件的属性设置、布局,及
其信号与槽函数的关联等。⽤UI设计器可视化设计的界⾯都由Qt⾃动解析,并以XML⽂件的形式保
存下来。在设计界⾯时,只需在UI设计器⾥进⾏可视化设计即可,⽽不⽤管widget.ui⽂件是怎么⽣
成的。

.pro文件

⼯程新建好之后,在⼯程⽬录列表中有⼀个后缀为".pro"的⽂件,".pro"⽂件就是⼯程⽂件(project)
,它是qmake ⾃动⽣成的⽤于⽣产 makefile 的配置⽂件。如图所⽰
在这里插入图片描述
双击进⼊该⽂件,该⽂件的核⼼内容如下:
QT +=coregui
// Qt 包含的模块
greaterThan(QT_MAJOR_VERSION, 4): QT+=widgets //⼤于Qt4版本才包含widget模块
TARGET=QtFirst
TEMPLATE=app
//应⽤程序名⽣成的.exe程序名称
//模板类型,应⽤程序模板
SOURCES+=main.cpp\ //源⽂件
widget.cpp
//源⽂件
HEADERS+=widget.h //头⽂件
“.pro” ⽂件的写法如下:

  1. 注释:从"#"开始,到这⼀⾏结束。
  2. QT +=coregui //Qt包含的模块 Qt5包含的模块如下图所⽰:

在这里插入图片描述

  1. greaterThan(QT_MAJOR_VERSION,4): QT+=widgets 这条语句的含义是,如果
    QT_MAJOR_VERSION ⼤于4也就是当前使⽤的Qt5及更⾼版本)需要增加widgets 模块。如果
    项⽬仅需⽀持Qt5,也可以直接
    添加"QT+=widgets"⼀句。不过为了保持代码兼容,最好还是按照QtCreator⽣成的语句编写。
  2. 指定⽣成的应⽤程序名:TARGET=QtDemo
  3. TEMPLATE=app//模板。告诉qmake为这个应⽤程序⽣成哪种makefile。下⾯是可供选择的模
    板:
    ⚫app:建⽴⼀个应⽤程序的makefile。这是默认值,所以如果模板没有被指定,这个将被使
    ⽤。
    ⚫lib:建⽴⼀个库的makefile。
    ⚫vcapp:建⽴⼀个应⽤程序的VisualStudio项⽬⽂件。
    ⚫vclib: 建⽴⼀个库的VisualStudio项⽬⽂件。
    ⚫subdirs:这是⼀个特殊的模板,它可以创建⼀个能够进⼊特定⽬录的makefile并且为它调⽤
    make的makefile。
  4. ⼯程中包含的源⽂件:SOURCES+=main.cpp/widget.cpp
  5. ⼯程中包含的头⽂件:HEADERS+=widget.h
  6. ⼯程中包含的资源⽂件:RESOURCES+=painter.qrc
  7. ⼯程中包含的"ui"设计⽂件:FORMS+=widget.ui
  8. 配置信息:CONFIG+=c++11(使⽤c++11的特性) CONFIG⽤来告诉qmake关于应⽤程序的配
    置信息

对象树

不知道有没有细心的读者发现,我们之前使用纯代码的方式分别用按钮控件和标签控件输出Hello World!的时候,控件对象都是我们new出来的:
在这里插入图片描述
我们似乎没有去手动释放他们,是不是造成了内存泄漏?
实际上是不会的!!!当我们关闭窗口过后,QT会自动的回收这些控件的空间!
这完全是因为我们的最后一步setPrent(),这一步操作就会将我们的对象挂在对象树中去,其中setParent()里面的参数,就是我们这个对象在对象树中的父节点;
当我们关闭窗口过后,QT实际上是会遍历这个对象树,然后分别回收每一个对象,也就是说,当我们将对象挂到对象树之后,我们就不必再关心这个对象的回收工作了,而完全交给了QT来自动回收!
实际上除了使用setParent()可以将我们的对象挂在对象树上面,还可以在对象构造的时候,给它传递父节点的指针,让其在构造的时候就完成对象树的挂载。eg:
在这里插入图片描述

具体说一说对象树:

  1. 当创建⼀个QObject对象时,会看到QObject的构造函数接收⼀个QObject指针作为参数,这
    个参数就是parent,也就是⽗对象指针
  2. 这相当于,在创建QObject对象时,可以提供⼀个其⽗对象,我们创建的这个QObject对象
    会⾃动添加到其⽗对象的children()列表
  3. 当⽗对象析构的时候,这个列表中的所有对象也会被析构。(注意,这⾥的⽗对象并不是继承
    意义上的⽗类!而是类似于二叉树中那样的父节点!!)

这种机制在GUI程序设计中相当有⽤。例如,⼀个按钮有⼀个QShortcut(快捷键)对象作为其
⼦对象。当删除按钮的时候,这个快捷键理应被删除。这是合理的。

  1. QWidget是能够在屏幕上显⽰的⼀切组件的⽗类
  1. QWidget继承⾃QObject,因此也继承了这种对象树关系。⼀个孩⼦⾃动地成为⽗组件的⼀
    个⼦组件。因此,它会显⽰在⽗组件的坐标系统中,被⽗组件的边界剪裁。例如,当⽤⼾关闭
    ⼀个对话框的时候,应⽤程序将其删除,那么,我们希望属于这个对话框的按钮、图标等应该
    ⼀起被删除。事实就是如此,因为这些都是对话框的⼦组件。
  2. 当然,我们也可以⾃⼰删除⼦对象,它们会⾃动从其⽗对象列表中删除。⽐如,当我们删除了
    ⼀个⼯具栏时,其所在的主窗⼝会⾃动将该⼯具栏从其⼦对象列表中删除,并且⾃动调整屏幕
    显⽰

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

  1. 当⼀个QObject对象在堆上创建的时候,Qt会同时为其创建⼀个对象树。不过,对象树中对象的
    顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。
  2. 任何对象树中的QObject对象delete的时候,如果这个对象有parent,则⾃动将其从parent的
    children() 列表中删除;如果有孩⼦,则⾃动delete每⼀个孩⼦。Qt保证没有QObject会被delete 两次,这是由析构顺序决定的。
    eg:在这里插入图片描述
    图中,我们在栈上创建了一个QLabel控件,然后我们也将这个控件挂载进了对象树,但是随着Widget()函数的作用域消失,label对象的生命周期也就到头了,编译器会自动回收label的空间,在回收的时候它会将label这个对象从它的父节点中移除,同时如果label对象存在孩子列表的话,那么它也会释放孩子列表中的对象,因此最终我们的对象树中就没有了label对象,那么最终对对象树中的节点进行回收的时候,就不回再回收到label对象,这也就是上面说的QT不回对一个对象进行多次回收!!!

注意:

  1. 我们最好不要在栈上创建控件,然后再挂载进目录树,因为栈上创建的对象生命周期随函数栈帧,当这个函数栈帧被销毁了,那么对象也会随之被回收,那么此时页面上也就不会显示对应的控件;
    在这里插入图片描述
    就比如这样,我们明明创建了QLabel控件,但是由于声明周期的作用,QLabel控件一瞬即逝,我们肉眼完全没反应过来的情况下就消失了,这不太好!因此我们强烈建议在堆上创建控件,然后挂载进对象树,让QT帮助我们完成回收工作;
  2. 如何验证我们将对象挂载进行对象树过后,QT会自动帮助我们完成回收工作?
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    之后我们需要定义一下MyTest这个类的析构函数:
    在这里插入图片描述
    之后,我们可以将我们的MyTest对象在堆上开辟,然后挂载进对象树,最后我们叉掉窗口,看看会不会打印MyTest的析构函数,打印了就说明QT真的会帮助我们回收堆空间,反之则不回:
    在这里插入图片描述
    运行结果如下:
    在这里插入图片描述
    通过实验我们发现,控制台输出了MyTest的析构函数,这说明QT实际上是真的会帮助我们回收堆空间,我们可以大胆的在堆空间上开辟控件!

QT 窗口坐标体系

坐标体系:以左上⻆为原点(0,0),X向右增加,Y向下增加
在这里插入图片描述

其中Widget对象表示整个窗口:
在这里插入图片描述
红色部分才表示Widget对象的真实部分,上面蓝色的条目是OS自动加的;
对于嵌套窗⼝,其坐标是相对于⽗窗⼝来说的。
eg:

一个QPushButton控件是挂载到Widget对象后面的,那么对于这个QPushButton控件的坐标原点就是Widget窗口的左上角顶点;
在这里插入图片描述

相关文章:

初识 QT

初始QT 什么是QTQT发展史QT支持的平台QT的优点QT的应用场景搭建QT开发环境QT的开发工具概述QT下载安装 使用QT创建项目QT 实现Hello World程序使用按钮控件来实现使用标签控件来实现 项目文件解析widget.hmain.cppwidget.cppwidget.ui.pro文件 对象树QT 窗口坐标体系 什么是QT …...

4. Django 探究FBV视图

4. 探究FBV视图 视图(Views)是Django的MTV架构模式的V部分, 主要负责处理用户请求和生成相应的响应内容, 然后在页面或其他类型文档中显示. 也可以理解为视图是MVC架构里面的C部分(控制器), 主要处理功能和业务上的逻辑. 我们习惯使用视图函数处理HTTP请求, 即在视图里定义def…...

二手车价格预测第十三名方案总结

代码开源链接:GitHub - wujiekd/Predicting-used-car-prices: 阿里天池与Datawhale联合举办二手车价格预测比赛:优胜奖方案代码总结 比赛介绍 赛题以二手车市场为背景,要求选手预测二手汽车的交易价格,这是一个典型的回归问题。…...

力扣刷题 二叉树层序遍历相关题目II

NO.116 填充每个节点的下一个右侧节点指针 给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针,…...

智能电网将科技拓展至工厂之外的领域

【摘要/前言】 物联网已然颠覆我们日常生活的许多层面。在家居方面,家电变成连网设备,不仅让我们能控制灯光与上网购物,甚至在出门时提供安全功能。在工业领域,智能工厂改变产品制造的方式。工业物联网(IIoT)不仅让制造商更加敏捷…...

单列模式1.0

单列模式 单例模式能保证某个类在程序中只存在唯⼀⼀份实例, ⽽不会创建出多个实例 1.饿汉模式 只要程序一启动就会立即创建出一个对象 class Signleton{private static Signleton instancenew Signleton();//防止在以后的代码中再创建对象,我们将构造方法private,…...

golang kafka sarama源码分析

一些理论 1.topic支持多分区,每个分区只能被组内的一个消费者消费,一个消费者可能消费多个分区的数据; 2.消费者组重平衡的分区策略,是由消费者自己决定的,具体是从消费者组中选一个作为leader进行分区方案分配&#…...

计算机组成原理【CO】Ch2 数据的表示和应用

文章目录 大纲2.1 数制与编码2.2 运算方法和运算电路2.3 浮点数的表示和运算 【※】带标志加法器OFSFZFCF计算机怎么区分有符号数无符号数? 【※】存储排列和数据类型转换数据类型大小数据类型转换 进位计数制进制转换2的次幂 各种码的基本特性无符号整数的表示和运算带符号整…...

dfs回溯 -- Leetcode46. 全排列

题目链接:46. 全排列 题目描述 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示…...

设计模式-接口隔离原则

基本介绍 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上先看一张图: 类A通过接口Interface1 依赖类B,类C通过接口Interface1 依赖类D,如果接口Interface1对于类A和类C来说不是最小接口,那么类…...

BD202311夏日漫步(最少步数,BFS或者 Dijstra)

本题链接:码蹄集 题目: 夏日夜晚,小度看着庭院中长长的走廊,萌发出想要在上面散步的欲望,小度注意到月光透过树荫落在地砖上,并且由于树荫的遮蔽度不通,所以月光的亮度不同,为了直…...

React - 你知道props和state之间深层次的区别吗

难度级别:初级及以上 提问概率:60% 如果把React组件看做一个函数的话,props更像是外部传入的参数,而state更像是函数内部定义的变量。那么他们还有哪些更深层次的区别呢,我们来看一下。 首先说props,他是组件外部传入的参数,我们知道…...

mysql 查询实战-变量方式-解答

对mysql 查询实战-变量方式-题目,进行一个解答。(先看题,先做,再看解答) 1、查询表中⾄少连续三次的数字 1,处理思路 要计算连续出现的数字,加个前置变量,记录上一个的值&#xff0c…...

SpringBoot3配置SpringSecurity6

访问1:localhost:8080/security,返回:需要先认证才能访问(说明没有权限) 访问2:localhost:8080/anonymous,返回:anonymous(说明正常访问) 相关文件如下&…...

Unity之Unity面试题(三)

内容将会持续更新,有错误的地方欢迎指正,谢谢! Unity之Unity面试题(三) TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取…...

Linux命令-dos2unix命令(将DOS格式文本文件转换成Unix格式)

说明 dos2unix命令 用来将DOS格式的文本文件转换成UNIX格式的(DOS/MAC to UNIX text file format converter)。DOS下的文本文件是以 \r\n 作为断行标志的,表示成十六进制就是0D0A。而Unix下的文本文件是以\n作为断行标志的,表示成…...

企业怎么做数据分析

数据分析在当今信息化时代扮演着至关重要的角色。能够准确地收集、分析和利用数据,对企业的决策和发展都具有重要意义。数聚将介绍企业如何合理地利用数据分析,如何协助企业在竞争激烈的市场中取得优势。 一、建立完善的数据收集系统 在进行数据分析之…...

1111111111

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行&am…...

[面向对象] 单例模式与工厂模式

单例模式 是一种创建模式,保证一个类只有一个实例,且提供访问实例的全局节点。 工厂模式 面向对象其中的三大原则: 单一职责:一个类只有一个职责(Game类负责什么时候创建英雄机,而不需要知道创建英雄机要…...

《前端防坑》- JS基础 - 你觉得typeof nullValue === null 么?

问题 JS原始类型有6种Undefined, Null, Number, String, Boolean, Symbol共6种。 在对原始类型使用typeof进行判断时, typeof stringValue string typeof numberValue number 如果一个变量(nullValue)的值为null,那么typeof nullValue "?" const u …...

【项目实战经验】DataKit迁移MySQL到openGauss(下)

上一篇我们分享了安装、设置、链接、启动等步骤,本篇我们将继续分享迁移、启动~ 目录 9. 离线迁移 9.1. 迁移插件安装 中断安装,比如 kill 掉java进程(安装失败也要等待300s) 下载安装包准备上传 缺少mysqlclient lib包 mysq…...

AI预测体彩排3第2弹【2024年4月13日预测--第1套算法开始计算第2次测试】

各位小伙伴,今天实在抱歉,周末回了趟老家,回来比较晚了,数据今天上午跑完后就回老家了,晚上8点多才回来,赶紧把预测结果发出来吧,虽然有点晚了,但是咱们前面说过了,目前的…...

【13137】质量管理(一)2024年4月串讲题组一

目录 1.选择题 2.多选题 3.简答题 4.论述题 5.计算题 6.论述题 【13137】质量管理-速 记 宝 典【全国通用】</...

Go语言中工作负载类型对并发的影响

在实际工作开发中我们需要根据工作负载是CPU密集型还是I/O密集型,使用不同的方式来解决问题。下面我们先来看这些概念,然后再讨论其影响。 在程序执行时,工作负载的执行时间会受以下因素限制: CPU的速度--例如,运行归并排序算法。工作负载被称为CPU密集型。I/O速度--例如…...

常用的Python内置函数

目录 1. getattr() 函数: 2. setattr() 函数: 3. id():返回对象的唯一标识符(内存地址)。 4. type():返回对象的类型。 5. isinstance(obj, classinfo):判断对象是否是某种类型或其子类的实例。 6. issubclass(class1, class2):判断一个类是否是另一个类的子类。 …...

MAC(M1芯片)编译Java项目慢且发热严重问题解决方案

目录 一、背景二、排查三、解决四、效果以及结果展示五、总结 一、背景 使用idea编译项目等操作&#xff0c;经常性发热严重&#xff0c;并且时间慢。直到昨天编译一个项目用时30分钟&#xff0c;电脑温度很高&#xff0c;并且有烧灼的味道&#xff0c;于是有了此篇文章。 二、…...

如何循环pandas格式的数据

如何循环pandas格式的数据 要循环处理 Pandas 格式的数据&#xff0c;可以使用 iterrows() 方法或者 iteritems() 方法。 iterrows() 方法&#xff1a; import pandas as pd# 假设 df 是你的 Pandas DataFrame for index, row in df.iterrows():# 在这里处理每一行的数据&am…...

新零售SaaS架构:客户管理系统架构设计(万字图文总结)

什么是客户管理系统&#xff1f; 客户管理系统&#xff0c;也称为CRM&#xff08;Customer Relationship Management&#xff09;&#xff0c;主要目标是建立、发展和维护好客户关系。 CRM系统围绕客户全生命周期的管理&#xff0c;吸引和留存客户&#xff0c;实现缩短销售周…...

Apache Spark

Apache Spark是一种开源的分布式计算系统&#xff0c;主要用于大数据处理和分析。Spark提供了一个高效的计算引擎&#xff0c;可以在分布式环境中处理大规模数据集。它支持多种编程语言&#xff0c;包括Scala、Java、Python和R。 Spark的核心概念是弹性分布式数据集&#xff0…...

CentOS7编译ZLMediaKit并使能WebRTC

使能WebRTC需要libsrtp库, libsrtp库需要openssl, 所以第一步先安装openssl, 系统自带的版本是1.0.2的, libsrtp需要1.1.1以上版本, 需要使用源码进行编译; GCC准备 需要安装gcc7以上版本, 并切换到gcc7的编译环境 yum install centos-release-scl yum install devtoolset-7…...

网站建设需求确认书/seo外链建设的方法有

译自&#xff1a;How Can The Checkpoints In The Extract Checkpoint File Be Changed? (文档 ID 964684.1)问题&#xff1a; 如何改变抽取进程检查点文件中的检查点&#xff1f; 解决概览&#xff1a; 抽取进程的检查点可以通过拷贝然后在新的检查点文件中改变检查点值来改变…...

国企门户网站建设情况汇报/公司个人怎么做网络推广

分层组织计算机存储系统由高层到低层分别名之寄存器堆、高速缓存(cache)、主存(main memory)和外存(secondary memory)。那么为什么记忆系统要层次化呢?如果答案是效率&#xff0c;那么提效的原理又是什么呢?如果原理是传说中的局部性原理(principle of locality)&#xff0c…...

做移门图的 网站有哪些/seo北京公司

概要 电影文件有很多基本的组成部分。首先&#xff0c;文件本身被称为容器Container&#xff0c;容器的类型决定了信息被存放在文件中的位置。AVI和Quicktime就是容器的例子。接着&#xff0c;你有一组流&#xff0c;例如&#xff0c;你经常有的是一个音频流和一个视频流。&…...

网络工程就业前景分析/seo站长综合查询

有时候&#xff0c;去便利店买几块钱的东西&#xff0c;但没有零钱&#xff0c;只能给他们一张100的&#xff0c;他们可能找给我一沓10块的和几枚硬币。我不喜欢这么多的零钱&#xff0c;要知道&#xff0c;钱越零散&#xff0c;散失地就越快&#xff0c;我希望找给我的零钱张数…...

wordpress 绿色公益主题/长沙seo网站排名

2019独角兽企业重金招聘Python工程师标准>>> 版权声明&#xff1a;本文由李斯达 原创文章&#xff0c;转载请注明出处: 文章原文链接&#xff1a;https://www.qcloud.com/community/article/97264001482830465 来源&#xff1a;腾云阁 https://www.qcloud.com/com…...

wordpress 新建侧边栏/seo自学网站

中国目前正处于由熟人社会向陌生人社会转型的阶段&#xff0c;陌生人社会带来的孤独和挫折以及文化心理的惯性&#xff0c;让中国人对人情和关系的依赖依然存在&#xff0c;凭借熟人关系开展工作&#xff0c;运用人情关系的法则对抗社会制度和规范的现象依然很普遍。   人情、…...