PyQt5 中的 List View

文章目录

    • 1. 基础概念
    • 2. 创建 List View
      • 2.1 PyQt5 中一个简单的 List View 实例
      • 2.2 代码解释
      • 2.3 运行结果
    • 3. 数据模型
      • 3.1 标准模型
      • 3.2 自定义模型
    • 4. 自定义 List View
      • 4.1 使用样式表 (QSS)
      • 4.2 设置项委托 (Item Delegate)
    • 5.事件处理
    • 6. 与数据交互
      • 6.1 添加数据
      • 6.2 删除数据
      • 6.3 编辑数据
      • 6.4 完整示例
    • 7. 排序与过滤
    • 8. 总结

1. 基础概念

  • 用途
    • List View 是 PyQt5 中用于显示列表数据的重要组件之一。它可以在界面上以列表的形式展示多行数据,通常用于显示诸如文件列表、联系人列表、日程安排等等的数据。
  • 特性
    • List View 具有灵活的布局和显示方式,可以根据需要进行自定义。它支持多种交互方式,比如点击、双击、拖拽等。同时,List View 也支持排序、过滤、编辑等功能,使用户能够更方便地管理和操作列表中的数据。
  • 基本工作原理
    • List View 基于模型-视图架构工作。它通过与数据模型进行交互来显示数据,并且可以使用不同的模型来管理不同类型的数据。List View 通过视图部件以及布局来展示数据,并通过委托来控制每个数据项的显示方式。
  • 视图和模型
    • 在 PyQt5中,List View 是视图(View)部件,用于显示数据;而数据模型(Model)则负责管理数据的存储和操作。通常情况下,可以使用 PyQt5 提供的标准模型(如 QStandardItemModel)来管理数据,也可以自定义模型来满足特定需求。
  • 定制化
    • List View 可以通过设置不同的属性和样式来进行定制化,比如调整行高、列宽、文本颜色、背景色等。此外,还可以通过设置委托(Delegate)来实现更高级的定制化,比如自定义每个数据项的显示方式或交互方式。

2. 创建 List View

2.1 PyQt5 中一个简单的 List View 实例

​ 下面我们用PyQt5 创建一个简单的 List View 实例,并展示一些静态数据

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QListView
from PyQt5.QtCore import QStringListModelclass MyMainWindow(QMainWindow):def __init__(self):super().__init__()# 设置窗口标题和大小self.setWindowTitle("Simple List View Example")self.resize(500, 300)# 创建数据模型并填充数据data = ["Apple", "Banana", "Orange", "Grapes", "Pineapple"]self.model = QStringListModel()self.model.setStringList(data)# 创建 List View 实例并设置数据模型self.list_view = QListView()self.list_view.setModel(self.model)# 创建主窗口布局layout = QVBoxLayout()layout.addWidget(self.list_view)# 创建主窗口部件并设置布局central_widget = QWidget()central_widget.setLayout(layout)self.setCentralWidget(central_widget)if __name__ == "__main__":# 创建应用程序对象app = QApplication(sys.argv)# 创建主窗口对象window = MyMainWindow()# 显示主窗口window.show()# 进入应用程序的主事件循环sys.exit(app.exec_())

2.2 代码解释

  • from PyQt5.QtCore import QStringListModel: 导入 PyQt5 中的 QStringListModel 类,用于管理 List View 的数据模型。
  • self.setWindowTitle("Simple List View Example"): 设置主窗口的标题。
  • self.resize(500, 300): 设置主窗口的大小为宽度 500 像素、高度 300 像素。
  • data = ["Apple", "Banana", "Orange", "Grapes", "Pineapple"]: 定义一个包含静态数据的列表。
  • self.model = QStringListModel(): 创建一个 QStringListModel 对象,用于管理 List View 的数据模型。
  • self.model.setStringList(data): 将静态数据添加到数据模型中。
  • self.list_view = QListView(): 创建一个 QListView 对象,用于显示数据列表。
  • self.list_view.setModel(self.model): 将数据模型设置为 List View 的模型。
  • layout = QVBoxLayout(): 创建一个垂直布局管理器。
  • layout.addWidget(self.list_view): 将 List View 添加到布局中。
  • central_widget = QWidget(): 创建一个 QWidget 对象作为主窗口的中央部件。
  • central_widget.setLayout(layout): 将布局设置为中央部件的布局。
  • self.setCentralWidget(central_widget): 将中央部件设置为主窗口的中央部件。

