C++Qt 入门

news2024/12/28 19:59:10

目录

Qt 是什么

Qt 与 Qt Creator 的关系

暗黑主题音乐播放器界面 UI 设计。

简约的视频界面设计。

 炫酷车载音乐 APP 主界面开发。

Qt/C++与 QML  

如何选择 Qt 版本

Linux 下安装 Qt  

 配置中文输入法

Qt Creator 简单使用

 第一个 Qt 程序

新建一个项目

​编辑 项目文件介绍

项目文件*.pro

样式文件*.ui

头文件*.h

源文件*.cpp


Qt 是什么

Qt 是一个跨平台的 C++ 开发库。主要用来开发图形用户界面( Graphical User Interface ,简
GUI )程序。
Qt 虽然经常被当做一个 GUI 库,用来开发图形界面应用程序,但这并不是 Qt 的全部;
Qt 除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多其它功能,比如多线程、
访问数据库、图像处理、音频视频处理、网络通信、文件操作等,这些 Qt 都已经内置了。
Qt 还存在 Python Ruby Perl 等脚本语言的绑定, 也就是说可以使用脚本语言开发基
Qt 的程序。开源社区就是这样,好东西就会被派生扩展,到处使用,越来越壮大。
Qt 支持的操作系统有很多,例如通用操作系统 Windows Linux Unix ,智能手机系统
Android iOS WinPhone , 嵌入式系统 QNX VxWorks 等等。
简单的来说, Qt 可以做很多东西,好比如 Windows 下的软件也有很多是 Qt 开发的,这里
我很喜欢它的一个特性就是跨平台使用,“跨平台”代表一份代码可以无需任何修改或者小修改
就可以在其他平台上运行。

Qt Qt Creator 的关系

Qt 能做什么
Qt 能做什么?理论上来说,您能想到的 App Qt 它都基本能做。像 WPS 这种大型的桌面
应用, Maya(3D 建模 ) ,一些游戏的内核都可以使用 Qt 来实现。甚至您能快速使用 Qt 来开发一
款像酷狗,网易云音乐这样的音乐播放器。在嵌入式里,使用 Qt 来开发界面已经是无可替代的
一种趋势。工控界面最常用,一些移动端的界面也开始使用 Qt 。像点菜机,温度采集数据显示,
汽车仪表,速度显示界面等。 Qt 能做优美的界面,所以推出了 QML (一种描述性的语言)。每
Qt 更新都有在 Quick QML 使用的模块)上优化或者添加功能,看来 Qt 打算在移动设备端
的开发市场端进军!呵呵,其实 Qt 早已经在这块发展了!
下面是本书开发的一些界面小例子,请欣赏。要想开发好的界面关键是要有想法。可以说
如果您是做界面其实大多数时间花在美化界面上,功能都是比较容易实现的。最好读者需要有
一定的美工基础,例如会基本的 PS ,在开发过程中就不用去麻烦公司的美工了,开发界面和程
序一起做。

暗黑主题音乐播放器界面 UI 设计。

简约的视频界面设计。

 炫酷车载音乐 APP 主界面开发。

 

Qt/C++QML  

QML Qt C++ 基础上拓展的。也就是说 Qt C++ 上所使用界面的类,基本都是可以拓展到
QML 上。如果不能拓展的,也可以直接 QML C++ 一起使用。实际上 Qt C++ 效率更高。所
以本教程都是 Qt C++ 为基础做教程入门教程, QML 可以说是一个加分项。 Qt QML 模块提供
QML 语言开发应用程序和库提供了一个框架。 QML 本身不涉及显示部分的内容,所以 Qt Quick
模块充当了这部分的作用。至于他们三者的关系,我们就这样简单的了解一下就行了。
Qt C++ 在底层编写功能更突出,若要做好看的界面且功能强大, Qt C++ QML 语言结合
是必不可少的。 QML 语言负责界面层,而底层调用 Qt C++ 。比如文件的读写、图像处理、多
线程通信等这些都是需要 C++ 来编写完成的。
在目前来说, Qt C++ 更成熟, QML 目前也比较成熟了,因为每次更新版本 QML 也有更新。
不过在低版本的 Qt (如 Qt5.6 以下), QML 还不够成熟, QML 在高版本的 Qt (如 Qt5.7 以上)
更成熟。 C++ 依旧是 Qt 的主要编程语言, Qt 5 也并没有忽略它, Qt 5 添加了很多新的 C++ API
而且会持续更新。引入 QML 应该是 Qt 向移动端市场的一个突破,还有 python javascript
可以在 Qt 里用。
说了 C++ 又说 QML ,但是 Qt 基础教程还是主打 Qt C++ ,有了基础学 Qt 里其他的东西就
不难!

