【Python篇】PyQt5 超详细教程——由入门到精通(中篇二)
文章目录
- PyQt5超详细教程
- 前言
- 第7部分:生成图表与数据可视化
- 7.1 matplotlib 与 PyQt5 的结合
- 7.2 在 PyQt5 中嵌入 matplotlib 图表
- 示例 1:嵌入简单的 matplotlib 图表
- 代码详解:
- 7.3 动态生成图表
- 示例 2:动态更新图表
- 代码详解:
- 7.4 在应用程序中展示不同类型的图表
- 示例 3:展示不同类型的图表
- 代码详解:
- 7.5 总结
- 第8部分:对话框(QDialog)与用户交互
- 8.1 什么是 QDialog
- 8.2 使用 QMessageBox 创建消息对话框
- 示例 1:创建简单的消息对话框
- 代码详解:
- 8.3 使用 QInputDialog 获取用户输入
- 示例 2:使用 QInputDialog 获取文本输入
- 代码详解:
- 8.4 自定义对话框
- 示例 3:创建自定义对话框
- 代码详解:
- 8.5 总结
- 7-8部分总结:图表与对话框
PyQt5超详细教程
前言
接:
【Python篇】PyQt5 超详细教程——由入门到精通(序篇)
【Python篇】PyQt5 超详细教程——由入门到精通(中篇一)
建议把代码复制到pycahrm等IDE上面看实际效果,方便理解嗷❤️
第7部分:生成图表与数据可视化
7.1 matplotlib 与 PyQt5 的结合
matplotlib 是 Python 中最常用的 2D 数据可视化库,它可以生成各种类型的图表,包括折线图、柱状图、饼图等。在 PyQt5 中,你可以使用 matplotlib
来生成图表,并将这些图表嵌入到 PyQt5 的窗口中。
7.2 在 PyQt5 中嵌入 matplotlib 图表
为了在 PyQt5 应用中显示 matplotlib 图表,我们需要使用 matplotlib 的 FigureCanvas。FigureCanvas 是一个特殊的组件,它允许将 matplotlib 的绘图窗口嵌入到 PyQt5 界面中。首先,我们来看如何在 PyQt5 窗口中嵌入一个简单的折线图。
示例 1:嵌入简单的 matplotlib 图表
import sys
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from PyQt5.QtWidgets import QApplication, QMainWindowclass PlotCanvas(FigureCanvas):def __init__(self, parent=None):fig, self.ax = plt.subplots() # 创建一个图表对象super().__init__(fig) # 将图表对象传给 FigureCanvas# 在这里绘制图表self.plot()def plot(self):# 数据x = [0, 1, 2, 3, 4, 5]y = [10, 1, 20, 3, 40, 5]# 绘制折线图self.ax.plot(x, y, label='折线图示例')# 添加标签和图例self.ax.set_title('PyQt5 中的 matplotlib 示例')self.ax.set_xlabel('X 轴')self.ax.set_ylabel('Y 轴')self.ax.legend()class MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("matplotlib 与 PyQt5 示例")# 创建一个 PlotCanvas 对象,嵌入到 PyQt5 中self.canvas = PlotCanvas(self)# 设置图表作为中央控件self.setCentralWidget(self.canvas)# 创建应用程序对象
app = QApplication(sys.argv)
window = MainWindow()
window.show()# 进入应用程序的事件循环
sys.exit(app.exec_())
代码详解:
-
FigureCanvasQTAgg
FigureCanvas 是
matplotlib
中的一个特殊控件,用于将 matplotlib 图表嵌入到 Qt 界面中。我们通过FigureCanvasQTAgg
继承FigureCanvas
,并创建一个类PlotCanvas
,用于绘制图表。 -
plot() 方法
在
plot()
方法中,我们定义了要展示的数据x
和y
,并使用ax.plot()
方法绘制折线图。set_title()
、set_xlabel()
、set_ylabel()
用于设置图表的标题和轴标签,legend()
添加图例。 -
MainWindow
在主窗口
MainWindow
中,我们创建了PlotCanvas
实例,并将其作为窗口的中央控件。这样,matplotlib 绘制的图表就会显示在窗口中。
7.3 动态生成图表
在某些应用场景中,图表需要根据用户的输入或数据的变化实时更新。接下来我们展示如何在 PyQt5 中动态生成和更新 matplotlib 图表。
示例 2:动态更新图表
import sys
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidgetclass PlotCanvas(FigureCanvas):def __init__(self, parent=None):fig, self.ax = plt.subplots()super().__init__(fig)def plot(self, data):# 清除当前图表内容self.ax.clear()# 重新绘制图表self.ax.plot(data, label='随机数据')self.ax.set_title('动态更新的图表')self.ax.set_xlabel('X 轴')self.ax.set_ylabel('Y 轴')self.ax.legend()# 刷新图表以显示新数据self.draw()class MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("动态更新 matplotlib 图表")# 创建一个图表画布self.canvas = PlotCanvas(self)# 创建按钮self.button = QPushButton("生成随机数据", self)self.button.clicked.connect(self.update_plot)# 创建一个布局,将按钮和图表添加到布局中layout = QVBoxLayout()layout.addWidget(self.canvas)layout.addWidget(self.button)# 创建一个 QWidget 容器,将布局设置到容器中container = QWidget()container.setLayout(layout)# 设置容器为主窗口的中央控件self.setCentralWidget(container)def update_plot(self):# 生成随机数据data = np.random.rand(10)# 更新图表self.canvas.plot(data)# 创建应用程序对象
app = QApplication(sys.argv)
window = MainWindow()
window.show()# 进入应用程序的事件循环
sys.exit(app.exec_())
代码详解:
-
动态更新图表
在
PlotCanvas
类中,我们通过self.ax.clear()
清除之前的绘图内容,然后通过self.ax.plot(data)
绘制新的数据,最后调用self.draw()
刷新图表。 -
update_plot() 方法
当用户点击按钮时,
update_plot()
方法生成一组新的随机数据,并调用self.canvas.plot(data)
更新图表。 -
布局管理
我们使用
QVBoxLayout()
创建一个垂直布局,将图表和按钮依次排列,并通过setCentralWidget()
设置整个布局为窗口的中央控件。
7.4 在应用程序中展示不同类型的图表
matplotlib 支持多种类型的图表,包括折线图、柱状图、饼图等。接下来我们展示如何在 PyQt5 中展示这些不同类型的图表。
示例 3:展示不同类型的图表
import sys
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from PyQt5.QtWidgets import QApplication, QMainWindow, QComboBox, QVBoxLayout, QWidgetclass PlotCanvas(FigureCanvas):def __init__(self, parent=None):fig, self.ax = plt.subplots()super().__init__(fig)def plot_line_chart(self):self.ax.clear()x = [0, 1, 2, 3, 4, 5]y = [10, 1, 20, 3, 40, 5]self.ax.plot(x, y, label='折线图')self.ax.set_title('折线图')self.ax.legend()self.draw()def plot_bar_chart(self):self.ax.clear()x = ['A', 'B', 'C', 'D']y = [5, 7, 3, 8]self.ax.bar(x, y, label='柱状图')self.ax.set_title('柱状图')self.ax.legend()self.draw()def plot_pie_chart(self):self.ax.clear()sizes = [15, 30, 45, 10]labels = ['A', 'B', 'C', 'D']self.ax.pie(sizes, labels=labels, autopct='%1.1f%%')self.ax.set_title('饼图')self.draw()class MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("展示不同类型的图表")# 创建图表画布self.canvas = PlotCanvas(self)# 创建一个下拉菜单供用户选择图表类型self.combo_box = QComboBox(self)self.combo_box.addItems(["折线图", "柱状图", "饼图"])self.combo_box.currentIndexChanged.connect(self.update_chart)# 创建布局,将下拉菜单和图表添加到布局中layout = QVBoxLayout()layout.addWidget(self.canvas)layout.addWidget(self.combo_box)container = QWidget()container.setLayout(layout)self.setCentralWidget(container)def update_chart(self, index):if index == 0:self.canvas.plot_line_chart()elif index == 1:self.canvas.plot_bar_chart()elif index == 2:self.canvas.plot_pie_chart()# 创建应用程序对象
app = QApplication(sys.argv)
window = MainWindow()
window.show()# 进入应用程序的事件循环
sys.exit(app.exec_())
代码详解:
-
展示不同图表
PlotCanvas
类包含了三个方法,用于展示折线图、柱状图和饼图。根据用户的选择,通过update_chart()
方法切换不同的图表展示。 -
QComboBox
QComboBox
是一个下拉菜单控件,允许用户选择不同的图表类型。每次选择不同的图表类型时,会触发currentIndexChanged
信号,调用update_chart()
方法更新图表。
7.5 总结
在这一部分中,我们学习了如何在 PyQt5 中嵌入 matplotlib 图表,实现数据的可视化展示。通过 matplotlib 的强大功能,我们能够在应用程序中展示折线图、柱状图、饼图等多种类型的图表。同时,我们还展示了如何动态更新图表,并结合用户输入来实时调整图表内容。
关键点:
FigureCanvas
允许将 matplotlib 图表嵌入到 PyQt5 界面中。- 图表可以通过
self.ax.clear()
清除旧内容,并通过self.ax.plot()
等方法动态更新。 - 通过用户输入或按钮点击,可以动态生成和展示不同类型的图表。
第8部分:对话框(QDialog)与用户交互
8.1 什么是 QDialog
QDialog 是 PyQt5 中的一种窗口类,用于创建对话框。这种窗口通常是弹出的,并且用于让用户完成某个操作后再关闭,比如显示提示信息、要求用户确认、或者让用户输入数据。与主窗口 QMainWindow
不同,QDialog
通常不含有菜单栏、工具栏等复杂组件。
对话框分为两类:
- 模态对话框(Modal Dialog):阻止用户在关闭对话框前与主窗口进行交互。用户必须在对话框内完成操作后才能返回主窗口。这种对话框常用于提示信息或者重要的用户操作。
- 非模态对话框(Non-modal Dialog):允许用户在对话框打开时仍然与主窗口进行交互。对话框和主窗口之间的操作可以同时进行。
常见的对话框 包括:
- 消息对话框(QMessageBox):用于向用户显示消息,如信息提示、警告、错误等。
- 输入对话框(QInputDialog):用于获取用户输入,如文本、数字或选项。
- 自定义对话框(Custom Dialog):你可以根据需求创建包含多种控件的自定义对话框。
8.2 使用 QMessageBox 创建消息对话框
QMessageBox
是 PyQt5 中用于显示消息或提示信息的标准对话框。它可以显示简单的提示信息、警告、错误消息,甚至让用户在多种选项中做出选择。
示例 1:创建简单的消息对话框
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QPushButtonclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("QMessageBox 示例")# 创建一个按钮self.button = QPushButton("显示消息", self)self.button.clicked.connect(self.show_message)# 设置按钮为窗口的中央控件self.setCentralWidget(self.button)def show_message(self):# 创建消息对话框msg_box = QMessageBox()# 设置对话框标题msg_box.setWindowTitle("消息")# 设置对话框显示的文本msg_box.setText("这是一个简单的消息对话框。")# 设置对话框的按钮msg_box.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) # 添加 OK 和 Cancel 按钮# 设置对话框的图标msg_box.setIcon(QMessageBox.Information) # 设置图标为信息图标# 显示对话框并获取用户的选择result = msg_box.exec_()# 判断用户点击了哪个按钮if result == QMessageBox.Ok:print("用户点击了 OK 按钮")else:print("用户点击了 Cancel 按钮")# 创建应用程序对象
app = QApplication(sys.argv)
window = MainWindow()
window.show()# 进入应用程序的事件循环
sys.exit(app.exec_())
代码详解:
-
QMessageBox
QMessageBox
是一个标准的对话框,用于向用户展示信息。在 PyQt5 中,QMessageBox
可以显示带有图标和按钮的消息框,并且能够让用户进行确认。 -
setText()
setText()
用于设置对话框的主要信息。在这个例子中,显示的内容是“这是一个简单的消息对话框”。 -
setWindowTitle()
setWindowTitle()
设置对话框窗口的标题,用户可以通过这个标题了解到对话框的主题。 -
setStandardButtons()
setStandardButtons()
允许你为对话框添加常用的按钮,如 OK、Cancel、Yes、No 等。在这里,我们添加了 OK 和 Cancel 两个按钮,用户可以选择其中之一。 -
setIcon()
setIcon()
设置对话框左侧的图标。可以选择的图标类型包括QMessageBox.Information
(信息图标)、QMessageBox.Warning
(警告图标)、QMessageBox.Critical
(错误图标)等。 -
exec_()
exec_()
是一个阻塞函数,会弹出对话框并等待用户操作。这个函数返回用户选择的按钮(如 OK 或 Cancel)。根据返回值,我们可以判断用户的操作并采取不同的行动。
8.3 使用 QInputDialog 获取用户输入
QInputDialog
是一个标准对话框,用于从用户处获取输入。它支持多种类型的输入,包括文本、整数、浮点数和下拉选择。
示例 2:使用 QInputDialog 获取文本输入
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QInputDialog, QPushButtonclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("QInputDialog 示例")# 创建按钮self.button = QPushButton("获取用户输入", self)self.button.clicked.connect(self.get_input)# 设置按钮为中央控件self.setCentralWidget(self.button)def get_input(self):# 弹出输入对话框,获取用户输入的文本text, ok = QInputDialog.getText(self, "输入对话框", "请输入您的姓名:")# 如果用户点击了 OK 按钮并且输入了文本if ok and text:print(f"用户输入:{text}")# 创建应用程序对象
app = QApplication(sys.argv)
window = MainWindow()
window.show()# 进入应用程序的事件循环
sys.exit(app.exec_())
代码详解:
-
QInputDialog.getText()
QInputDialog.getText()
方法用于创建一个单行文本输入对话框,用户可以在其中输入内容。这个方法返回两个值:text
是用户输入的内容。ok
是一个布尔值,表示用户是否点击了 OK 按钮。如果用户点击 Cancel,ok
值为False
。
-
获取用户输入
当用户点击 OK 按钮并输入了内容时,程序会输出用户输入的文本。如果用户取消了输入对话框,则不会输出任何内容。
8.4 自定义对话框
除了使用标准的消息框和输入框,PyQt5 允许你创建自定义对话框。通过自定义对话框,你可以根据需求添加任意控件,如按钮、文本框、复选框等。
示例 3:创建自定义对话框
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QLabel, QVBoxLayout, QPushButton# 自定义对话框类,继承自 QDialog
class CustomDialog(QDialog):def __init__(self):super().__init__()# 设置对话框的标题self.setWindowTitle("自定义对话框")# 创建标签控件,显示提示信息label = QLabel("这是一个自定义对话框")# 创建关闭按钮,点击时关闭对话框close_button = QPushButton("关闭")close_button.clicked.connect(self.accept) # 调用 accept() 方法关闭对话框# 创建布局,将标签和按钮添加到布局中layout = QVBoxLayout()layout.addWidget(label)layout.addWidget(close_button)# 设置对话框的布局self.setLayout(layout)class MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("自定义对话框示例")# 创建按钮,用于打开自定义对话框self.button = QPushButton("打开自定义对话框", self)self.button.clicked.connect(self.show_custom_dialog)# 设置按钮为窗口的中央控件self.setCentralWidget(self.button)def show_custom_dialog(self):# 创建并显示自定义对话框dialog = CustomDialog()# 使用 exec_() 方法显示对话框,并等待用户操作if dialog.exec_():print("自定义对话框已关闭")# 创建应用程序对象
app = QApplication(sys.argv)
window = MainWindow()
window.show()# 进入应用程序的事件循环
sys.exit(app.exec_())
代码详解:
-
自定义对话框类
CustomDialog
类继承自QDialog
,用于创建自定义对话框。对话框的外观和行为由你自行定义,你可以在其中添加任意控件。 -
布局管理
通过
QVBoxLayout()
,我们将对话框中的控件(如标签和按钮)垂直排列。你可以根据需要使用不同的布局管理器来组织控件,如QHBoxLayout
(水平布局)或QGridLayout
(网格布局)。 -
accept() 方法
当用户点击关闭按钮时,调用
accept()
方法关闭对话框。accept()
是QDialog
的内置方法,它表示对话框的操作已被接受,并会关闭对话框。 -
exec_() 方法
exec_()
方法用于显示对话框并等待用户操作。对话框的行为是模态的,这意味着用户必须处理完对话框后才能返回主窗口。
8.5 总结
在这一部分中,我们详细介绍了 PyQt5 中的几种对话框,包括:
QMessageBox
:用于显示消息或提示信息的对话框。QInputDialog
:用于获取用户输入的对话框,支持文本、整数和浮点数输入。- 自定义对话框:通过继承
QDialog
,你可以根据需求创建包含任意控件的对话框。
关键点:
- 对话框可以是模态的,用户必须处理完对话框后才能返回主窗口。
- PyQt5 提供了多种标准对话框,帮助快速实现常见的用户交互。
- 自定义对话框非常灵活,适合复杂的交互需求。
7-8部分总结:图表与对话框
在第7至第8部分中,我们探讨了如何在 PyQt5 中使用 matplotlib 实现数据的可视化,并展示了如何在界面中嵌入折线图、柱状图、饼图等多种图表。同时,我们介绍了 PyQt5 中的对话框,包括标准消息对话框、输入对话框以及自定义对话框。这些对话框在用户交互中起到了重要作用,允许用户获取提示、输入信息或确认操作。
以上就是关于【Python篇】PyQt5 超详细教程——由入门到精通(中篇二)的内容啦,各位大佬有什么问题欢迎在评论区指正,或者私信也行哦,您的支持是我创作的最大动力!❤️
相关文章:

