PyQt5

Qt是基于C++实现的GUI,而PyQt就是用python调用Qt.

PyQt中有很多的功能模块,开发最常用的模块功能主要有3个

1) QtCore:包含核心的非GHI的功能,主要和时间,文件与文件夹,各种数据,流,URLs,进程与线程一起使用

2) QtGUi:包含窗口系统,事件处理,2D图像,基本绘画,字体和文字类

3) QtWidget:包含了一些创建桌面应用的UI元素

Qt for Python Quick start — Qt for Python

1. 安装环境

1.1 创建虚拟环境

1.2 安装PyQt5库

1.3 安装PyQt5时报错,

下载工具,进行安装  Microsoft C++ 生成工具 - Visual Studio

 

2.基本UI

# _*_ coding:utf-8 _*_
# @Time  :  16:41
# @Author: george
# @File  : 基本UI.py
# @Comment: ***
import sys
from PyQt5.QtWidgets import QApplication, QWidgetif __name__ == '__main__':# 创建QApplication对象-传递列表给QApplication类,这个参数一般是当前程序对象运行环境参数app = QApplication(sys.argv)# 创建界面对象w = QWidget()# 设置窗口标题w.setWindowTitle("第一个PyQt")# 展示窗口w.show()# 程序进入循环等待状态,事件监测循环app.exec_()

效果图

3.组件

3.1 Button

# _*_ coding:utf-8 _*_
# @Time  :  17:16
# @Author: george
# @File  : 按钮.py
# @Comment: ***
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
if __name__ == '__main__':app = QApplication(sys.argv)w = QWidget()w.setWindowTitle("第一个PyQt程序")# 创建buttonbtn = QPushButton("按钮")# 将按钮放入窗口显示btn.setParent(w)w.show()app.exec_()

效果图:

3.2 Label

# _*_ coding:utf-8 _*_
# @Time  :  17:29
# @Author: george
# @File  : label.py
# @Comment: ***
import sys
from PyQt5.QtWidgets import QLabel, QWidget,QApplication,QPushButtonif __name__ == '__main__':app = QApplication(sys.argv)w = QWidget()w.setWindowTitle('label')# 在创建对象的时候指定父对象btn = QPushButton('btn',w)lab = QLabel('账号',w)# 设置显示位置与大小,x,y,w,hlab.setGeometry(20,20,300,40)w.show()app.exec_()

 效果图:

 3.3 LineEdit

# _*_ coding:utf-8 _*_
# @Time  :  19:04
# @Author: george
# @File  : lineEdit.py
# @Comment: ***
import sys
from PyQt5.QtWidgets import QWidget, QLineEdit, QPushButton, QApplication, QLabelif __name__ == '__main__':app = QApplication(sys.argv)w = QWidget()w.setWindowTitle('lineedit')# 标签lab = QLabel('账号', w)lab.setGeometry(20, 20, 30, 20)# 输入框edit = QLineEdit(w)edit.setPlaceholderText("请输入账号")edit.setGeometry(55, 20, 330, 20)# 按钮btn = QPushButton('注册', w)btn.setGeometry(55, 50, 30, 20)w.show()app.exec_()

效果图:

3.4 窗口设置

窗口大小,背景图,自动居中等相关设置

# _*_ coding:utf-8 _*_
# @Time  :  19:04
# @Author: george
# @File  : lineEdit.py
# @Comment: ***
import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QWidget, QLineEdit, QPushButton, QApplication, QLabel,QDesktopWidgetif __name__ == '__main__':app = QApplication(sys.argv)w = QWidget()w.setWindowTitle('lineedit')# 调整窗口大小w.resize(800, 600)# 将窗口移动到屏幕0,0位置w.move(0,0)# 自动将app显示在屏幕中间x,y,width,high = QDesktopWidget().availableGeometry().getRect()app_x,app_y,app_width,app_high = w.frameGeometry().getRect()w.move(width//2-app_width//2,high//2-app_high//2)# 设置标题栏图标w.setWindowIcon(QIcon("pyq.png"))# 标签lab = QLabel('账号', w)lab.setGeometry(20, 20, 30, 20)# 输入框edit = QLineEdit(w)edit.setPlaceholderText("请输入账号")edit.setGeometry(55, 20, 330, 20)# 按钮btn = QPushButton('注册', w)btn.setGeometry(55, 50, 30, 20)w.show()app.exec_()

 效果图:

