PyQt常用控件的使用:QFileDialog、QMessageBox、QTreeWidget、QRadioButton等

文章目录

  • 一、控件常用函数介绍
  • 二、QFileDialog(文件类操作)
  • 三、QMessageBox(对话框)
  • 四、QTreeWidget(树结构类操作)
    • 4.1 树结构的初始化
    • 4.2 递归读取完整树结构
    • 4.3 两QTreeWidget滑轮同步滑动
    • 4.4 信号槽绑定
  • 五、QCombox改写下拉多勾选框
  • 六、QRadioButton(单选按钮控件)
  • 七、QTextEdit(多行文本框)

一、控件常用函数介绍

常用函数

函数功能
setText(txt)设置内容
text()获取内容
setEnabled(bool)使按钮失效
setCheckable(bool)设置为可选状态
setChecked(bool)设置按钮状态
(如果是按钮需要先设置setCheckable状态)
isChecked()获取按钮状态
(如果是按钮则需要先设置setCheckable状态)
setIcon(QIcon(QPixmap(“icon.jpg”)))设置图标
setIconSizeQSize(100, 100)设置图标的大小
setShortcut(“Alt+O”)设置快捷键
setStyleSheet(“x:x;x:x;”)设置样式(CSS)
setToolTip(text)设置气泡(悬停提示)

常见事件绑定函数

函数功能
clicked.connect()按钮单击(QPushButton, QRadioButton)
currentIndexChanged.connect()下拉框内容变化(QComboBox)
triggered.connect()菜单键点击(QAction)
setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
customContextMenuRequested.connect()
选项右击(QTreeWidget,自带参数pos)

部分函数默认自带参数,如果要额外带些参数,编写方式如下

self.tree_widget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.tree_widget.customContextMenuRequested.connect(lambda pos: self.right_clicked_tree(pos, "abc"))# pos为自带参数,txt为自定义参数
def right_clicked_tree(self, pos, txt):pass

二、QFileDialog(文件类操作)

QFileDialog:是 PyQt/PySide 中用于文件选择的标准对话框组件,它提供了打开/保存文件、选择目录等功能接口
选择创建文件。

获取文件路径
file_path, selected_filter = QFileDialog.getOpenFileName(parent=None, caption='', directory='', filter='',options=QFileDialog.Options())

参数:
parent:QWidget 父窗口,通常传入 self 或 None
caption:对话框标题
directory:初始显示目录(空字符串表示当前目录)
filter:文件类型过滤器
options:额外选项配置
返回值:
file_path:用户选择的文件路径(字符串),如果取消则为空字符串
selected_filter:用户选择的过滤器

from PyQt5.QtWidgets import QFileDialogfile_path, _ = QFileDialog.getOpenFileName(self, 'Open File', 'E:/Code', 'Text Files(*.txt *.csv);;All Files(*)')
if file_path:print("选择的文件:", file_path)

获取保存文件路径
file_path, selected_filter = QFileDialog.getSaveFileName(parent=None, caption='', directory='', filter='', options=QFileDialog.Options())

参数:
parent:QWidget 父窗口,通常传入 self 或 None
caption:对话框标题
directory:初始显示目录(空字符串表示当前目录)
filter:文件类型过滤器
options:额外选项配置
返回值:
file_path:指定的保存路径(字符串),如果取消则为空字符串
selected_filter:用户选择的过滤器

from PyQt5.QtWidgets import QFileDialogsave_path, filter_used = QFileDialog.getSaveFileName(None,"导出数据","data_export","CSV文件 (*.csv);;JSON文件 (*.json)")
if save_path:pass

获取文件夹路径
directory = QFileDialog.getExistingDirectory(parent=None, caption='', directory='', options=QFileDialog.Options())

参数:
parent:QWidget 父窗口,通常传入 self 或 None
caption:对话框标题
directory:初始显示目录(空字符串表示当前目录)
options:额外选项配置
返回值:
file_path:选择的目录路径(字符串),如果取消则为空字符串
dir_path = QFileDialog.getExistingDirectory( None, “选择目录”, “”)

from PyQt5.QtWidgets import QFileDialogfile_path = QFileDialog.getExistingDirectory(self, 'Open File', 'E:/Code')
if file_path:self.edit.setText(file_path)