2.3 运行结果

在这里插入图片描述

3. 数据模型

在 PyQt5 中,数据模型是一种用于管理 List View 中数据的重要概念。数据模型负责存储、组织和操作列表视图中显示的数据。PyQt5 提供了两种主要类型的数据模型:标准模型和自定义模型。

3.1 标准模型

  • PyQt5 提供了一些标准的数据模型类,最常用的是 QStandardItemModel 和 QStringListModel。

  • QStandardItemModel:适用于一般的数据展示,可以存储各种类型的数据,每个数据项都可以包含文本、图标等内容。

  • QStringListModel:专门用于管理字符串列表的数据模型,可以方便地将字符串列表显示在 List View 中。

    from PyQt5.QtCore import QStringListModel# 创建 QStringListModel 数据模型
    model = QStringListModel()# 填充数据到模型中
    data = ["Apple", "Banana", "Orange", "Grapes", "Pineapple"]
    model.setStringList(data)

3.2 自定义模型

  • 有时候,标准模型可能无法满足特定的需求,这时可以自定义数据模型。

  • 自定义模型需要继承自 QAbstractItemModel 类,并实现一些关键的方法,如 data()、rowCount()、columnCount() 等,以便 List View 能够正确地显示数据。

    from PyQt5.QtCore import QAbstractItemModel, QModelIndex, Qt# 自定义数据模型类
    class CustomModel(QAbstractItemModel):def __init__(self, data, parent=None):super().__init__(parent)self.data = datadef rowCount(self, parent=QModelIndex()):return len(self.data)def columnCount(self, parent=QModelIndex()):return 1def data(self, index, role=Qt.DisplayRole):if role == Qt.DisplayRole:return self.data[index.row()]return None# 使用自定义模型
    data = ["Apple", "Banana", "Orange", "Grapes", "Pineapple"]
    model = CustomModel(data)
    

4. 自定义 List View

在 PyQt5 中,自定义 List View 的外观和行为可以通过多种方式实现,包括使用样式表 (QSS)、设置项委托 (Item Delegate) 以及直接修改 List View 的属性。

4.1 使用样式表 (QSS)

样式表类似于 CSS,可以用于修改控件的外观。

from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QListView
from PyQt5.QtCore import QStringListModel
import sysclass MyMainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("Custom List View Example")self.resize(500, 300)# 创建数据模型并填充数据data = ["Apple", "Banana", "Orange", "Grapes", "Pineapple"]self.model = QStringListModel()self.model.setStringList(data)# 创建 List View 实例并设置数据模型self.list_view = QListView()self.list_view.setModel(self.model)# 使用样式表自定义 List View 的外观self.list_view.setStyleSheet("""QListView {background-color: #f0f0f0;alternate-background-color: #e0e0e0;padding: 10px;}QListView::item {height: 40px;}QListView::item:selected {background-color: #a0a0ff;color: white;}""")# 创建主窗口布局layout = QVBoxLayout()layout.addWidget(self.list_view)# 创建主窗口部件并设置布局central_widget = QWidget()central_widget.setLayout(layout)self.setCentralWidget(central_widget)if __name__ == "__main__":app = QApplication(sys.argv)window = MyMainWindow()window.show()sys.exit(app.exec_())

结果如下:

在这里插入图片描述

4.2 设置项委托 (Item Delegate)