4.布局

在Qt里面布局分为四大类

QBoxLayout,QGridLayout,QFormLayout,QStackedLayout

 4.1 QBoxLayout 盒子布局

4.1.1 垂直布局器

盒子布局,一般使用QHBoxLayout(水平) 和QVBoxLayout(垂直布局)两个子类 

创建布局器->使用布局器->将组件添加到布局器里面

# _*_ coding utf-8 _*_
# george
# time: 2024/3/14下午5:54
# name: 垂直布局.py
# comment:
import sysfrom PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QPushButtonclass MyWindow(QWidget):def __init__(self):super().__init__()  # 一定要调用父类的__init__方法,因为它里面有很多对于UI空间的初始化操作# 设置大小self.resize(300, 300)# 设置标题self.setWindowTitle("垂直布局")# 垂直布局,创建布局器,是一种约束layout = QVBoxLayout()# 按钮1btn1 = QPushButton("按钮1")# 将btn1添加到布局器里面,不需要再设置父对象layout.addWidget(btn1)# 按钮2btn2 = QPushButton("按钮2")layout.addWidget(btn2)# 按钮3btn3 = QPushButton("按钮3")layout.addWidget(btn3)# 让当前窗口使用这个布局器(排列规则)self.setLayout(layout)if __name__ == '__main__':app = QApplication(sys.argv)w = MyWindow()w.show()app.exec()

默认情况下,三个按钮的布局距离是平均分配 

# _*_ coding utf-8 _*_
# george
# time: 2024/3/14下午5:54
# name: 垂直布局.py
# comment:
import sysfrom PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QPushButtonclass MyWindow(QWidget):def __init__(self):super().__init__()  # 一定要调用父类的__init__方法,因为它里面有很多对于UI空间的初始化操作# 设置大小self.resize(300, 300)# 设置标题self.setWindowTitle("垂直布局")# 垂直布局,创建布局器,是一种约束layout = QVBoxLayout()# 按钮1btn1 = QPushButton("按钮1")# 将btn1添加到布局器里面,不需要再设置父对象layout.addWidget(btn1)# 按钮2btn2 = QPushButton("按钮2")layout.addWidget(btn2)# 按钮3btn3 = QPushButton("按钮3")layout.addWidget(btn3)# 添加伸缩器(理解为一个弹簧),这个参数2指的是比例关系,是占据的空间距离比layout.addStretch(2)# 让当前窗口使用这个布局器(排列规则)self.setLayout(layout)if __name__ == '__main__':app = QApplication(sys.argv)w = MyWindow()w.show()app.exec()

4.1.2 水平布局器

# _*_ coding utf-8 _*_
# george
# time: 2024/3/14下午5:54
# name: 垂直布局.py
# comment:
import sysfrom PyQt5.QtWidgets import QWidget, QApplication, QHBoxLayout, QPushButtonclass MyWindow(QWidget):def __init__(self):super().__init__()  # 一定要调用父类的__init__方法,因为它里面有很多对于UI空间的初始化操作# 设置大小self.resize(300, 300)# 设置标题self.setWindowTitle("水平布局")# 垂直布局,创建布局器,是一种约束layout = QHBoxLayout()# 按钮1btn1 = QPushButton("按钮1")# 将btn1添加到布局器里面,不需要再设置父对象layout.addWidget(btn1)# 按钮2btn2 = QPushButton("按钮2")layout.addWidget(btn2)# 按钮3btn3 = QPushButton("按钮3")layout.addWidget(btn3)# 添加伸缩器(理解为一个弹簧),这个参数2指的是比例关系,是占据的空间距离比layout.addStretch(3)# 让当前窗口使用这个布局器(排列规则)self.setLayout(layout)if __name__ == '__main__':app = QApplication(sys.argv)w = MyWindow()w.show()app.exec()

4.12.3 布局嵌套