如何选择 Qt 版本

初学者应该要如何选择 Qt 的版本?截至 2020 年最新的 Qt5 版本是 Qt5.15 。可以参考这个
网址 https://doc.qt.io/qt-5/qt5-intro.html 来看看各个 Qt 版本的更新说明。 Qt6 已经出了,我们有
必要直接上最新版本的 Qt6 吗?不! Qt6 理论上与 Qt5 能兼容,但是许多公司在用 Qt5 甚至 Qt
4 。学习了 Qt5 Qt6 等稳定版本出来,等市场上用的多,我们用 Qt6 才是最明智的选择,新出
的事物往往要有一定的时间去适应!我们主要是简单对整个 Qt 版本说明一下。首先, Qt 版本
的升级肯定是对上一版本进行优化。比如 Qt4 Qt5 的的语法区别, Qt5 的信号槽写法与 Qt4
的信号槽写法有区别。除了 Qt5.10 以上的版本, Qt5.6 Qt5.9 Qt 长期支持的版本 LTS Lo
ng Term Support ,简称 LTS )。但是 2020 3 月最近 Qt 官方将 Q5.2~Qt5.8 Qt5.11 归档到 htt
p://download.qt.io/new_archive/qt/ 。所以很多小伙伴们想用老版本的 Qt 要到上面这个链接去下
载了。毕竟有些时候我们开发板程序处于某个 Qt 版本下开发的,如果要迁移到新版本的 Qt
能还要考虑到兼容问题!不过变化不会很大的,请放心!

 

下面贴出 Qt 官方下载链接 http://download.qt.io/archive/qt/ 。我们直接进入这个链接可以看
到下图。下图和上图加起来才是 Qt 的完整版本。那么多版本任君选择。还可以看到 Qt 版本在
不断的更新,更多的功能将会注入到 Qt 这个 GUI 库里,使我们开发变得更简单和有趣!
理论上我们选择 Qt 的版本越新越好,这是当然的,不过我们还是要确定一个版本是必须的,
因为日后写好的程序要长期运行在一个确定的版本里,避免随意升级带来其他兼容性问题,或
者重复重复移植等工作。

Linux 下安装 Qt  

同样地,进入 http://download.qt.io/archive/qt/5.12/5.12.9/ 下载页面(注意如果找不到下载链
接,我们就进行 http://download.qt.io 这个顶层目录一个个目录找,因为 Qt 下载链接会变动),
选择 Linux 的安装包下载。使用迅雷下载再拷贝过去 Ubuntu 虚拟机或者直接复制链接地址到
Ubuntu 虚拟机下载。
如 下 图 , 复 制 链 接 下 载 地 址 到 Ubuntu 虚 拟 机 终 端 下 使 用 指 令 wget 下载,
http://download.qt.io/archive/qt/5.12/5.12.9/qt-opensource-linux-x64-5.12.9.run
wget http://download.qt.io/archive/qt/5.12/5.12.9/qt-opensource-linux-x64-5.12.9.run

 

一般我们用第二种方法通过Windows下载用ftp软件传入到ubantu里面 

赋予可执行权限,加上 sudo 权限进入安装,这样会安装在/opt 目录下。
chmod +x qt-opensource-linux-x64-5.12.9.run
sudo ./qt-opensource-linux-x64-5.12.9.run

执行安装指令后,将会弹出 Qt 的安装界面。

安装完成,在左下角应用程序中心找到 Qt Creator,点击打开 Qt Creator

 