项委托可以自定义每个项的绘制和编辑行为。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QListView, QStyledItemDelegate, QStyle
from PyQt5.QtCore import QStringListModel, QRect, QSize, Qt
from PyQt5.QtGui import QPainter, QColor, QFontclass CustomDelegate(QStyledItemDelegate):def paint(self, painter, option, index):painter.save()# 获取当前项的矩形区域rect = option.rect# 检查项的选择状态并设置相应的背景颜色if option.state & QStyle.State_Selected:painter.fillRect(rect, QColor("#D3D3D3"))  # 灰色背景else:painter.fillRect(rect, QColor("#FFFFFF"))  # 白色背景# 获取要显示的文本text = index.data()# 设置自定义字体和颜色font = QFont("Arial", 14)painter.setFont(font)painter.setPen(QColor("#000000"))  # 黑色字体# 绘制文本painter.drawText(rect, Qt.AlignLeft | Qt.AlignVCenter, text)painter.restore()def sizeHint(self, option, index):# 自定义每个项的高度return QSize(option.rect.width(), 40)class MyMainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("Custom List View Example")self.resize(500, 300)# 创建数据模型并填充数据data = ["Apple", "Banana", "Orange", "Grapes", "Pineapple"]self.model = QStringListModel()self.model.setStringList(data)# 创建 List View 实例并设置数据模型self.list_view = QListView()self.list_view.setModel(self.model)# 设置自定义委托self.list_view.setItemDelegate(CustomDelegate())# 创建主窗口布局layout = QVBoxLayout()layout.addWidget(self.list_view)# 创建主窗口部件并设置布局central_widget = QWidget()central_widget.setLayout(layout)self.setCentralWidget(central_widget)if __name__ == "__main__":app = QApplication(sys.argv)window = MyMainWindow()window.show()sys.exit(app.exec_())

运行结果如下:

在这里插入图片描述

5.事件处理

  • 下面例子处理 List View 中的点击事件。

    import sys
    from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QListView, QMessageBox
    from PyQt5.QtCore import QStringListModelclass MyMainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("List View Event Handling Example")self.resize(300, 200)# 创建数据模型并填充数据data = ["Apple", "Banana", "Orange", "Grapes", "Pineapple"]self.model = QStringListModel()self.model.setStringList(data)# 创建 List View 实例并设置数据模型self.list_view = QListView()self.list_view.setModel(self.model)# 连接 List View 的点击事件到相应的处理函数self.list_view.clicked.connect(self.on_item_clicked)# 创建主窗口布局layout = QVBoxLayout()layout.addWidget(self.list_view)# 创建主窗口部件并设置布局central_widget = QWidget()central_widget.setLayout(layout)self.setCentralWidget(central_widget)def on_item_clicked(self, index):# 获取点击项的文本item_text = index.data()# 显示消息框QMessageBox.information(self, "Item Clicked", f"You clicked: {item_text}")if __name__ == "__main__":app = QApplication(sys.argv)window = MyMainWindow()window.show()sys.exit(app.exec_())

    运行结果如下:

    在这里插入图片描述

6. 与数据交互

​ 当与 PyQt5 中的 QListView 进行交互时,可以通过操作数据模型来实现添加、删除和编辑数据等操作。

6.1 添加数据

​ 要向 List View 中添加数据,可以直接修改数据模型。例如,对于 QStringListModel,可以使用 insertRows 方法或 append 方法添加新项。

# 创建数据模型
model = QStringListModel()# 添加新项
new_item = "New Item"
model.insertRows(model.rowCount(), 1)
model.setData(model.index(model.rowCount() - 1), new_item)

6.2 删除数据

​ 删除数据与添加数据类似,也是通过操作数据模型来实现。对于 QStringListModel,可以使用 removeRows 方法删除指定位置的项。

# 删除选定项
selected_index = list_view.selectedIndexes()[0]
model.removeRows(selected_index.row(), 1)

6.3 编辑数据

​ 要编辑 List View 中的数据,需要捕获用户的编辑动作,并更新相应的数据模型。可以通过重载委托类的 setEditorDatasetModelData 方法来实现。

class CustomDelegate(QStyledItemDelegate):def setEditorData(self, editor, index):# 获取当前项的文本text = index.data()# 将文本设置到编辑器中editor.setText(text)def setModelData(self, editor, model, index):# 获取编辑器中的文本text = editor.text()# 更新数据模型model.setData(index, text)

6.4 完整示例