# _*_ coding utf-8 _*_
# george
# time: 2024/3/14下午6:59
# name: 布局器嵌套.py
# comment:
import sysfrom PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QRadioButtonclass MyQwidget(QWidget):def __init__(self):super(MyQwidget, self).__init__()full_layout = QVBoxLayout()top_layout = QVBoxLayout()lab1 = QLabel("爱好")q1 = QRadioButton("抽烟")q2 = QRadioButton("喝酒")q3 = QRadioButton("烫头")top_layout.addWidget(lab1)top_layout.addWidget(q1)top_layout.addWidget(q2)top_layout.addWidget(q3)full_layout.addLayout(top_layout)lab2 = QLabel("性别")full_layout.addWidget(lab2)botoom_layout = QHBoxLayout()q4 = QRadioButton("男")q5 = QRadioButton("女")botoom_layout.addWidget(q4)botoom_layout.addWidget(q5)full_layout.addLayout(botoom_layout)self.setLayout(full_layout)if __name__ == '__main__':app = QApplication(sys.argv)w = MyQwidget()w.show()app.exec()

 

注意:  self.setLayout(full_layout),都是对象设置布局器,所以对于上下两个布局,也是需要两个被设置对象的.所以上面写的代码是有问题的,需要盒子

hobby_box = QGroupBox("爱好")

# _*_ coding utf-8 _*_
# george
# time: 2024/3/15下午1:37
# name: 布局嵌套2.0.py
# comment:
import sysfrom PyQt5.QtWidgets import *class MyWindows(QWidget):def __init__(self):super(MyWindows, self).__init__()self.init_UI()def init_UI(self):# 最外层的垂直布局,包含爱好和性别container = QVBoxLayout()# 创建第一个组,添加第一个组件,# v_layout保证3个爱好是垂直摆放v_layout = QVBoxLayout()hobby_box = QGroupBox("爱好")btn1 = QRadioButton("抽烟")btn2 = QRadioButton("喝酒")btn3 = QRadioButton("烫头")# 将三个btn添加到v_layout里面v_layout.addWidget(btn1)v_layout.addWidget(btn2)v_layout.addWidget(btn3)hobby_box.setLayout(v_layout)# 创建第二个组,添加多个组件# 性别组h_layout = QHBoxLayout()gender_box = QGroupBox("性别")btn4 = QRadioButton("男")btn5 = QRadioButton("女")h_layout.addWidget(btn4)h_layout.addWidget(btn5)gender_box.setLayout(h_layout)# 将爱好的内容添加到容器中container.addWidget(hobby_box)container.addWidget(gender_box)# 设置窗口显示的内容是最外层容器self.setLayout(container)if __name__ == '__main__':app = QApplication(sys.argv)window = MyWindows()window.show()app.exec_()

4.2 QGridLayout 网格布局 

# _*_ coding utf-8 _*_
# george
# time: 2024/3/15下午2:03
# name: 网格布局.py
# comment:
import sysfrom PyQt5.QtWidgets import *class MyWindow(QWidget):def __init__(self):super(MyWindow, self).__init__()self.initUI()def initUI(self):# 设置标题头self.setWindowTitle("计算器")# 准备数据data = {0: ["7", "8", "9", "+", "("],1: ["4", "5", "6", "-", ")"],2: ["1", "2", "3", "*", "<-"],3: ["0", ".", "=", "/", "C"]}# 整体设置垂直布局layout = QVBoxLayout()# 设置输入框edit = QLineEdit()edit.setPlaceholderText("请输入内容")# 将输入框添加到容器中layout.addWidget(edit)# 网格布局grid = QGridLayout()# 循环创建btnfor row_number,data_list in data.items():for col_number,i in enumerate(data_list):btn = QPushButton(i)grid.addWidget(btn,row_number,col_number)# 将网格布局追加到容器中layout.addLayout(grid)# 设置最外层容器的布局为垂直布局self.setLayout(layout)if __name__ == '__main__':app = QApplication(sys.argv)w = MyWindow()w.show()app.exec()

4.3 QFormaLayout

一般适用于提交form表单,比如:登陆,注册等类似场景

4.4 StackedLayout 抽屉布局

提供了多页面切换的布局,一次只能看到一个界面,抽屉布局 

对于抽屉布局器而言就是,一个widget使用了抽屉布局器,而抽屉布局器里面有2个或是多个子widget,这里面的子widget就是将要显示的界面.