三、QMessageBox(对话框)

QMessageBox:是PyQt/PySide中用于显示消息对话框的类,可以用来显示信息、警告、错误或提问。以下是QMessageBox的详细使用方法

QMessageBox常规用法:

from PyQt5.QtWidgets import QMessageBox# 显示一个简单的信息对话框
QMessageBox.information(None, "标题", "这是一条信息消息")    # None可以是QWidget	父窗口 即QWidget窗口时使用self# 显示警告对话框
QMessageBox.warning(None, "警告", "这是一个警告消息")# 显示错误对话框
QMessageBox.critical(None, "错误", "这是一个错误消息")# 显示提问对话框(最后一个参数为默认选项)
reply = QMessageBox.question(None, "问题", "你确定要继续吗?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:print("用户选择了是")
else:print("用户选择了否")

QMessageBox自定义用法:

图标类型含义
QMessageBox.NoIcon无图标
QMessageBox.Question问题图标
QMessageBox.Information信息图标
QMessageBox.Warning警告图标
QMessageBox.Critical错误图标
按钮类型
QMessageBox.Ok
QMessageBox.Open
QMessageBox.Save
QMessageBox.Cancel
QMessageBox.Close
QMessageBox.Yes
QMessageBox.No
QMessageBox.Abort
QMessageBox.Retry
QMessageBox.Ignore
msg_box = QMessageBox()
msg_box.setIcon(QMessageBox.Information)  # 设置图标类型
msg_box.setWindowTitle("自定义对话框")    # 设置标题
msg_box.setText("这是主要消息")           # 设置主要文本
msg_box.setInformativeText("这是附加信息") # 设置附加信息
msg_box.setDetailedText("这是详细文本\n可以有多行") # 设置详细文本# 添加自定义按钮
msg_box.addButton("自定义按钮1", QMessageBox.AcceptRole)
msg_box.addButton("自定义按钮2", QMessageBox.RejectRole)# 显示对话框
ret = msg_box.exec_()if ret == QMessageBox.AcceptRole:print("点击了自定义按钮1")
else:print("点击了其他按钮")

四、QTreeWidget(树结构类操作)

QTreeWidget:是PyQt中用于显示树形结构数据的重要组件,它继承自QTreeView,提供了更简单易用的接口来处理树状数据。常用函数如下:

函数含义
root_tree.setColumnCount(2)设置列数(两列)
root_tree.setHeaderLabels([“名称”, “类型”])设置列标题
root_tree.setColumnWidth(0, 200)设置列宽(第一列宽度200)
root_tree.header().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)列宽自适应
root_tree.expandAll()全部展开
root_tree.collapseAll()全部收起
root_tree.invisibleRootItem().childCount()获取根节点的子节点数
root_tree.invisibleRootItem().child(i)获取根节点的某个子节点
item.childCount()获取当前节点的子节点数
item.child(i)获取当前节点的某个子节点
item.setText(0, “根节点”)设置内容
item.setIcon(0, QIcon(“”))设置图片
item.setCheckState(0, QtCore.Qt.Unchecked)设置选中状态
item.checkState(0)获取选中状态(参数表示哪列)
item.text(0)获取某列内容(参数表示哪列)
item.parent().text(column)获取父节点内容(参数表示哪列)

4.1 树结构的初始化

# 创建QTreeWidget对象
self.tree_widget = QTreeWidget()# 设置列数、列标题、列宽
self.tree_widget.setColumnCount(2)
self.tree_widget.setHeaderLabels(["名称", "类型"])
self.tree_widget.setColumnWidth(0, 200)
self.tree_widget.setColumnWidth(1, 150)
# self.tree_widget.header().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)  # 列宽自适应# 添加数据项(父节点)
root_item = QTreeWidgetItem(self.tree_widget)
root_item.setText(0, "根节点")
root_item.setText(1, "文件夹")
root_item.setCheckState(0, QtCore.Qt.Unchecked)  # 设置勾选状态(不勾选)  可省略# 添加数据项(子节点)
child_item = QTreeWidgetItem(root_item)
child_item.setText(0, "子节点1")
child_item.setText(1, "文件")
child_item.setCheckState(0, QtCore.Qt.Unchecked)  # 设置勾选状态(不勾选)  可省略self.tree_widget.expandAll()      # 所有节点展开
self.tree_widget.collapseAll()    # 所有节点收起