下面是一个完整的示例,演示如何使用 PyQt5 实现添加、删除和编辑 List View 中的数据

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QListView, QPushButton, QLineEdit, QMessageBox, QStyledItemDelegate
from PyQt5.QtCore import QStringListModel, Qtclass CustomDelegate(QStyledItemDelegate):def setEditorData(self, editor, index):# 获取当前项的文本text = index.data()# 将文本设置到编辑器中editor.setText(text)def setModelData(self, editor, model, index):# 获取编辑器中的文本text = editor.text()# 更新数据模型model.setData(index, text)class MyMainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("List View Interaction Example")self.resize(300, 200)# 创建数据模型并填充数据self.model = QStringListModel()self.model.setStringList(["Apple", "Banana", "Orange"])# 创建 List View 实例并设置数据模型self.list_view = QListView()self.list_view.setModel(self.model)self.list_view.setItemDelegate(CustomDelegate())# 创建按钮和文本框self.add_button = QPushButton("Add")self.remove_button = QPushButton("Remove")self.edit_text = QLineEdit()self.add_button.clicked.connect(self.add_item)self.remove_button.clicked.connect(self.remove_item)# 创建主窗口布局layout = QVBoxLayout()layout.addWidget(self.list_view)layout.addWidget(self.add_button)layout.addWidget(self.remove_button)layout.addWidget(self.edit_text)# 创建主窗口部件并设置布局central_widget = QWidget()central_widget.setLayout(layout)self.setCentralWidget(central_widget)def add_item(self):# 获取要添加的文本new_item = self.edit_text.text().strip()if new_item:# 添加新项到数据模型self.model.insertRows(self.model.rowCount(), 1)self.model.setData(self.model.index(self.model.rowCount() - 1), new_item)# 清空文本框self.edit_text.clear()else:QMessageBox.warning(self, "Warning", "Please enter a valid item.")def remove_item(self):# 获取选定项的索引selected_indexes = self.list_view.selectedIndexes()if selected_indexes:# 删除选定项self.model.removeRows(selected_indexes[0].row(), 1)else:QMessageBox.warning(self, "Warning", "Please select an item to remove.")if __name__ == "__main__":app = QApplication(sys.argv)window = MyMainWindow()window.show()sys.exit(app.exec_())

运行结果如下:

在这里插入图片描述

7. 排序与过滤

在 PyQt5 中,可以通过使用 QSortFilterProxyModel 类来实现 List View 的排序和过滤功能。这个类可以作为数据模型的中介,允许对模型中的数据进行排序和过滤,而不改变原始模型的数据。下面是如何在 List View 中实现排序和过滤功能的简要步骤:

步骤概览

  1. 创建原始数据模型:通常使用 QStringListModel 或自定义的模型类。
  2. 创建 QSortFilterProxyModel 对象,并将原始数据模型设置为其源模型。
  3. QSortFilterProxyModel 设置为 List View 的模型。
  4. 设置 QSortFilterProxyModel 的排序和过滤规则。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QListView, QLineEdit, QLabel, QSortFilterProxyModel
from PyQt5.QtCore import QStringListModelclass MyMainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("List View Sorting and Filtering Example")self.resize(300, 200)# 创建原始数据模型并填充数据self.original_model = QStringListModel()self.original_model.setStringList(["Apple", "Banana", "Orange", "Grapes", "Pineapple"])# 创建排序和过滤代理模型self.proxy_model = QSortFilterProxyModel()self.proxy_model.setSourceModel(self.original_model)# 创建 List View 实例并设置模型为代理模型self.list_view = QListView()self.list_view.setModel(self.proxy_model)# 创建文本框和标签用于输入和显示过滤文本self.filter_edit = QLineEdit()self.filter_edit.textChanged.connect(self.filter_items)self.filter_label = QLabel("Filter:")# 创建主窗口布局layout = QVBoxLayout()layout.addWidget(self.filter_label)layout.addWidget(self.filter_edit)layout.addWidget(self.list_view)# 创建主窗口部件并设置布局central_widget = QWidget()central_widget.setLayout(layout)self.setCentralWidget(central_widget)def filter_items(self):# 获取过滤文本filter_text = self.filter_edit.text()# 设置过滤正则表达式self.proxy_model.setFilterRegExp(filter_text)if __name__ == "__main__":app = QApplication(sys.argv)window = MyMainWindow()window.show()sys.exit(app.exec_())