# _*_ coding utf-8 _*_
# george
# time: 2024/3/15下午3:12
# name: 抽屉布局.py
# comment:
import sysfrom PyQt5.QtWidgets import *class Window1(QWidget):def __init__(self):super(Window1, self).__init__()QLabel("我是抽屉1要显示的内容",self)self.setStyleSheet("background-color:green;")class Window2(QWidget):def __init__(self):super(Window2, self).__init__()QLabel("我是抽屉2要显示的内容",self)self.setStyleSheet("background-color:red;")class MyWindow(QWidget):def __init__(self):super(MyWindow, self).__init__()self.create_stacked_layout()self.initUI()def create_stacked_layout(self):# 创建抽屉布局self.stacked_layout = QStackedLayout()# 创建单独的widgetwin1 = Window1()win2 = Window2()# 将创建的2个widget添加到抽屉布局器中self.stacked_layout.addWidget(win1)self.stacked_layout.addWidget(win2)def initUI(self):# 设置widget大小以及固定宽高self.setFixedSize(300, 270)# 创建整体布局器container = QVBoxLayout()# 创建一个要显示的具体内容的子widgetwidget = QWidget()widget.setLayout(self.stacked_layout)widget.setStyleSheet("background-color:gray;")# 创建2个按钮,用来点击进行切换布局器中的widgetbtn_press1 = QPushButton("抽屉1")btn_press2 = QPushButton("抽屉2")# 给按钮添加事件,即点击及进行切换抽屉布局器中的widget# 如果按钮被点击连接事件self.btn_press1_clickedbtn_press1.clicked.connect(self.btn_press1_clicked)btn_press2.clicked.connect(self.btn_press2_clicked)# 将要显示的控件添加到container布局器中container.addWidget(widget)container.addWidget(btn_press1)container.addWidget(btn_press2)# 设置widget显示的内容使用的是container布局器self.setLayout(container)def btn_press1_clicked(self):# 设置抽屉布局器的当前索引值,即可切换显示哪个widgetself.stacked_layout.setCurrentIndex(0)def btn_press2_clicked(self):self.stacked_layout.setCurrentIndex(1)if __name__ == '__main__':app = QApplication(sys.argv)w = MyWindow()w.show()app.exec()

 

5. 窗口

在Qt中,生成窗口有三种方式:

Qwidget,QMainWindow,QDialog

5.1 QWidget

空间和窗口的父类,自由度高(什么东西都没有),没有划分菜单,工具栏,状态栏,主窗口等区域

import sysfrom PyQt5.QtWidgets import *class MyWindow(QWidget):def __init__(self):super().__init__()  # 一定要调用父类的__init__方法,因为它里面有很多对于UI空间的初始化操作self.initUI()def initUI(self):self.resize(300,300)label = QLabel("这是文字",self)label.setStyleSheet("font-size:30px;color:red")if __name__ == '__main__':app = QApplication(sys.argv)w = MyWindow()w.show()app.exec()

5.2 QMainWindow

是QWidget的子类,包含菜单栏,工具栏,状态栏,标题栏,中间部分为主窗口区域

# _*_ coding utf-8 _*_
# george
# time: 2024/3/15下午6:43
# name: 窗口.py
# comment:
import sysfrom PyQt5.QtWidgets import *class MyWindow(QMainWindow):def __init__(self):super().__init__()  # 一定要调用父类的__init__方法,因为它里面有很多对于UI空间的初始化操作self.initUI()def initUI(self):self.resize(300,300)label = QLabel("这是文字")label.setStyleSheet("font-size:30px;color:red")# 调用父类的menuBar,对菜单栏进行操作menu = self.menuBar()file_menu = menu.addMenu("文件")file_menu.addAction("新建")file_menu.addAction("打开")file_menu.addAction("保存")edit_menu = menu.addMenu("编辑")edit_menu.addAction("复制")edit_menu.addAction("粘贴")edit_menu.addAction("剪切")# 将内容在中心部分显示self.setCentralWidget(label)if __name__ == '__main__':app = QApplication(sys.argv)w = MyWindow()w.show()app.exec()

5.3 QDialog