【Python篇】PyQt5 超详细教程——由入门到精通(中篇二)
文章目录 PyQt5超详细教程前言第7部分:生成图表与数据可视化7.1 matplotlib 与 PyQt5 的结合7.2 在 PyQt5 中嵌入 matplotlib 图表示例 1:嵌入简单的 matplotlib 图表代码详解: 7.3 动态生成图表示例 2:动态更新图表代码详解&…...

2024/9/10 小型PLC典型应用1:含步进电机+变频器+触摸屏
主要是讲脉冲控制步进,因为etherCat是标准化的,直接通过轴控指令即可控制;canopen也涉及轴控指令,但配置稍微有点不一样。 控制本体端口的步进,通过发脉冲或者脉冲定位信号。 但这个4PM只有单独的轴控指令,…...
RGB与CMYK互转
先定义一个CMYK数据结构: typedef struct struCMYK {int m_nC;int m_nM;int m_nY;int m_nK; }CMYK;RGB转CMYK void CvtRGB2CMYK(COLORREF& clr, CMYK& cmyk) {double dR GetBValue(clr) / 255.0;double dG GetGValue(clr) / 255.0;double dB GetRValue…...

滴~“TOP期刊体验卡”已到期!公认水刊的尽头,还得是你MDPI
【SciencePub学术】本期,给大家介绍的是1本MDPI旗下的计算机类SCI——《Remote Sensing》。 优点VS缺点 • 期刊分区一直维持在较高水平 • 审稿速度极快,1-2个月录用见刊 • 年刊文量大,收稿多 • 期刊自引率较高 • 期刊系统初筛较难 • …...

ASUS华硕ROG幻16 Air 2024款锐龙AI版GA605WI,GA605WV工厂模式原厂Win11系统,含MyASUS WinRE恢复重置还原功能
适用型号:【GA605WI、GA605WV】,原装出厂Windows11系统工厂包下载 链接:https://pan.baidu.com/s/1IVolLwB7fddGKZY0IxOqaA?pwd62e2 提取码:62e2 华硕原装系统工厂安装包,带有MyASUS WinRE RECOVERY恢复功能、自带…...

想入行在线教育?你必须知道的十件事
在最近几年受新冠疫情和异常天气的影响,越来越多的教育活动被迫转移到线上。然而,在线课程的短板也很明显,大部分在线教育工作者难以有效地引导学生集中注意力,并且无法像线下授课一样进行同步考试。 那么,有什么办法…...
EasyExcel相关整理
一、实体类常用注解 1、字段注解ExcelProperty,一般常用value标明表头,index标明列 2、实体类注解(导出样式设置) 3、导出特殊类型转换 二、导出 1、导出多个sheet 2、导出数据量大导致内存溢出 三、导入 待更新...

2024年【汽车驾驶员(技师)】考试题及汽车驾驶员(技师)找解析
题库来源:安全生产模拟考试一点通公众号小程序 汽车驾驶员(技师)考试题根据新汽车驾驶员(技师)考试大纲要求,安全生产模拟考试一点通将汽车驾驶员(技师)模拟考试试题进行汇编&#…...

[C#学习笔记]接口的特性与用法
视频地址:一期视频看透C#接口的全部特性及用法_哔哩哔哩_bilibili 强烈推荐学习C#和WPF的朋友关注此UP,知识点巨多,讲解透彻! 一、总览 public interface IOverall {/// <summary>/// 最普通的方法/// </summary>v…...
java发送邮件报错,Could not connect to SMTP host: smtp.exmail.qq.com, port: 465
发现问题 我使用的 docker 运行的 jdk 环境,服务调用发送邮件报错 javax.mail.MessagingException: Could not connect to SMTP host: smtp.exmail.qq.com, port: 465;nested exception is:javax.net.ssl.SSLHandshakeException: No appropriate protocol (protoc…...

开放式耳机有哪些好处?性价比排行前十的四款蓝牙耳机推荐
开放式耳机有以下好处: 佩戴舒适:开放式耳机不入耳,不堵塞耳道,长时间佩戴耳朵不易感到闷热和疼痛,相比传统入耳式耳机,能减少对耳道的压迫感和摩擦,让耳朵更舒适。 更健康卫生:不入…...

FreeRTOS(速记版)
第一章 初识 FreeRTOS 1.1 FreeRTOS简介 FreeRTOS 采用了 MIT 开源许可,这允许将 FreeRTOS 操作系统用于商业应用,并且不需要公开源代码。此外,FreeRTOS 还衍生出了另外两个操作系统:OpenRTOS 和 SafeRTOS,其中 OpenR…...
解锁中东市场新蓝海:Bigo社交媒体如何赋能APP广告营销优势
解锁中东市场新蓝海:Bigo社交媒体如何赋能APP广告营销优势 在全球数字化浪潮的推动下,中东地区以其独特的文化背景、高速的经济增长以及庞大的年轻消费群体,成为了众多品牌与APP开发者竞相争夺的市场高地。作为该地区颇具影响力的社交媒体平…...
【网络】DNS
definition DNS(Domain Name System,域名系统)服务器是互联网上的重要基础设施之一,它的主要作用是将人们易于记忆的域名(如www.example.com)转换成计算机可以直接识别的IP地址(如192.0.2.1&am…...

如何使用ChatGPT,完成学术论文文献综述的编写?
学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 在学术研究中,文献综述是了解研究现状、辨识研究空白并为自己的研究奠定理论基础的关键环节。ChatGPT 可以在文献综述的编写过程中提供有效的支持,从文献搜集、批…...

探索GPU算力在大模型和高性能计算中的无限潜能
在当今科技领域,大模型和高性能计算正以惊人的速度发展。大模型如语言模型、图像识别模型等,规模越来越大,精度越来越高,能够处理复杂的任务和生成逼真的结果。高性能计算则凭借强大的计算能力,推动着科学研究、工程设…...

【信创】统信UOS图形界面登录闪退的解决方法
原文链接:【信创】统信UOS图形界面登录闪退的解决方法 Hello,大家好啊!今天给大家带来一篇关于统信UOS 1070桌面操作系统中,图形界面登录时出现闪退或输入正确的用户名和密码后又跳转回登录界面问题的解决方法的文章。这种问题可能…...

排序(插入,希尔,选择,堆,冒泡,快速,归并,计数)
本文中的Swap()函数都是下面这段代码 // 交换 void Swap(int* p1, int* p2) {int tmp *p1;*p1 *p2;*p2 tmp; }文章目录 常见排序:一.插入排序1.直接插入排序:2.希尔排序: 二.选择排序1.选择排序:2.堆排序: 三.交换排…...

【recast-navigation/源码解析】findStraightPath详解以及寻路结果贴边优化
说在前面 recast-navigation版本:1.6.0 叉积cross product 正常来讲,叉乘为: ∣ A ⃗ B ⃗ ∣ ∣ x A y A x B y B ∣ x A ⋅ y B − x B ⋅ y A |\vec{A} \times \vec{B}|\begin{vmatrix} x_A & y_A \\ x_B & y_B \end{vmatrix…...

移动管家手机智能控制汽车系统
手机可以通过下载特定的应用程序来控制汽车系统,实现远程启动、锁/解锁车门、调节车内温度等功能。 手机智能控制汽车系统主要通过下载并安装特定的APP来实现。 首先,用户需要确定自己的手机系统是安卓还是苹果版,然后前往应用…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...