运行结果如下:

在这里插入图片描述

8. 总结

在这篇文章中,我们涵盖了 PyQt5 中 QListView 的各种功能和用法,包括List View 的基本概念,展示了如何使用 PyQt5 创建一个简单的 List View 实例,介绍了如何使用数据模型来管理 List View 中的数据,包括标准模型(如 QStringListModel)和自定义模型,我们讨论了如何自定义 List View 的外观和行为,包括调整行高、列宽、背景色等。我们介绍了如何设置项委托,以自定义 List View 中项的编辑器和显示器。我们讨论了如何处理 List View 中的事件,例如点击,并为这些事件添加相应的处理函数。我们展示了如何在 List View 中实现添加、删除、编辑数据等操作,以及如何使用自定义委托类来编辑数据。最后,我们介绍了如何使用 QSortFilterProxyModel 类来实现 List View 的排序和过滤功能,使用户能够更轻松地查找和管理数据。

总的来说,通过这些内容,读者可以了解到如何有效地使用 PyQt5 中的 QListView 组件,并根据自己的需求进行定制和扩展。

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

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

相关文章

【哈希】Leetcode 205. 同构字符串【简单】

同构字符串 给定两个字符串 s 和 t ,判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上&am…

如何解决 Scrapy 下载图片时的文件名错误问题

在使用 Scrapy 的 ImagesPipeline 下载图片时,有时会遇到因为文件名的问题导致下载失败的情况。本文将详细解释这种错误的原因,并提供一个简单易懂的解决方案,帮助大家避免类似的问题。 问题描述 在下载图片时,如果图片的名字是…

C语言到底怎么学?

C语言到底怎么学? 1、工欲善其事,必先利其器 这里介绍几个华清远见学习C语言必备的工具: VMware、ubuntu。 VMware是一家提供虚拟化软件和解决方案的公司,VMware的旗舰产品是VMware Workstation,这是一种虚拟机软件,…

echers配置项:数据过多时,折叠数据缩放查看