4.2 递归读取完整树结构

# 创建QTreeWidget实例
tree_widget = QTreeWidget()    # 初始化...略
# 获取不可见的根项
root = tree_widget.invisibleRootItem()
for i in range(root.childCount()):item = root.child(i)read_tree_item(item)def read_tree_item(item):"""递归读取树形项及其子项"""select_status = item.checkState(0)  # 获取勾选状态 (参数表示列索引)# 遍历读取每列信息for col in range(item.columnCount()):print(item.text(col))# 递归处理子项for child_index in range(item.childCount()):child = item.child(child_index)read_tree_item(child)

4.3 两QTreeWidget滑轮同步滑动

# 创建并初始化
self.tree1 = QtWidgets.QTreeWidget()
self.tree2 = QtWidgets.QTreeWidget()
for i in range(100):QtWidgets.QTreeWidgetItem(self.tree1).setText(0, str(i))QtWidgets.QTreeWidgetItem(self.tree2).setText(0, str(i))# 获取水平滚动条
scoll1 = self.tree1.verticalScrollBar()
scoll2 = self.tree2.verticalScrollBar()
# 同步滚动
scoll1.valueChanged.connect(lambda val: scoll2.setValue(val))
scoll2.valueChanged.connect(lambda val: scoll1.setValue(val))

4.4 信号槽绑定

函数含义
itemSelectionChanged.connect()项选择变化
itemClicked.connect()项被点击
itemDoubleClicked.connect()项被双击
itemExpanded.connect()项展开
itemCollapsed.connect()项折叠
itemChanged.connect()项内容编辑
setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
customContextMenuRequested.connect(self.right_clicked_tree)
右击事件
itemChanged.connect()勾选状态变化事件

单击事件

self.tree_widget.itemClicked.connect(self.clicked_item)def clicked_item(self, item, column):  # item: 点击项   column:列if item:# 当前节点信息item_text = item.text(column)   # item.text(0)# 获取父节点信息if item.parent():parent_text = item.parent().text(column)# 获取子节点信息for child_index in range(item.childCount()):child_text = item.child(child_index).text(column)

双击事件

self.tree_widget.itemDoubleClicked.connect(self.double_clicked_item)def double_clicked_item(self, item, column):  # item: 点击项   column:列if item:# 当前节点信息item_text = item.text(column)   # item.text(0)# 获取父节点信息if item.parent():parent_text = item.parent().text(column)# 获取子节点信息for child_index in range(item.childCount()):child_text = item.child(child_index).text(column)

勾选状态事件

self.tree_widget.itemChanged.connect(self.item_changed)def item_changed(self, item, column):  # item: 点击项   column:列if item.checkState(0) == Qt.Checked:print(f"项目 {item.text(0)} 被选中")else:print(f"项目 {item.text(0)} 取消选中")

右击菜单栏

如实现右击弹出菜单栏,将当前选选项移除

# 右击绑定事件
self.tree_widget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.tree_widget.customContextMenuRequested.connect(self.right_clicked_tree)def right_clicked_tree(self, pos):item = self.tree_widget.itemAt(pos)if item:menu = QMenu(self.tree_widget)remove_item = QAction("remove", self.tree_widget)remove_item.triggered.connect(lambda: self.remove_item(item))   # 移除事件绑定menu.addAction(remove_item)menu.exec_(QtGui.QCursor.pos())# 移除当前项
def remove_item(self, item):if item.parent():item.parent().removeChild(item)else:index = self.tree_widget.indexOfTopLevelItem(item)self.tree_widget.takeTopLevelItem(index)

一般来说,直接使用Menu,对选项右击也会出发事件,这是需要对menu进行部分函数封装改写,忽略右击对菜单栏选项操作

class MyMenu(QtWidgets.QMenu):# 忽略右击选项def mousePressEvent(self, event):if event.button() == QtCore.Qt.LeftButton:super().mousePressEvent(event)else:event.ignore()

五、QCombox改写下拉多勾选框

一般来说QCombox只支持下拉选择一项选择,这里继承QCombox类,并对其封装改写,实现下拉多选框,即:可以选择多个选项,代码如下(这里添加了一个全选选项,需要放在开头)