打开 Qt Creator 的界面如下,安装完成。

 配置 Qt Creator 输入中文

配置 Ubuntu 中文环境
Ubuntu 的默认安装环境是使用的语言是英文,很多同学不习惯。现在我们将 Ubuntu 的系
统语言设置成中文。在 Ubuntu 右上角,点击设置图标如下图第①步。

 

按如下图设置,点击( install/Remove Languages … )安装或者移除语言,在安装语言处选
择简体中文,点击 Apply 应用即可。

 

配置完成后,点击重启(或者注销 Ubuntu ),重启后,因为我们已经更新了系统的语言,
Ubuntu 询问我们需不需要将系统文件夹的名称也改成中文。这里作者选择否,保留旧的名称。
保留旧的名称有一定的好处,就是我们进入这些访目录时,直接使用英文,不用切换到中文输
入法。严格来说,最好是统一用英文环境开发了。这里为了初学者或者有强迫中文者,所以我
们这里需要配置中文的环境,及后期开发 Qt 需要写中文注释,方便理解与给后人看。

 

 配置中文输入法

在上面我们已经配置好中文环境,并有拼音输入法 ibus ,但 ibus 并不好用, Qt Creator
支持 ibus 输入中文。好的生产工具决定好的生产力,下面我们介绍一下 Fcitx 输入法。
Fcitx (Flexible Input Method Framework) ──即小企鹅输入法,它是一个以 GPL 方式发布
的输入法平台,可以通过安装引擎支持多种输入法,支持简入繁出,是在 Linux 操作系统中常
用的中文输入法。它的优点是:短小精悍、跟程序的兼容性比较好。
Fcitx 内置的输入法支持中文 拼音 和基于字符表的输入 ( 例如五笔 ) ,根据语言的不同,有
不同的输入法引擎可以选择。
Fcitx 支持的拼音输入法中,内置拼音响应速度最快。 Fcitx 同样支持流行的第三方拼
音输入法以提供更好的整句输入效果 .
fcitx-sunpinyin 在输入速度和输入精度之间有较好的平衡。
fcitx-libpinyin 算法比 sunpinyin 先进。
fcitx-rime, 即著名中文输入法 Rime IME Fcitx 版本。但它不支持 Fcitx 本身的 # 特殊符
号和 # 快速输入功能,自定义设置请参见官方( http://rime.im/ )。
fcitx-googlepinyin, Google 拼音输入法 for Android.
fcitx-sogoupinyin AUR ,) 搜狗输入法 for linux —支持全拼、简拼、模糊音、云输入、皮
肤、中英混输入。官方网址( http://pinyin.sogou.com/linux/ )。
fcitx-cloudpinyin 可以提供云拼音输入的支持,支持 Fcitx 下的所有拼音输入法, Fcitx-rime
除外。
fcitx-chewing Fcitx 添加 chewing ( 繁体中文注音 ) 输入引擎支持。依赖 libchewing
fcitx-table-extra adds Cangjie Zhengma Boshiamy support
sudo apt-get install fcitx-sunpinyin
// 拼音输入法请装 sunpinyin 或者 fcitx-googlepinyin

也可以安装搜狗或者系统自带的 记得配置fcitx就行 

再到右上角点击系统设置,找到语言支持,将键盘输入方式系统点击下拉复选框选择为 fcitx
然后点击应用到整个系统,再关闭。如下图步骤

 为了确保刚配置的环境生效,完成以上步骤后重启 Ubuntu 系统。

Qt Creator 简单使用

Qt Creator 界面组成
启动 Qt Creator 后, Qt Creator 的主界面如下图,默认打开的是欢迎页面。可以看到 Qt Creator
里自带很多示例。在 Ubuntu 里,由于 Qt Creator 安装在 /opt 目录下,这个目录普通用户是没有
权限写的,只能够读。如果要打开示例先点击后选择“复制项目并打开”。作者比较喜欢 Qt Creator
界面设计的。十分简洁,还自带示例,不会写也会参考!最重要的是 Qt Creator 左侧栏 的“帮
助”按钮,有很多使用说明,总结的非常好,对学习 Qt 的类有很大帮助,如果学习到某个方法
或者类不会用,可以打开这个“帮助”来搜索这个类或者方法的用法。没有任何一本教程能有
Qt 帮助文档这么详细了,可惜是英文的,初学者学起来还是会一定难度。多多参考这个 Qt
助文档,因为那里能学到很多,例子说明也特别多,每个方法、类、信号与槽等都有详细的解
单击 顶部 工具栏的“帮助”菜单,点击“ UI Tour ”会出现介绍 Qt Creator 各组件的说明。
这个大家一定要看看,虽然是英文的说明,但是大体有个了解。这里就不再截图说明了。后面
编写第一个 Qt 程序也会说明整个项目编写及编译运行的流程。界面组成我们只需要了解这么多。

 第一个 Qt 程序

hello world ”的起源要追溯到 1972 年,贝尔实验室著名研究员 Brian Kernighan 在撰写
B 语言教程与指导 (Tutorial Introduction to the Language B) ”时初次使用(程序),这是目前已
知最早的在计算机著作中将 hello world 一起使用的记录。第一个程序都是以“ hello,world
作为默认的第一个程序,我们延续这种经典的做法吧,感受程序的伟大。同时可以让我们初步
了解 Qt 项目搭建的基础流程。

新建一个项目

Ubuntu18 里打开 Qt Creator ,也就是左下角软件中心处点击后,找到 Qt Creator 的图标
后点击打开。单击文件 Qt Creator 的文件,选择新建文件或者项目。注意有快捷键 Ctrl + N 。直
接在 Qt Creator 激活状态和英文状态的输入法下使用“ Ctrl + N ”也可以快速打开新建项目。

 

 

弹出的新建项目如下图,这里我们可以看到有很多模板(包括项目模板和文件和类模板)
可以使用,包括 Qt Qt Quick Qt for Python C++ 等等。作为初学者我们选择第一个
Application(Qt) Qt Widgets Application ,所谓的模板就是 Qt 为了方便开发程序,在新建工程
时可以让用户基于一种模板来编写程序,包括 cpp 文件, ui 文件都已经快速的创建,而不用用
户手动创建这些文件。这样对用户的开发带来极大的便捷。当然用户可以可以自己手动创建项
目,一个一个往里面加也是可以的。但是初学者不建议这么做,我们的目的是先体验一遍项目
搭建的流程,等日后有空再自己回头尝试这么做吧!

 

如果您的输入法现在处于中文输入法,先按 Ctrl 再按 Space (空格)切换成英文输入法,
在名称处输入项目为“ 01_hello_world ”,这里的项目路径为笔者个人的家目录路径下的 Qt 目录
下,勾选设为默认的项目路径,这样以后做项目实验时都是默认选择这个目录作为项目路径而
不用自己手动选择路径了。选择下一步。

 

默认已经是选择 qmake 编译,主要用 qmake 生成 Makefile 用于项目的编译。点击下一步即
可。
这里默认选择的基类为 QMainWindow 。在 Base class 一项中我们还可以看到还有 QWidget
QWialog 这样的基类可以选择。在 C++ 篇我们已经学习什么叫基类,简单的来说,我们创建
的这个项目是基于 QMainWindow 类去开发的。默认勾选“ Generate form ”,意思是生成 ui 窗体
文件 mainwindow.ui 。为了学习方便,我们统一默认基类为 QMainWindow ,但是注意,在嵌入
式里一般不需要标题栏,状态栏等,所以常用的是 QWidget 基类。

 

  • QMainWindow:主窗口类,主窗口具有主菜单栏、工具栏和状态栏。类似于一般的应用程序的主窗口。如果您想做个嵌套的窗口程序开发的软件,不妨选择这个 QMainWindow
  • QWidget:是可视界面类的基类,也就是说QMainWindow类也是由QWidget继承封装而来。 所以 QWidget 要比 QMainWindow 功能少一些。
  • QDialog:对话框类,建立一个对话框界面。比较少使用此项作为基类。一般以 QMainWindow QWidget 作为基类的居多。注因为 QWidget 不带窗口标题栏等,嵌入式里最好 QWidget

 

在高版本的 Qt Creator 里,有 Translation 这一项, Qt 提供了一个( .ts )的文件给您, .ts
可读的翻译文件,使用简单的 XML 格式。我们暂时只需要知道这个东西是个可读的翻译文件
即可。极少需要使用到。点击下一步。

 。。。。,一键点下一步就行

新建的“01_hello_world”项目如下。

 项目文件介绍

 其中,左侧有上下两个子窗口,上面的窗口显示了项目的文件结构,显示当前的项目为

01_hello_world ”,细心的还会发现“ 01_hello_world ”是用粗体黑色标明。说明此项目是活动
项目,活动项目的项目根节点都是用粗体字体表示的。如果打开了多个项目,那么我们只需要
观察哪个是加粗的项目名就表示当前活动项目。
Qt Creator 和其他 IDE 开发软件一样。都是分组管理项目内的各种源文件,下面是项目内
的文件简介。
  • 01_hello_world.pro 是项目管理文件,这个项目管理文件十分重要,当您加入了文件或者删除了文件,Qt Creator 会自动修改这个*.pro 文件。有时候需要打开这个*.pro 文件添加我们的设置项。
  • Header 分组,这个节点下存放的是项目内所有的头文件*.h
  • Source 分组,这个节点下存放的是项目内的所有 C++源码文件*.cpp
  • Forms 分组,这个节点下是存放项目内所有界面文件*.ui*.ui 文件由 XML 语言描述组成, 编译时会生成相应的 cpp 文件,这样交叉编译器就可以编译它了。

项目文件*.pro

01_hello_world.pro 文件如下所示。此 pro 文件在高版本的 Qt 与低版本的 Qt 文件有些区别,
且在 Windows Linux 系统下生成的 pro 也有些区别,但是变化不大。
01_hello_world.pro 文件内容
QT       += core gui
//添加了 Qt 的支持的模块,core 与 gui 库是 Qt 的默认设置。
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
//比较 Qt5 版本,如果是 Qt5 版本,在 main.cpp 中 application 是在 QtWidgets 中的,
因此要包含这个库。
CONFIG += c++11
//分别配置的是使用 c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
//添加 QT_DEPRECATED_WARNINGS 定义。
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
//SOURCES 下的是源文件。
SOURCES += \
    main.cpp \
    mywidget.cpp \
    widget.cpp
//HEADERS 下是头文件。
HEADERS += \
    mywidget.h \
    widget.h  //FORMS 下是 ui 界面文件。

# Default rules for deployment.//部署默认的规则。
qnx: target.path = /tmp/$${TARGET}/bin //qnx:判断是不是 qnx 操作系统,赋值 
else: unix:!android: target.path = /opt/$${TARGET}/bin target.path = /temp/$${TARGET}/bin。
//如果是 unix 系统但不是安卓,赋值 target.path = /opt/$${TARGET}/bin。
!isEmpty(target.path): INSTALLS += target//如果 target.path 为空目录,赋值 INSTALLS += target。
如果需要修改生成目标的可执行程序名字,可赋值 TARGET = xxx。否则 TARGET 将默认
取值为项目的名字。

样式文件*.ui

mainwindow.ui 是一个 xml 类型的文件,它的 xml 内容如下。这个文件是生成的不能手动
编辑。只能够通过图形界面修改其属性。
双击 mainwindow.ui 后可以跳转到设计界面,如下图。下面主要介绍主体部分。
1. ①是控件栏,有各种各样的控件,上方的 Filter 是过滤器,输入首写字母就可以快速定到
我们想要找的控件。
2. ②显示的是我们的窗口程序了,上面已经带有 MainWindow 对象及其几个子对象,默认
MainWindow 就带有菜单栏和状态栏。
3. ③是对象栏,②处用到的对象都在③处显示。
4. ④是属性栏,点击③处对象栏的某个对象,就可以在④属性栏里编辑它的属性了。属性项
有很多,包括位置,大小,文字,颜色,字体等等。

头文件*.h

 

点击左边栏的编辑,回到项目的编辑工作窗口。点击项目下的 Headers 下的 mainwindow.h
mainwindow.h 一般有与之对应的一个 cpp 文件叫 mianwindow.cpp 。其中 mainwindow.h 包含类
的声明, mianwindow.cpp 包含类的实现。这与我们前面学习的 c++ 是一样的。
mainwindow.h 的内容如下。
mianwindow.h 定义如下
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include <QMainWindow>
5
6 QT_BEGIN_NAMESPACE
7 namespace Ui { class MainWindow; }
8 QT_END_NAMESPACE
9
10 class MainWindow : public QMainWindow
11 {
12 Q_OBJECT
13
14 public:
15 MainWindow(QWidget *parent = nullptr);
16 ~MainWindow();
17
18 private:
19 Ui::MainWindow *ui;
20 };
21 #endif // MAINWINDOW_
7 行,定义名称空间 Ui ,里面有一个类 MainWindow ,这个 MainWindow 和第 10 行里
MainWindow 不是同一个对象。实际上,这个文件里的 MainWindow 类有一个成员 *ui 就是
指向第 19 行的 Ui::MainWindow 的指针。这都是为了使用 .ui 文件设计界面的。
12 行, MainWindow 的声明中第一行是 Q_OBJECT ,这是一个宏,由 Qt 进行处理,这
也是 Qt 针对 C++ 扩展的地方,所有用到信号的类都要加这个宏。

源文件*.cpp

点击项目下的 Sources 下的 mainwindow.cpp 。可以看到它的内容如下。
1 #include "mainwindow.h"
2 #include "ui_mainwindow.h"
3
4 MainWindow::MainWindow(QWidget *parent)
5 : QMainWindow(parent)
6 , ui(new Ui::MainWindow)
7 {
8 ui->setupUi(this);
9 }
10
11 MainWindow::~MainWindow()
12 {
13 delete ui;
14 }
2 行, MainWindow 的实现类中,第 2 include 了一个文件 ui_mainwindow.h 这个文件
Qt 根据 .ui 文件自动生成的,也就是说 ui_mainwindow.h 要点击编构建后才生成,我们才能看
到这个文件。构建 / 编译后可以在 debug/release 的目录找到这个文件。
6 行,在 MainWindow 构造函数中用“ , ”隔开, new 一个 Ui 中的 MainWindow 。这里
是一种初始化成员的方法。
8 行, ui->setupUi(this); 这句话是进行界面初始化,将 this (指的是 MainWindow 类的本
身),作为参数传到 setupUi 里, ui 界面文件的对象会以 this 为父对象,所有子对象都将显示在
MainWindow 里。我们要想使用 ui 里的对象,必须将代码写在 ui->setupUi(this) 这句话之后,因
ui->setupUi(this) 会先初始化里面的对象,只有初始化里面的对象我们才能使用这个对象。
13 行,析构函数里 delete ui 。在 Qt 里我们需要在析构函数里 delete 的对象一般是 new
创建的并且没有父对象的对象。
小提示: this 在成员函数的开始执行前构造的,在成员的执行结束后清除。
点击项目下的 Sources 下的 main.cpp 。可以看到它的内容如下。
1 #include "mainwindow.h"
2
3 #include <QApplication>
4
5 int main(int argc, char *argv[])
6 {
7 QApplication a(argc, argv);
8 MainWindow w;
9 w.show();
10 return a.exec();
11 }
3 行,包含 QApplication 类的定义。在每一个使用 Qt 的应用程序中都必须使用一个
QApplication 对象。 QApplication 管理了各种各样的应用程序的广泛资源,比如默认的字体和光
标。
5 行, main() 函数是程序的入口。几乎在使用 Qt 的所有情况下, main() 只需要在把控制
转交给 Qt 库之前执行一些初始化,然后 Qt 库通过事件来向程序告知用户的行为。 argc 是命令
行变量的数量, argv 是命令行变量的数组。
7 行, a 是这个程序的 QApplication 。它在这里被创建并且处理这些命令行变量。
8 行,创建一个对象 w ,这个对象就是 MainWindow
9 行,调用方法 show() 。这样程序界面才能显示。
10 行,这里就是 main() 把控制转交给 Qt ,并且当应用程序退出的时候 exec() 就会返回。
exec() 中, Qt 接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java JDBC

目录 JDBC定义 为什么需要JDBC JDBC的工作原理 JDBC API JDBC编程模板 JDBC编程步骤 JDBC实战 1.JDBC定义 Java连接数据库的一种能力或是技术 2.为什么需要JDBC 总结&#xff1a;利用JDBC才可以使服务器端和数据库进行数据的传递和交互 场景1&#xff1a; 客户端&am…

chatgpt赋能python:Python选择排序算法图解

Python选择排序算法图解 选择排序是计算机科学中经典的排序算法之一&#xff0c;它的原理是从待排序的数据中选择最小的元素然后排在最前面&#xff0c;接着从剩下未排序的数据中继续这个过程&#xff0c;直到所有的数据都排好序。 在本篇文章中&#xff0c;我将深入探讨Pyth…

微服务架构之网关详解

前言 由于互联网的高速发展&#xff0c;网络数据请求数激增&#xff0c;使得服务器承受的压力越来越大。在早期的系统架构中&#xff0c;为减轻单台服务器的压力&#xff0c;通常使用 Load Balancer 来将网络流量平摊到多个服务器中。如今后端服务的种类和数量在不断变多&…

Django DRF - 【Token】认证基本使用

一. 前言 Django Rest Framework Token是Django Rest Framework中的一个扩展&#xff0c;用于实现用户认证和授权。它为每个用户生成一个唯一的Token&#xff0c;并将其存储在数据库中。在用户进行API请求时&#xff0c;用户需要在请求的HTTP Header中包含Token&#xff0c;这…

【广州华锐互动】机械设备事故VR模拟体验系统

随着虚拟现实技术的不断发展&#xff0c;越来越多的行业开始尝试将VR技术应用到实际场景中&#xff0c;以提供更加真实的体验。其中&#xff0c;机械伤害事故VR警示教育系统的出现&#xff0c;为机械工程师、安全培训人员等行业提供了一种全新的培训方式。在实现上&#xff0c;…

odoo16 中ondelete的用法

odoo 中的many2one类型字段有 ondelete设置&#xff0c;对应数据表中关系处理 a fields.Many2one(‘b’, string‘b’, ondelete‘set null’) 则当对模型b进行delete操作时&#xff0c;会引发如下操作 set null: 当b中删除记录时&#xff0c;modelA中相关记录的anull casc…

Redis实战案例8-缓存击穿及其解决方案和案例说明

1. 缓存击穿 缓存击穿是指一个被频繁访问&#xff08;高并发访问并且缓存重建业务较复杂&#xff09;的缓存键因为过期失效&#xff0c;同时又有大量并发请求访问此键&#xff0c;导致请求直接落到数据库或后端服务上&#xff0c;增加了系统的负载并可能导致系统崩溃 常见的解决…

开源虚拟化工具VirtualBox安装部署

什么是Virtualbox VirtualBox是一款由Oracle开发和维护的免费开源虚拟化软件&#xff0c;用于在一台计算机上创建和管理多个虚拟机。它允许用户在单个物理计算机上运行多个操作系统&#xff0c;例如Windows、Linux、macOS等。VirtualBox提供了一个虚拟化环境&#xff0c;使用户…

详细介绍如何使用 OpenCV 实现自动文档扫描仪--附实现源码

文末附相关源代码实现的免费下载链接 文档扫描是将物理文档转换为数字形式的过程。可以通过扫描仪或手机摄像头拍摄图像来完成。我们将在本教程中讨论如何使用计算机视觉和图像处理技术有效地实现这一目标。 在当今的计算机时代,几乎不需要任何物理文书工作。尽管如此,在仍…

现代操作系统第一章学习笔记

先附上一个原版的课后习题答案的链接。 课后习题答案 1.1 什么是操作系统 操作系统&#xff1a;他的任务是为应用程序提供一个更好、更简单、更清晰的计算机模型&#xff0c;并管理贮存、磁盘等所有设备。 计算机系统总的来说分为软件和硬件&#xff0c;如下图所示。多数计算…

华为孟晚舟:拥抱5G变革

2023 MWC上海开幕&#xff0c;华为副董事长、轮值董事长、CFO孟晚舟在大会上发表了“拥抱5G变革”的主题演讲。她表示&#xff1a;全球5G商用4年来&#xff0c;正持续引领价值创造&#xff0c;而5.5G是5G网络演进的必然之路&#xff1b;面向未来&#xff0c;科技走向复杂大系统…

突破未来:SAP助力新能源产业腾飞!

新能源行业概况 在互联网的时代浪潮下&#xff0c;多数行业都开始进行了调整与整合&#xff0c;竞争无处不在。作为新兴的新能源行业&#xff0c;如果不想从竞争中被淘汰&#xff0c;就需要把握时代的脉搏&#xff0c;找到突破口&#xff0c;带领企业在市场竞争中越走越远。我…

学习:PSM倾向得分匹配基于stata实现

PSM倾向性匹配得分 定义 就是一个用户属于实验组的倾向性&#xff0c;也就是在特定特征的情况下属于实验组的概率(条件概率) 其他定义&#xff1a; PSM 通过统计学模型计算每个观测的每个协变量的综合倾向性得分&#xff0c;再按照倾向性得分是否接近进⾏匹配。 用直白的话来…

大数据技术——电影推荐系统大数据综合实训项目

具体文档请参考如下链接&#xff1a; https://download.csdn.net/download/qq_53142796/87949491https://download.csdn.net/download/qq_53142796/87949491 https://download.csdn.net/download/qq_53142796/87949489https://download.csdn.net/download/qq_53142796/879494…

2.设计模式之前5种设计模式单例工厂原型建造者适配器

1.怎么掌握设计模式? 独孤5剑 先是锋利的剑 后面是无剑才是最强的 ,GOF四人组写的<设计模式>书,包含了23种,实际可能还有其他,不要被束缚(只是覆盖了大部分).设计模式适合的人群: 1.不知道设计模式 2.有编程经验,但是写的好多代码有设计模式却不知道 3.学习过设计模式,发…

Unity 提取并拷贝Hierarchy路径

提取并拷贝Hierarchy路径 &#x1f354;效果&#x1f96a;食用 &#x1f354;效果 &#x1f96a;食用 &#x1f4a1;.导入包后直接选中GameObject右键选择&#xff1a;复制Hierarchy路径 &#x1f4a1;.快捷键Ctrl V 即可粘贴路径

SurfaceFlinge/InputFlinger分析-android画面缩放后依然点击正常原理分析

hi&#xff0c;粉丝朋友们&#xff1a; 这两天刚好在做自由窗口相关国内需求&#xff0c;刚好遇到一个疑惑&#xff0c;那就是画面进行缩放后发现依然触摸画面可以正常反映问题。 具体疑惑背景 疑问点如下&#xff1a; 坐标是针对屏幕的&#xff0c;按钮也是相对Activity的&…

【SPI】STM32 SPI 双机通信,SPI从机模式使用

文章目录 一、SPI主机配置二、SPI从机配置三、双机通信1 轮询中断&#xff08;低速&#xff09;2 轮询DMA&#xff08;低速&#xff09;3 DMADMA&#xff08;高速&#xff09;4 开启CRC校验&#xff08;自选&#xff09; 四、遇到的问题1 高速使用时&#xff0c;程序卡死&#…

JavaScript 原型与原型链

所有的 JavaScript 对象都会从一个 prototype&#xff08;原型对象&#xff09;中继承属性和方法&#xff1a; Date 对象从 Date.prototype 继承。 Array 对象从 Array.prototype 继承。 所有 JavaScript 中的对象都是位于原型链顶端的 Object 的实例。 JavaScript 对象有一个指…

【C#】代码解析--打印数据集

系列文章 【C#】编号生成器&#xff08;定义单号规则、固定字符、流水号、业务单号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器&#xff08;开始日期、结束日期&#xff09; 本文链接&#xff1a;h…