当数据过多时,如上图所示的时间点,会自动折叠,此时鼠标缩放还不起作用,我们配置如下代码 let option {dataZoom: [{startValue: 05:00}, // 这个值需要跟 第一条 时间数据对应上{type: inside}], }配置后,就可以进行…

echers配置项:折线图,折现的颜色修改

如上图所示:红框内的折现颜色修改,并隐藏默认的点 series: [{data: [1, 230, 224, 218, 135, 147, 760,1500,1200,2500,2000],type: line,lineStyle: {color: #00DBFE // 折现颜色},symbol:none, // 不显示点smooth: true, // 折现角度:圆滑…

hadoop生态圈集群搭建(持续更新240513)

Hadoop生态圈 Linux1.修改ip地址2.重启network服务3.安装插件4.关闭防火墙5.创建用户6.创建目录7.修改目录的所属主和所属组为lxy8.修改主机名:hadoop102 (注意名字后面不要加空格)9.修改hosts文件10.等插件都装完后再重启Linux11.把xshell的登录用户换成lxy (注意&…

5W 3KVAC隔离 宽电压输入 AC/DC 电源模块——TP05AL系列

TP05AL系列产品是一款经济型开板式开关电源,输出功率为5W,具有可靠性高、小体积、性价比高等特点,广泛用于工控和电力仪器、仪表、智能家居等相关行业。

通过 Apple Vision Pro 释放创造力:深入研究空间计算

Apple 最新进军空间计算领域的 Apple Vision Pro,标志着重新定义我们与技术交互方式的重大飞跃。空间计算超越了传统界限,允许用户以无缝集成到物理世界的方式参与 2D 和 3D 内容。 我们可以关注两种类型的体验: 在空间中渲染 2D 内容。这涉及将现有设备窗口投影到空间领域…

通过C++和libcurl下载网易云音乐音频文件的5个简单步骤

概述 在网络编程中,使用C和libcurl库下载文件是一项常见的任务。网易云音乐作为中国领先的在线音乐服务平台之一,以其丰富的音乐资源、优质的音质和智能推荐系统而广受欢迎。由于其平台提供了大量的正版音乐资源,用户在下载音频文件时可能会…

开源发布:JAVA版低代码报文网关-通过简单配置快速对接银行渠道

大家好,我是隐墨星辰,自从《百图解码支付系统设计与实现》专栏中的文章《图解支付报文网关:一种低代码报文网关的设计思路与核心代码实现》发表以来,不少同学留言或私信问我如何实现,说是虽然看懂了思路,但…

pycharm 里面安装 codeium 插件的时候,不能够弹出登录界面

pycharm 里面安装 codeium 插件的时候,不能够弹出登录界面 pycharm 里面安装 codeium 插件的时候,不能够弹出登录界面--解决如下A pycharm 里面安装 codeium 插件的时候,不能够弹出登录界面–解决如下 #踩坑/pycharm/codeium插件无法登录 安…

微信联登报invalid code, rid: 66446806-0826d0b4-3a94ce3a ,错误码:40029解决方法

目录 一、问题描述二、问题原因三、解决方法 一、问题描述 微信登录报错: invalid code, rid: 66446806-0826d0b4-3a94ce3a ,错误码:40029二、问题原因 后端设置的 appsecret 和 appid 与前端的 appid 不一致。 三、解决方法 检查是否已…

用Ai编写一个电机驱动程序

问:帮我写一个步进电机的控制程序,要有包括加减速,以及电机步中断处理函数。 答:编写一个步进电机的控制程序涉及到硬件层面的操作,通常需要依赖特定的硬件平台和相应的驱动程序。以下是一个简化的示例,它展…

制氧机负离子的作用与好处深度解析

随着现代生活节奏的加快,空气质量逐渐下降,人们对健康生活的追求也日益增强。在这样的背景下,制氧机负离子功能因其多重健康效益而备受关注。本文将深入探讨制氧机负离子的作用与功效,帮助大家更好地了解并应用这一健康科技。 我们…

单片机烧录程序时“DTR的低电平复位,RTS高电平进入bootloader”有关的串口Modem联络信号

烧录程序时常见DTR和RTS引脚 参考,参考视频 因为常常使用的都是串口下载程序,常用的芯片CH340系列,下图中标红的引脚是MODEM联络信号,其中常见的DTR和RTS就是常见的串口Modem网络输出信号,也就是通过烧录软件控制的接…

VUE v-for中修改data数据

有个需求,要求使用v-for生成序号,但是中间可能会中断,例如: 1 2 3 4 (此行无序号) 5 6 (此行无序号) (此行无序号) (此行无序号) 7 8 ...... 想着这还不简单,只要在data中定义一个变量,然后每次调用时就行…

CMMI3认证如何升级为CMMI5认证

众所周知,CMMI认证体系共分为五个等级,一级最低,五级最高。企业初次申报一般从三级做起,在这个等级水平上,企业在项目研发管理方面已经具备一定的规范程度,对企业的过程改进有着显著成效,在同行…

wps本地js宏基础语句

IF语句 //str.indexOf("")的值为-1时表示不包含 function 是否包含关键字(){var str "陈表达真是个大帅哥";if(str.indexOf("大") ! -1){alert("是的,他是非常大");} }//str.includes("")返回一个布尔值&#x…

深入解析Wireshark1:从捕获到分析,一网打尽数据包之旅

目录 1 认识 Wireshark 1.1 选择网卡界面 1.2 捕获数据包界面 1.3 常用按钮功能介绍 1.4 数据包列表信息 1.5 数据包详细信息 2 数据包案例分析 Frame: 物理层的数据帧概况 Ethernet II: 数据链路层以太网帧头部信息 Internet Protocol Version 4 (IPv4): 互联网层IP…

Git系列:git restore 高效恢复代码的技巧与实践

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…