from PyQt5.QtWidgets import QComboBox
from PyQt5.QtCore import Qt, QEvent
from PyQt5.QtGui import QFontMetrics, QStandardItemclass MyComboBox(QComboBox):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.setEditable(True)self.lineEdit().setReadOnly(True)self.model().dataChanged.connect(self.updateText)self.lineEdit().installEventFilter(self)self.view().viewport().installEventFilter(self)self.updateText()def eventFilter(self, object, event):if object == self.lineEdit():if event.type() == QEvent.MouseButtonRelease:self.shwPopup()return Falseif object == self.view().viewport():if event.type() == QEvent.MouseButtonRelease:index = self.view().indexAt(event.pos())item = self.model().item(index.row())if item.text() == "ALL" and item.checkState() == Qt.Checked:[self.model().item(i).setCheckState(Qt.Unchecked) for i in range(self.model().rowCount())]elif item.text() == "ALL":[self.model().item(i).setCheckState(Qt.Checked) for i in range(self.model().rowCount())]else:item.setCheckState(Qt.Unchecked if item.checkState() == Qt.Checked else Qt.Checked)self.model().item(0).setCheckState(Qt.Unchecked)for i in range(1, self.model().rowCount()):if self.model().item(i).checkState() != Qt.Checked:self.model().item(i).setCheckState(Qt.Unchecked)return Trueself.model().item(0).setCheckState(Qt.Checked)return Truereturn Falsedef updateText(self):text = ".".join([self.model().item(i).text() for i in range(self.model().rowCount())if self.model().item(i).checkState() == Qt.Checked])elidedText = QFontMetrics(self.lineEdit().font()).elidedText(text, Qt.ElideRight, self.lineEdit().width())self.lineEdit().setText(elidedText)def addItem(self, text, data=None):item = QStandardItem()item.setText(text)item.setFlags(Qt.ItemIsEnabled|Qt.ItemIsUserCheckable)item.setData(Qt.Unchecked, Qt.CheckStateRole)self.model().appendRow(item)self.lineEdit().setText("")def currentText(self):res = [self.model().item(i).text() for i in range(self.model().rowCount())if self.model().item(i).checkState() == Qt.Checked]return res

六、QRadioButton(单选按钮控件)

QRadioButton是PyQt中常用的单选按钮控件,用于让用户在多个互斥选项中选择一个
(注:下方省略了将按钮放入布局中)

创建单选按钮并绑定信号

from PyQt5.QtWidgets import QRadioButton# 创建单选按钮
radio1 = QRadioButton("选项1")
radio2 = QRadioButton("选项2")# 设置默认选中
radio1.setChecked(True)# 信号绑定
radio1.clicked.connect(self.on_radio_clicked)
radio2.clicked.connect(self.on_radio_clicked)
def on_radio_clicked(self):if radio1.isChecked():print("选项1被选中")elif radio2.isChecked():print("选项2被选中")

创建两组单选按钮组

from PyQt5.QtWidgets import QButtonGroup# 创建按钮组一:二选一
button_group1 = QButtonGroup()
radio1 = QRadioButton("选项1")
button_group.addButton(radio1)
radio2 = QRadioButton("选项2")
button_group.addButton(radio2)
radio1.setChecked(True)  # 默认选中# 创建按钮组二:二选一
button_group2 = QButtonGroup()
radio3 = QRadioButton("选项3")
button_group2.addButton(radio3, 3)
radio4 = QRadioButton("选项4")
button_group2.addButton(radio4, 4)
radio3.setChecked(True)  # 默认选中# 按钮组事件绑定
button_group1.buttonClicked.connect(self.on_radio_group_clicked)
def on_radio_group_clicked(self, button):print(f"选中了: {button.text()}")# id识别按钮  绑定按钮组的idClicked信号
button_group.idClicked.connect(self.on_radio_group_id_clicked)
def on_radio_group_id_clicked(self, id):print(f"选中了ID为 {id} 的按钮")# 单个按钮事件绑定同上,略

七、QTextEdit(多行文本框)

QTextEdit是PyQt中用于多行文本编辑的控件,支持富文本格式(HTML)、纯文本和高级文本编辑功能