对话窗口的基类 ,不作为主窗口只是作为按钮点击时的弹窗

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/4/8 21:46
# @Author : George
import sysfrom PyQt5.QtWidgets import QDialog, QPushButton, QApplicationclass MyDialog(QDialog):def __init__(self):super().__init__()self.UI_init()def UI_init(self):ok_btn = QPushButton("确定", self)ok_btn.setGeometry(50,50,100,30)if __name__ == '__main__':app = QApplication(sys.argv)w = MyDialog()w.setWindowTitle("Dialog")w.show()sys.exit(app.exec_())

奇怪的是窗口上面有?

6.信号与槽

6.1 信号(Signal)

信号其实就是事件(按钮点击,内容改变,窗口关闭)或者是状态(选中或是切换)当程序触发了某种状态或是发生了某种事件,就可发射出来一个信号

6.2 槽(slot)

若想捕获这个信号,并执行相应的逻辑代码,就需要用到槽。槽实际上是一个函数,当信号发射出来之后会执行与之绑定的槽函数。

6.3 将信号与槽连接

为了实现,当点击某个按钮时执行某个逻辑,需要将具体的信号和具体的槽函数绑定到一起。

6.3.1 接收信号 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/4/9 23:04
# @Author : George
import sysfrom PyQt5.QtWidgets import QApplication, QWidget, QPushButtonclass Window(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# 重新设置窗口的宽高self.resize(500, 300)btn = QPushButton('点我点我',self)btn.setGeometry(200,200,100,30)btn.clicked.connect(self.click_my_btn)def click_my_btn(self,mgs):#槽函数,点击按钮时就是调用此函数。这里的参数是信号发出时传递的参数print("我正在点击按钮",mgs)if __name__ == '__main__':app = QApplication(sys.argv)window = Window()window.show()sys.exit(app.exec_())

 6.3.2 自定义信号

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/4/9 23:33
# @Author : George
import sys
import timefrom PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QApplication, QWidget, QPushButtonclass Window(QWidget):# 自定义一个信号,并且只能作为类属性my_signal = pyqtSignal(str) # 定义的时候声明传递的参数是字符串def __init__(self):super().__init__()self.initUI()def initUI(self):self.resize(300, 200)btn = QPushButton('开始检测', self)btn.setGeometry(100, 150, 100, 30)btn.clicked.connect(self.check)# 将自定义信号和槽函数进行绑定self.my_signal.connect(self.my_slot)def my_slot(self, msg):print(msg)def check(self):for i, ip in enumerate(["192.168.3.%s" % x for x in range(1, 255)]):print("模拟===正在%s检测系统漏洞......" % ip)if i % 5 == 0:# 这里是发射信号,并将参数传递给绑定的槽函数,传递的参数是字符串self.my_signal.emit("【发现漏洞】") # 这里就是在调用函数time.sleep(0.1)if __name__ == '__main__':app = QApplication(sys.argv)window = Window()window.show()sys.exit(app.exec_())

 

7.Qt Designer

windows版本下载链接,使用迅雷会很快

https://build-system.fman.io/static/public/files/Qt%20Designer%20Setup.exe

7.1 Qt Designer的基本使用

整体界面

1)创建窗口 

2)设计界面布局 

 3)预览效果

 4)保存UI文件

按ctrl+s保存UI文件

7.2 python调用ui文件显示界面

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/4/11 21:22
# @Author : George
import sys
import osfrom PyQt5.QtWidgets import QApplication
from PyQt5 import uicif __name__ == '__main__':app = QApplication(sys.argv)# 调用UI设计ui = uic.loadUi(os.path.join(os.path.expanduser("~"),'Desktop/mini_ui.ui'))# 展示窗口ui.show()app.exec()

显示结果:

7.3 给控件添加信号与槽 