函数含义
toPlainText()获取纯文本
append()在末尾添加文本
clear()清空文本
setHtml()设置HTML富文本
currentCharFormat()获取当前文本格式
setReadOnly(True)设置为只读
setLineWrapMode(QTextEdit.NoWrap)不自动换行
setTabStopDistance(40)设置Tab键宽度(像素)
find()查找文本
textChanged.connect文本改变时触发
cursorPositionChanged.connect光标位置改变时触发
selectionChanged.connect选中文本改变时触发
self.line_edit = QtWidgets.QTextEdit()
self.layout.addWidget(self.line_edit)# 追加内容
self.line_edit.append("hello")
# 获取存文本
txt = self.line_edit.toPlainText()# 设置文字样式并追加到末尾
txt_format = QtGui.QTextCharFormat()
txt_format.setFontWeight(QtGui.QFont.Bold)     # 加粗
txt_format.setFontItalic(True)                 # 斜体
txt_format.setFontUnderline(True)              # 下划线
txt_format.setForeground(QtGui.QColor('red'))  # 文字颜色
cursor = self.line_edit.textCursor()
cursor.movePosition(QtGui.QTextCursor.End)
cursor.setCharFormat(txt_format)
cursor.insertText("hello")
self.line_edit.setTextCursor(cursor)

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

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

相关文章

校园导航系统核心技术解析:高精度定位与 AR 实景导航的应用实践

本文面向校园信息化建设者、技术开发者及教育行业数字化转型关注者,旨在解析如何通过 “高精度定位 AR/VR 场景化服务” 技术体系,破解校区因建筑复杂、人流密集导致的寻路效率低下问题,探讨如何利用现有技术解决校园内导航难题,…

java大文件分段下载

后端代码 package com.jy.jy.controller;import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.a…

antd-vue - - - - - a-table排序

antd-vue - - - - - a-table排序 1. 重点代码:2. 代码示例:3. 进阶版写法 1. 重点代码: sorter: {compare: (a, b) > a.columnsKeys - b.columnsKeys,multiple: 1, },解析: compare: 自定义排序函数,用于比较两个对象。 multiple: 排序优…

【AI】模型vs算法(以自动驾驶为例)

模型vs算法(以自动驾驶为例) 一、自动驾驶的核心任务二、以自动驾驶为例,模型vs算法的实际分工1. 感知环节:“看懂”周围环境(如识别行人、车道线、车辆)2. 预测环节:“预判”其他交通参与者的行…

机器学习与深度学习19-线性代数02

目录 前文回顾6.协方差矩阵与主成分分析7.矩阵的奇异值分解8.神经网络的前向传播和反向传播9.矩阵的迹10.特征工程的多项式特征扩展 前文回顾 上一篇文章链接:地址 6.协方差矩阵与主成分分析 协方差矩阵是一个对称矩阵,用于衡量随机变量之间的线性相关…

青藏高原ASTER_GDEM数据集(2011)

共享方式:开放获取数据大小:73.69 GB数据时间范围:2012-04-08 — 2012-05-08元数据更新时间:2021-10-15 数据集摘要 ASTER Global Digital Elevation Model (ASTER GDEM)是美国航空航天局 (NAS…

代码随想录训练营二十六天| 654.最大二叉树 617.合并二叉树 700.二叉搜索树的搜索 98.验证二叉搜索树

654.最大二叉树: 文档讲解:代码随想录|654.最大二叉树 视频讲解:又是构造二叉树,又有很多坑!| LeetCode:654.最大二叉树_哔哩哔哩_bilibili 状态:已做出 思路: 这道题目要求使用给定…

临时抱佛脚v2

术语解释 多范式 (Multi-paradigm) 指支持多种编程范式,如面向对象编程和函数式编程,允许开发者根据需求选择最合适的风格。 函数式编程 (Functional Programming) 一种编程范式,将计算视为数学函数的求值,强调不变性、无副作用…

MCGS和1200plc变量表格式编辑

设备编辑窗口---设备信息导出---另存为xx.CSV文件 在上面导出的表格基础上编辑 本体位的编辑: db数据块位编辑 db数据块int类型 (4.14应改为4.140,0不省略) db数据块real类型 通道号,地址均按顺序排列 ,寄存期地址最后一位0不能省略&#…

Android高性能音频与图形开发:OpenSL ES与OpenGL ES最佳实践

引言 在移动应用开发中,音频和图形处理是提升用户体验的关键要素。本文将深入探讨Android平台上两大核心多媒体API:OpenSL ES(音频)和OpenGL ES(图形),提供经过生产环境验证的优化实现方案。 …

GaussDB分布式数据库调优方法总结:从架构到实践的全链路优化指南

GaussDB分布式数据库调优方法总结:从架构到实践的全链路优化指南 GaussDB作为华为自主研发的分布式数据库,基于MPP(大规模并行处理)架构设计,支持存储与计算分离、列存/行存混合引擎、向量化执行等核心技术&#xff0…

NLP学习路线图(三十九):对话系统

在人工智能领域,自然语言处理(NLP)无疑是推动人机交互革命的核心引擎。当清晨的闹钟响起,你轻声一句“小爱同学,关掉闹钟”;当开车迷路时说“嘿Siri,导航到最近加油站”;当深夜向客服机器人询问订单状态时——我们已在不知不觉中与对话系统建立了千丝万缕的联系。这类系…

Cambridge Pixel为警用反无人机系统(C-UAS)提供软件支持

警用 C-UAS 系统受益于 Cambridge Pixel 和 OpenWorks Engineering 的技术合作。 作为雷达数据处理和雷达目标跟踪的专家公司,Cambridge Pixel宣布与OpenWorks Engineering 合作,为警用系统提供先进的C-UAS系统。OpenWorks Engineering以创新的光学系统和…

【ArcGIS Pro微课1000例】0072:如何自动保存编辑内容及保存工程?

文章目录 一、自动保存编辑内容二、自动保存工程在使用ArcGIS或者ArcGIS Pro时,经常会遇到以下报错,无论点击【发送报告】,还是【不发送】,软件都会强制退出,这时如果对所操作没有保存,就会前功尽弃。 此时,自动保存工作就显得尤为重要,接下来讲解两种常见的自动保存方…

进行性核上性麻痹健康护理指南:全方位照护之道

进行性核上性麻痹(PSP)是一种罕见的神经系统变性疾病,会严重影响患者的生活质量。做好健康护理,能在一定程度上缓解症状,提高患者生活质量。 ​饮食护理是基础。患者常伴有吞咽困难,饮食应选择质地均匀、易…

第二节:Vben Admin v5 (vben5) Python-Flask 后端开发详解(附源码)

目录 前言项目准备项目结构应用创建应用工厂`vben5-admin-backend/app/__init__.py` 文件`vben5-admin-backend/app/config.py` 文件`vben5-admin-backend/app/.env` 文件`vben5-admin-backend/app/logging_config.py` 文件`vben5-admin-backend/app/start.py` 文件`vben5-admi…

从零打造前沿Web聊天组件:从设计到交互

作者现在制作一款网页端聊天室(青春版),之前一直有这个想法,现在总算是迈出了第一步开始制作了… 雄关漫道真如铁,而今迈步从头越! 启程 当前已经完成左侧聊天室列表显示,通过http://localhos…

计算机网络 : 传输层协议UDP与TCP

计算机网络 : 传输层协议UDP与TCP 目录 计算机网络 : 传输层协议UDP与TCP引言1. 传输层协议UDP1.2 UDP协议段格式1.3 UDP的特点1.4 面向数据报1.5 UDP的缓冲区1.6 基于UDP的应用层协议及使用注意事项 2. 传输层协议TCP2.1 再谈端口号2.2 TCP协议段格式2.…

Java高频面试之并发编程-27

hello啊,各位观众姥爷们!!!本baby今天又来报道了!哈哈哈哈哈嗝🐶 面试:详细说说AtomicInteger 的原理 AtomicInteger 的原理详解 AtomicInteger 是 Java 并发包 (java.util.concurrent.atomic)…

冒险岛的魔法果实-多重背包

问题描述 在冒险岛的深处,小萌探索到了一个传说中的魔法果实园。这里满是各种神奇的魔法果实,吃了可以增加不同的魔法能量。 小萌想带一些魔法果实回去,但是他的背包空间有限。看着这些琳琅满目的魔法果实,小萌很是纠结&#xf…