信号与槽的编辑器,但是并不建议使用因为太受限制,所以一般都是通过Qt Designer设计好了界面之后,自己在代码里面设计信号与槽

 在代码里面调用设计好的控件

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/4/11 21:54
# @Author : George
import sys
from pathlib import Path
from PyQt5.QtWidgets import QApplication, QWidget, QTextBrowser
from PyQt5 import uicclass MyWindow(QWidget):def __init__(self):super().__init__()self.init_UI()def init_UI(self):ui_path = Path.home() / "Desktop/login.ui"self.ui = uic.loadUi(ui_path)# print(self.ui) # ui文件中最顶层对象 Form# print(self.ui.__dict__)  # 获取当前对象的所有属性,并且按照键值对的形式呈现# print(self.ui.label)  # 最顶层对象中间嵌套的QLabel# print(self.ui.label.text())  # label的文本# 正文开始self.user_name = self.ui.lineEditself.password = self.ui.lineEdit_2login_btn = self.ui.pushButton_3forget_btn = self.ui.pushButton_4text_browser = self.ui.textBrowser# 登录按钮绑定槽函数login_btn.clicked.connect(self.login)def login(self):"""实现登录逻辑:注意获取到输入框的内容是在点击按钮时,一开始的输入框是空的"""if self.user_name.text() == "admin" and self.password.text() == "123":print("Login Successful")else:print("username or password is wrong")if __name__ == '__main__':app = QApplication(sys.argv)win = MyWindow()win.ui.show()app.exec()

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

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

相关文章

详解构造函数

前言 希望这篇文章是有意义的&#xff0c;能够帮助初学者理清构造函数的概念&#xff0c;关系及误区。首先定义一个日期类&#xff0c;借助日期类讲解构造函数。 class Date {public:void Init(int year, int month, int day) //初始化数据的方法{_year year;_month month…

Ubuntu快捷安装MySQL

更新包列表 sudo apt update 安装mysql sudo apt install mysql-server 启动mysql // 启动mysql sudo service mysql start// 关闭mysql sudo service mysql stop// 重启mysql sudo service mysql restart 连接mysql // 初始安装无密码&#xff0c;直接连接即可&#xf…

【opencv】示例-train_HOG.cpp 训练和测试基于支持向量机(SVM)的行人检测器

#include "opencv2/imgproc.hpp" // 包含OpenCV图像处理头文件 #include "opencv2/highgui.hpp" // 包含OpenCV高层GUI&#xff08;图形用户界面&#xff09;头文件 #include "opencv2/ml.hpp" // 包含OpenCV机器学习模块头文件 #includ…

数据结构初阶:二叉树(二)

二叉树链式结构的实现 前置说明 在学习二叉树的基本操作前&#xff0c;需先要创建一棵二叉树&#xff0c;然后才能学习其相关的基本操作。由于现在对二叉树结构掌握还不够深入&#xff0c;为了降低学习成本&#xff0c;此处手动快速创建一棵简单的二叉树&#xff0c;快速进入二…

二、Flask会话技术和模板语言

Cookie Session # views.py: 路由 视图函数 import datetimefrom flask import Blueprint, render_template, request, redirect, session from .models import *# 蓝图 blue Blueprint(user, __name__)# 首页 可以写两个路由&#xff0c;都是访问同一个函数 blue.route(/) b…

【数据结构】泛型(分享重点)

什么是泛型&#xff1f; 泛型就是适用于许多许多类型&#xff0c;对类型参数化。 怎么创建一个泛型呢 class 泛型类名称<类型形参列表> { // 这里可以使用类型参数 } class ClassName<T1, T2, ..., Tn> { } class 泛型类名称<类型形参列表> extends 继承类…

微服务之LoadBalancer负载均衡服务调用

一、概述 1.1什么是负载均衡 LB&#xff0c;既负载均衡&#xff08;Load Balancer&#xff09;,是高并发、高可用系统必不可少的关键组件&#xff0c;其目标是尽力将网络流量平均分发到多个服务器上&#xff0c;以提高系统整体的响应速度和可用性。 负载均衡的主要作用 高并发…

回归预测 | Matlab基于RIME-SVR霜冰算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于RIME-SVR霜冰算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于RIME-SVR霜冰算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于RIME-SVR霜冰算法优化支持向量机的数…

MySQL优化慢SQL的6种方式

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《mysql经验总结》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 优化思路 优化方法 1.避免查询不必要的列 2.分页优化 3.索引优化 4.JOIN优化 5.排序优化 6.UNION 优化…

无线网络2.4和5G的区别

无线网络2.4和5的区别 无线网络2.4GHz和5GHz的主要区别在于频率、覆盖范围、传输速度、干扰能力和穿透性。以下是详细介绍&#xff1a;12 频率不同。2.4GHz的频率较低&#xff0c;而5GHz的频率较高。频率越低&#xff0c;信号在传播过程中的损失越小&#xff0c;因此覆盖范围…

linux学习:文件属性

在操作文件的时候&#xff0c;经常需要获取文件的属性&#xff0c;比如类型、权限、大小、所有者等等&#xff0c; 这些信息对于比如文件的传输、管理等是必不可少的&#xff0c;而这些信息 这三个函数的功能完全一样&#xff0c;区别是&#xff1a;stat( )参数是一个文件的名字…

网络篇05 | 应用层 http/https

网络篇05 | 应用层 http/https 01 HTTP请求报文协议&#xff08;Request&#xff09;1&#xff09;Request简述2&#xff09;请求行&#xff08;首行&#xff09;3&#xff09;请求头&#xff08;Request Headers&#xff09;4&#xff09;空行5&#xff09;正文&#xff08;Re…

【机器学习300问】67、均方误差与交叉熵误差,两种损失函数的区别?

一、均方误差&#xff08;Mean Squared Error, MSE&#xff09; 假设你是一个教练&#xff0c;在指导学生射箭。每次射箭后&#xff0c;你可以测量子弹的落点距离靶心的差距&#xff08;误差&#xff09;。MSE就像是计算所以射击误差的平方后的平均值。它强调了每一次偏离靶心的…

ARM v8 Cortex R52内核 04 时钟和复位 Clocking and Resets

ARM v8 Cortex R52内核 04 时钟和复位 Clocking and Resets 4.1 Clock and clock enables 时钟和时钟使能 Cortex-R52处理器具有一个单一的时钟&#xff0c;驱动着所有的触发器和RAM。各种输入&#xff0c;包括复位输入&#xff0c;都有同步逻辑使它们可以与处理器时钟异步操…

如何在MacOS上使用OpenHarmony SDK交叉编译?

本文以cJSON三方库为例介绍如何通过OpenHarmony的SDK在Mac平台进行交叉编译。 环境准备 SDK准备 我们可以通过 openHarmony SDK 官方发布渠道下载对应mac版本的SDK&#xff0c;当前OpenHarmony MAC版本的SDK有2种&#xff0c;一种是x86架构&#xff0c;另一种是arm64&#x…

做一个后台项目的架构

后台架构的11个维度 架构1&#xff1a;团队协助基础工具链的选型和培训架构2&#xff1a;搭建微服务开发基础设施架构3&#xff1a;选择合适的RPC框架架构4&#xff1a;选择和搭建高可用的注册中心架构5&#xff1a;选择和搭建高可用的配置中心架构6&#xff1a;选择和搭建高性…

Hudi-ubuntu环境搭建

hudi-ubuntu环境搭建 运行 1.编译Hudi #1.把maven安装包上传到服务器 # 官网下载安装包 https://archive.apache.org/dist/maven/maven-3/ scp -r D:\Users\zh\Desktop\Hudi\compressedPackage\apache-maven-3.6.3-bin.tar.gz zhangheng10.8.4.212:/home/zhangheng/hudi/com…

Spring+SpringMVC的知识总结

一:技术体系架构二:SpringFramework介绍三:Spring loC容器和核心概念3.1 组件和组件管理的概念3.1.1什么是组件:3.1.2:我们的期待3.1.3Spring充当组件管理角色(IOC)3.1.4 Spring优势3.2 Spring Ioc容器和容器实现3.2.1普通和复杂容器3.2.2 SpringIOC的容器介绍3.2.3 Spring IOC…

字符串常量池(StringTable)

目录 String的基本特性 String的内存分配 字符串拼接操作 intern()的使用 String的基本特性 String&#xff1a;字符串&#xff0c;使用一对""引起来表示 String声明为final的&#xff0c;不可被继承 String实现了Serializable接口&#xff1a;表示字符串是支持…

考试酷基本功修炼课学习历程_FPGA成长篇

本文为明德扬原创文章&#xff0c;转载请注明出处&#xff01;作者&#xff1a;明德扬学员&#xff1a;考试酷账号&#xff1a;11167760 我是硬件工程师&#xff0c;日常工作中主要跟数字电路、模拟电路、嵌入式系统打交道&#xff0c;当然也会涉及到FPGA&#xff0c;但是苦于…