网站的备案号,百度知道个人中心,游戏官网制作,网站建设开发服务费税率文章目录 PyQt5入门级超详细教程前言第4部分#xff1a;事件处理与信号槽机制4.1 什么是信号与槽#xff1f;4.2 信号与槽的基本用法4.3 信号与槽的基础示例代码详解#xff1a; 4.4 处理不同的信号代码详解#xff1a; 4.5 自定义信号与槽代码详解#xff1a; 4.6 信号槽… 文章目录 PyQt5入门级超详细教程前言第4部分事件处理与信号槽机制4.1 什么是信号与槽4.2 信号与槽的基本用法4.3 信号与槽的基础示例代码详解 4.4 处理不同的信号代码详解 4.5 自定义信号与槽代码详解 4.6 信号槽的高级用法4.7 总结 第5部分文件对话框与文件处理5.1 什么是文件对话框为什么使用 QFileDialog 5.2 使用 QFileDialog 打开文件示例 1打开文本文件并显示内容代码详解 5.3 文件类型过滤器5.4 使用 QFileDialog 保存文件示例 2保存文本到文件代码详解 5.5 多文件选择示例 3多文件选择代码详解 5.6 总结 第6部分表格控件 QTableWidget 与数据展示6.1 什么是 QTableWidget6.2 如何创建一个简单的 QTableWidget示例 1创建简单的表格控件代码详解 6.3 动态填充 QTableWidget示例 2从列表动态填充表格代码详解 6.4 使用 pandas 与 QTableWidget示例 3使用 pandas 填充 QTableWidget代码详解 6.5 从文件动态填充 QTableWidget示例 4从 CSV 文件填充表格代码详解 6.6 总结 4-6部分总结 PyQt5入门级超详细教程
前言
接序篇【Python篇】PyQt5 超详细教程——由入门到精通序篇
建议把代码复制到pycharm等IDE上面看实际效果方便理解嗷❤️
第4部分事件处理与信号槽机制 4.1 什么是信号与槽
在 PyQt5 中信号Signal 和 槽Slot 是处理事件和交互的核心机制。信号代表某个事件的发生而槽是信号触发后执行的函数。
信号信号是控件发出的消息用来通知外界某个事件的发生。例如按钮被点击时会发出一个 clicked 信号。槽槽是一个函数负责响应信号。当一个信号发出时它会调用与其关联的槽函数。
通过信号与槽机制PyQt5 实现了控件之间的松散耦合让事件处理更加灵活。 4.2 信号与槽的基本用法
我们可以通过以下步骤使用信号与槽机制
创建一个控件如按钮、文本框等。连接控件的信号到一个槽函数通常是你定义的函数。当信号触发时调用相应的槽函数来执行操作。 4.3 信号与槽的基础示例
示例 1按钮点击事件
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
import sysclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle(信号与槽示例)# 创建一个按钮button QPushButton(点击我, self)# 将按钮的 clicked 信号连接到自定义槽函数button.clicked.connect(self.button_clicked)# 设置按钮为中央控件self.setCentralWidget(button)def button_clicked(self):# 按钮点击后执行的操作print(按钮被点击)app QApplication(sys.argv)
window MainWindow()
window.show()
sys.exit(app.exec_())代码详解
button.clicked.connect(self.button_clicked) 这是信号与槽的核心部分。clicked 信号是 QPushButton 控件自带的信号当按钮被点击时信号会被触发。通过 connect() 方法我们将这个信号连接到自定义的槽函数 button_clicked这样当按钮被点击时程序会执行这个槽函数。 self.button_clicked() 这是槽函数它在按钮被点击时执行。这个函数中可以定义任何逻辑比如打印消息、打开窗口或其他操作。 4.4 处理不同的信号
PyQt5 中每个控件都有多个内置信号。例如QLineEdit文本输入框控件有 textChanged 信号表示文本发生了改变。
示例 2处理文本输入框的信号
from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit
import sysclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle(QLineEdit 信号示例)# 创建文本输入框self.line_edit QLineEdit(self)# 连接文本改变的信号到自定义槽函数self.line_edit.textChanged.connect(self.text_changed)# 设置文本输入框为中央控件self.setCentralWidget(self.line_edit)def text_changed(self, text):# 当用户修改文本时显示当前输入的内容print(f用户输入: {text})app QApplication(sys.argv)
window MainWindow()
window.show()
sys.exit(app.exec_())代码详解
self.line_edit.textChanged.connect(self.text_changed) 这里我们连接了 QLineEdit 控件的 textChanged 信号该信号会在用户每次修改文本时触发。每当用户输入或删除文本时程序都会调用槽函数 text_changed。 self.text_changed(text) 这是槽函数参数 text 是用户当前输入的内容。当文本内容改变时这个槽函数会被自动调用并打印出用户输入的文本。 4.5 自定义信号与槽
有时候PyQt5 提供的内置信号并不能满足所有需求。在这种情况下你可以自定义信号并将它们与槽函数关联起来。
示例 3自定义信号
from PyQt5.QtCore import QObject, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
import sys# 创建一个自定义的类继承自 QObject
class Communicate(QObject):# 定义一个自定义信号my_signal pyqtSignal()class MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle(自定义信号示例)# 创建按钮button QPushButton(触发自定义信号, self)button.clicked.connect(self.emit_custom_signal) # 连接按钮点击事件# 创建自定义信号对象self.comm Communicate()# 连接自定义信号到槽函数self.comm.my_signal.connect(self.custom_slot)# 设置按钮为中央控件self.setCentralWidget(button)def emit_custom_signal(self):# 触发自定义信号self.comm.my_signal.emit()def custom_slot(self):# 自定义信号触发时执行的操作print(自定义信号被触发)app QApplication(sys.argv)
window MainWindow()
window.show()
sys.exit(app.exec_())代码详解
自定义信号 我们创建了一个 Communicate 类继承自 QObject。在这个类中我们定义了一个信号 my_signal使用 pyqtSignal() 方法来创建。 触发自定义信号 当按钮被点击时我们调用 self.comm.my_signal.emit() 触发自定义信号。随后这个信号会调用关联的槽函数 custom_slot。 自定义槽函数 当自定义信号被触发时custom_slot() 会执行并打印消息。 4.6 信号槽的高级用法 信号传递参数大部分 PyQt5 内置信号都会传递参数。例如textChanged 信号会传递当前文本内容currentIndexChanged 信号会传递选中的下标。 断开信号与槽的连接可以通过 disconnect() 方法断开信号与槽的连接。 button.clicked.disconnect(self.button_clicked)4.7 总结
在这一部分中我们详细介绍了 PyQt5 的 信号与槽机制这是 PyQt5 应用程序事件处理的核心。通过信号与槽机制你可以让应用程序的控件彼此交互实现复杂的用户界面行为。
关键点回顾
信号表示事件的发生例如按钮点击、文本改变等。槽信号触发后调用的函数用来处理具体的逻辑。自定义信号你可以根据需要创建自己的信号并将它们与槽函数关联。 第5部分文件对话框与文件处理 5.1 什么是文件对话框
在桌面应用程序中用户经常需要与文件系统交互例如打开文件、保存文件、选择文件夹等。为了让用户选择文件或保存文件PyQt5 提供了一个标准化的控件叫做 QFileDialog。QFileDialog 是一个弹出窗口允许用户通过系统文件浏览器来选择或保存文件。
为什么使用 QFileDialog
用户体验友好用户可以通过系统的文件浏览器来选择文件而不是手动输入路径。跨平台一致性QFileDialog 使用了操作系统的原生文件对话框确保了跨平台的一致性。多功能性你可以自定义文件类型过滤器只允许用户选择特定类型的文件。 5.2 使用 QFileDialog 打开文件
我们将从如何使用 QFileDialog 打开文件并读取文件内容开始。这个过程包括
弹出文件对话框供用户选择文件。读取用户选择的文件内容并将其展示在应用程序中。
示例 1打开文本文件并显示内容
import sys # 系统模块用于控制程序退出
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QFileDialog, QTextEdit# 创建一个主窗口类
class MainWindow(QMainWindow):def __init__(self):super().__init__() # 调用父类的初始化方法self.setWindowTitle(文件对话框示例) # 设置窗口标题# 创建一个按钮self.button QPushButton(打开文件, self)self.button.clicked.connect(self.open_file) # 连接按钮点击事件# 创建一个文本编辑框用于显示文件内容self.text_edit QTextEdit(self)# 设置窗口布局self.setCentralWidget(self.button) # 初始显示按钮# 打开文件的函数def open_file(self):# 弹出文件对话框让用户选择文件file_name, _ QFileDialog.getOpenFileName(self, 选择文件, , 文本文件 (*.txt);;所有文件 (*))# 检查用户是否选择了文件if file_name:# 打开文件并读取内容with open(file_name, r, encodingutf-8) as f:file_content f.read() # 读取文件内容# 将文件内容显示在文本编辑框中self.text_edit.setText(file_content)self.setCentralWidget(self.text_edit) # 切换显示文本编辑框# 创建应用程序对象
app QApplication(sys.argv)# 创建主窗口对象
window MainWindow()
window.show()# 进入应用程序事件循环
sys.exit(app.exec_())代码详解 QFileDialog.getOpenFileName() 功能弹出一个文件对话框让用户选择文件。它返回两个值 file_name 是用户选择的文件的路径。_ 是过滤器信息我们暂时不需要用到它因此使用 _ 来忽略。 文件类型过滤器文本文件 (*.txt);;所有文件 (*) 表示用户只能看到 .txt 文件或所有类型的文件。我们可以根据应用场景自定义文件类型过滤器。 with open(file_name, r, encodingutf-8) as f: 功能打开用户选择的文件并读取内容。r 表示以只读模式打开文件encodingutf-8 确保文件按 UTF-8 编码读取。 显示文件内容 使用 QTextEdit 控件来显示读取到的文件内容。QTextEdit 是一个多行文本框适合显示较大的文本内容。self.setCentralWidget(self.text_edit)将窗口中央控件从按钮切换为文本编辑框这样用户可以在窗口中看到文件内容。 5.3 文件类型过滤器
在文件对话框中我们可以通过文件类型过滤器限制用户只能选择特定类型的文件。例如下面是一些常见的文件类型过滤器
文本文件 (*.txt)只显示 .txt 文件。图片文件 (*.png *.jpg)只显示 .png 和 .jpg 格式的图片文件。所有文件 (*)显示所有类型的文件。
在 QFileDialog 中多个文件类型可以通过 ;; 分隔。例如
file_name, _ QFileDialog.getOpenFileName(self, 选择文件, , 图片文件 (*.png *.jpg);;所有文件 (*))5.4 使用 QFileDialog 保存文件
QFileDialog 不仅可以用于打开文件还可以用于保存文件。让我们看看如何使用文件对话框来保存用户输入的内容到文件中。
示例 2保存文本到文件
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QFileDialog, QTextEditclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle(保存文件示例)# 创建文本编辑框用户可以在其中输入文本self.text_edit QTextEdit(self)self.setCentralWidget(self.text_edit)# 创建保存按钮save_button QPushButton(保存文件, self)save_button.clicked.connect(self.save_file)self.text_edit.setFixedHeight(100) # 设置按钮的固定高度self.text_edit.setFixedWidth(200)# 保存文件的函数def save_file(self):# 弹出保存文件对话框选择保存路径和文件名file_name, _ QFileDialog.getSaveFileName(self, 保存文件, , 文本文件 (*.txt);;所有文件 (*))# 检查用户是否选择了保存文件的路径if file_name:# 获取文本框中的内容file_content self.text_edit.toPlainText()# 将内容写入文件with open(file_name, w, encodingutf-8) as f:f.write(file_content)app QApplication(sys.argv)
window MainWindow()
window.show()
sys.exit(app.exec_())代码详解
QFileDialog.getSaveFileName() 功能弹出保存文件对话框允许用户选择保存路径和文件名。返回值 file_name 是用户选择的保存路径。如果用户取消操作file_name 会是一个空字符串。 self.text_edit.toPlainText() 功能从 QTextEdit 文本框中获取用户输入的文本。toPlainText() 方法返回的是纯文本内容不包含格式信息。 保存文件 使用 open() 函数以写入模式 (w) 打开文件然后将用户输入的文本写入文件。如果文件不存在系统会自动创建该文件。 5.5 多文件选择
PyQt5 的 QFileDialog 还允许用户同时选择多个文件。这在某些场景下非常有用比如批量处理多个文件。
示例 3多文件选择
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QFileDialog, QTextEdit, QVBoxLayout, QWidgetclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle(多文件选择示例)# 创建按钮button QPushButton(选择多个文件, self)button.clicked.connect(self.open_files)# 创建文本编辑框用于显示选择的文件路径self.text_edit QTextEdit(self)self.text_edit.setReadOnly(True) # 设置为只读# 创建一个中央窗口部件central_widget QWidget()self.setCentralWidget(central_widget)# 创建布局并将按钮和文本编辑框添加到布局中layout QVBoxLayout()layout.addWidget(button)layout.addWidget(self.text_edit)# 将布局应用到中央窗口部件central_widget.setLayout(layout)def open_files(self):# 弹出文件对话框允许用户选择多个文件files, _ QFileDialog.getOpenFileNames(self, 选择多个文件, , 所有文件 (*))if files:# 将所有文件路径显示在文本编辑框中self.text_edit.setText(\n.join(files))app QApplication(sys.argv)
window MainWindow()
window.show()
sys.exit(app.exec_())
代码详解
QFileDialog.getOpenFileNames() 功能弹出文件对话框允许用户同时选择多个文件。返回值 files 是用户选择的所有文件路径列表。\n.join(files)将文件路径列表转换为字符串每个文件路径之间用换行符分隔以便在文本框中展示多个文件路径。 5.6 总结
在这一部分中我们详细讲解了 PyQt5 中如何使用 QFileDialog 来处理文件的打开、保存以及多文件选择。QFileDialog 是 PyQt5 中一个强大且常用的对话框控件允许用户与文件系统交互。
关键点
QFileDialog.getOpenFileName()用于打开文件返回用户选择的文件路径。QFileDialog.getSaveFileName()用于保存文件允许用户选择保存路径。QFileDialog.getOpenFileNames()允许用户选择多个文件返回文件路径列表。 第6部分表格控件 QTableWidget 与数据展示 6.1 什么是 QTableWidget
QTableWidget 是 PyQt5 提供的一个表格控件允许你通过表格的形式展示数据。你可以将数据组织为行和列类似于 Excel 表格或者 pandas 的 DataFrame。在应用程序中表格控件非常适合展示结构化数据如数据库查询结果、文件数据等。 6.2 如何创建一个简单的 QTableWidget
首先我们来看如何手动创建一个 QTableWidget并向其中填充一些数据。这里我们将创建一个 3 行 2 列的表格并手动设置表头和每个单元格的数据。
示例 1创建简单的表格控件
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItemclass MainWindow(QMainWindow):def __init__(self):super().__init__()# 设置窗口标题self.setWindowTitle(QTableWidget 示例)# 创建一个 QTableWidget 表格指定表格有 3 行 2 列self.table_widget QTableWidget(3, 2, self)# 设置表格的表头self.table_widget.setHorizontalHeaderLabels([姓名, 年龄])# 填充表格的单元格数据self.table_widget.setItem(0, 0, QTableWidgetItem(张三)) # 第1行第1列张三self.table_widget.setItem(0, 1, QTableWidgetItem(25)) # 第1行第2列25self.table_widget.setItem(1, 0, QTableWidgetItem(李四)) # 第2行第1列李四self.table_widget.setItem(1, 1, QTableWidgetItem(30)) # 第2行第2列30self.table_widget.setItem(2, 0, QTableWidgetItem(王五)) # 第3行第1列王五self.table_widget.setItem(2, 1, QTableWidgetItem(22)) # 第3行第2列22# 将表格设置为主窗口的中央控件表格将显示在窗口中self.setCentralWidget(self.table_widget)# 创建应用程序对象
app QApplication(sys.argv)
window MainWindow()
window.show()# 进入应用程序事件循环
sys.exit(app.exec_())代码详解 QTableWidget(3, 2) 这一行代码创建了一个表格控件表格有 3 行和 2 列。行数代表有多少条记录列数代表每条记录包含多少个字段例如姓名和年龄。 setHorizontalHeaderLabels() 通过这行代码我们设置了表格的表头这里设置了两列分别是“姓名”和“年龄”。这些列头将显示在表格的顶部帮助用户了解每一列的数据含义。 setItem(row, column, QTableWidgetItem(value)) 通过这个方法你可以将数据插入到表格的某个单元格中。第一个参数 row 表示第几行第二个参数 column 表示第几列第三个参数 QTableWidgetItem(value) 表示你想要插入的具体数据。 setCentralWidget(self.table_widget) 这行代码将 QTableWidget 设置为窗口的中央控件表格将占据窗口的主要显示区域。每个窗口只能有一个中央控件。 6.3 动态填充 QTableWidget
在实际应用中表格中的数据通常不是手动输入的而是从某个数据源如列表、数据库或文件动态获取的。接下来我们演示如何根据一个列表动态填充表格的内容。
示例 2从列表动态填充表格
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItemclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle(动态填充 QTableWidget 示例)# 数据源包含姓名和年龄的列表data [[张三, 25],[李四, 30],[王五, 22]]# 根据数据源的大小动态创建表格行数等于 data 列表的长度列数为 2self.table_widget QTableWidget(len(data), 2, self)self.table_widget.setHorizontalHeaderLabels([姓名, 年龄])# 使用 for 循环填充表格for row, (name, age) in enumerate(data):self.table_widget.setItem(row, 0, QTableWidgetItem(name)) # 插入姓名self.table_widget.setItem(row, 1, QTableWidgetItem(age)) # 插入年龄# 设置表格为窗口的中央控件self.setCentralWidget(self.table_widget)# 创建应用程序对象
app QApplication(sys.argv)
window MainWindow()
window.show()
sys.exit(app.exec_())代码详解 数据源 data data 是一个列表每个子列表包含一个人的姓名和年龄。在实际应用中数据源可能来自数据库、文件或外部 API这里我们使用静态列表作为示例。 动态创建表格 表格的行数是由 len(data) 决定的列数固定为 2姓名和年龄。这意味着如果数据源包含更多条记录表格会自动根据数据源的大小调整行数。 for 循环填充表格 我们使用 for 循环遍历数据源enumerate 返回每条记录的索引row和数据name 和 age。通过 setItem() 方法我们将每条记录中的姓名和年龄填充到相应的行和列中。 6.4 使用 pandas 与 QTableWidget
在处理大量数据时pandas 是一个非常强大的库。它能够快速、轻松地读取 CSV 文件、Excel 文件甚至数据库中的数据并以 DataFrame 的形式进行操作。接下来我们演示如何使用 pandas 读取数据并将其展示在 QTableWidget 中。
示例 3使用 pandas 填充 QTableWidget
import sys
import pandas as pd # 导入 pandas 库
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItemclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle(使用 pandas 填充 QTableWidget)# 模拟读取的数据通常可以通过 pd.read_csv() 或 pd.read_excel() 读取外部文件data_frame pd.DataFrame({姓名: [张三, 李四, 王五],年龄: [25, 30, 22]})# 根据 pandas DataFrame 的大小创建表格self.table_widget QTableWidget(data_frame.shape[0], data_frame.shape[1], self)self.table_widget.setHorizontalHeaderLabels(data_frame.columns)# 填充表格for row in range(data_frame.shape[0]):for col in range(data_frame.shape[1]):self.table_widget.setItem(row, col, QTableWidgetItem(str(data_frame.iat[row, col])))# 设置表格为中央控件self.setCentralWidget(self.table_widget)# 创建应用程序对象
app QApplication(sys.argv)
window MainWindow()
window.show()
sys.exit(app.exec_())代码详解 pandas DataFrame 这里我们手动创建了一个 DataFrame它包含了姓名和年龄的两列。在实际应用中你可以通过 pd.read_csv()、pd.read_excel() 或者数据库查询来获取数据。 data_frame.shape shape 是 pandas 的一个属性返回 DataFrame 的形状即行数和列数。我们通过 shape 来动态决定表格的行数和列数。 data_frame.iat[row, col] iat 是 pandas 提供的一个方法允许我们根据行号和列号来访问 DataFrame 中的某个具体值。通过这个方法我们可以轻松将 DataFrame 中的每个单元格数据填充到 QTableWidget 中。 6.5 从文件动态填充 QTableWidget
实际应用中数据通常来自外部文件如 CSV 文件。接下来我们将展示如何通过 QFileDialog 选择一个 CSV 文件并使用 pandas 读取文件内容最后将其展示在 QTableWidget 中。
示例 4从 CSV 文件填充表格
import sys
import pandas as pd
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QFileDialog, QPushButtonclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle(从 CSV 文件填充 QTableWidget)# 创建按钮用于选择 CSV 文件self.button QPushButton(选择 CSV 文件, self)self.button.clicked.connect(self.open_file)# 设置按钮为中央控件self.setCentralWidget(self.button)def open_file(self):# 打开文件对话框选择 CSV 文件file_name, _ QFileDialog.getOpenFileName(self, 选择文件, , CSV 文件 (*.csv);;所有文件 (*))if file_name:# 使用 pandas 读取 CSV 文件data_frame pd.read_csv(file_name)# 创建表格行数和列数由 DataFrame 决定self.table_widget QTableWidget(data_frame.shape[0], data_frame.shape[1], self)self.table_widget.setHorizontalHeaderLabels(data_frame.columns)# 填充表格for row in range(data_frame.shape[0]):for col in range(data_frame.shape[1]):self.table_widget.setItem(row, col, QTableWidgetItem(str(data_frame.iat[row, col])))# 将表格设置为中央控件self.setCentralWidget(self.table_widget)# 创建应用程序对象
app QApplication(sys.argv)
window MainWindow()
window.show()
sys.exit(app.exec_())代码详解 QFileDialog.getOpenFileName() 这一行代码弹出了一个文件对话框让用户选择一个 CSV 文件。file_name 是用户选择的文件路径。 pd.read_csv(file_name) 使用 pandas 读取 CSV 文件文件内容将被加载为 DataFrame。DataFrame 是一种二维数据结构类似于表格。 QTableWidget(data_frame.shape[0], data_frame.shape[1]) 表格的行数和列数根据 DataFrame 的形状行数和列数动态生成。 data_frame.iat[row, col] 通过 iat 方法按行列索引获取 DataFrame 中的具体数据并填充到 QTableWidget 的对应单元格中。 6.6 总结
在这一部分中我们学习了如何使用 QTableWidget 来展示表格数据并结合 pandas 来处理和展示从外部文件读取的数据。通过 pandas 的强大数据处理能力和 QTableWidget 的可视化展示功能我们可以轻松将数据展示在应用程序中。
关键点
QTableWidget 是一个强大的表格控件适合展示结构化数据。pandas 提供了灵活的数据处理能力可以将 DataFrame 数据轻松导入到 QTableWidget 中。使用 QFileDialog 可以让用户通过文件对话框选择 CSV 文件并将其内容展示在表格中。 4-6部分总结
在第4至第6部分中我们深入讲解了 PyQt5 的信号与槽机制展示了如何通过信号和槽处理用户操作事件如按钮点击和文本输入。同时我们介绍了 QFileDialog 控件帮助用户与文件系统交互进行文件的打开和保存操作。随后我们重点讲解了 QTableWidget 控件及其与 pandas 的结合展示了如何动态地从 CSV 文件或其他数据源加载并展示结构化数据。 以上就是关于【Python篇】PyQt5 超详细入门级教程中篇一的内容啦各位大佬有什么问题欢迎在评论区指正您的支持是我创作的最大动力❤️
文章转载自: http://www.morning.xrqkm.cn.gov.cn.xrqkm.cn http://www.morning.hkpn.cn.gov.cn.hkpn.cn http://www.morning.hdwjb.cn.gov.cn.hdwjb.cn http://www.morning.qnlbb.cn.gov.cn.qnlbb.cn http://www.morning.jyznn.cn.gov.cn.jyznn.cn http://www.morning.mrfjr.cn.gov.cn.mrfjr.cn http://www.morning.plqsc.cn.gov.cn.plqsc.cn http://www.morning.lqynj.cn.gov.cn.lqynj.cn http://www.morning.dfndz.cn.gov.cn.dfndz.cn http://www.morning.lsgjf.cn.gov.cn.lsgjf.cn http://www.morning.fqqcd.cn.gov.cn.fqqcd.cn http://www.morning.jrdbq.cn.gov.cn.jrdbq.cn http://www.morning.ujianji.com.gov.cn.ujianji.com http://www.morning.nftzn.cn.gov.cn.nftzn.cn http://www.morning.mstbbs.com.gov.cn.mstbbs.com http://www.morning.tnhg.cn.gov.cn.tnhg.cn http://www.morning.gkgr.cn.gov.cn.gkgr.cn http://www.morning.grfhd.cn.gov.cn.grfhd.cn http://www.morning.wwgpy.cn.gov.cn.wwgpy.cn http://www.morning.btypn.cn.gov.cn.btypn.cn http://www.morning.lzsxp.cn.gov.cn.lzsxp.cn http://www.morning.iqcge.com.gov.cn.iqcge.com http://www.morning.sbjbs.cn.gov.cn.sbjbs.cn http://www.morning.fnjrh.cn.gov.cn.fnjrh.cn http://www.morning.wktbz.cn.gov.cn.wktbz.cn http://www.morning.glxmf.cn.gov.cn.glxmf.cn http://www.morning.nmlpp.cn.gov.cn.nmlpp.cn http://www.morning.qdlnw.cn.gov.cn.qdlnw.cn http://www.morning.wbxbj.cn.gov.cn.wbxbj.cn http://www.morning.zrpys.cn.gov.cn.zrpys.cn http://www.morning.zwppm.cn.gov.cn.zwppm.cn http://www.morning.qgkcs.cn.gov.cn.qgkcs.cn http://www.morning.nnjq.cn.gov.cn.nnjq.cn http://www.morning.mnnxt.cn.gov.cn.mnnxt.cn http://www.morning.rhfbl.cn.gov.cn.rhfbl.cn http://www.morning.kcnjz.cn.gov.cn.kcnjz.cn http://www.morning.lcbt.cn.gov.cn.lcbt.cn http://www.morning.ybgcn.cn.gov.cn.ybgcn.cn http://www.morning.ggtgl.cn.gov.cn.ggtgl.cn http://www.morning.nzzws.cn.gov.cn.nzzws.cn http://www.morning.fhqdb.cn.gov.cn.fhqdb.cn http://www.morning.hjwkq.cn.gov.cn.hjwkq.cn http://www.morning.rsnn.cn.gov.cn.rsnn.cn http://www.morning.kpqjr.cn.gov.cn.kpqjr.cn http://www.morning.pwfwk.cn.gov.cn.pwfwk.cn http://www.morning.jzsgn.cn.gov.cn.jzsgn.cn http://www.morning.hxrfb.cn.gov.cn.hxrfb.cn http://www.morning.taipinghl.cn.gov.cn.taipinghl.cn http://www.morning.zlzpz.cn.gov.cn.zlzpz.cn http://www.morning.dpmkn.cn.gov.cn.dpmkn.cn http://www.morning.27asw.cn.gov.cn.27asw.cn http://www.morning.qbgff.cn.gov.cn.qbgff.cn http://www.morning.ktcrr.cn.gov.cn.ktcrr.cn http://www.morning.rtsx.cn.gov.cn.rtsx.cn http://www.morning.tslxr.cn.gov.cn.tslxr.cn http://www.morning.rflcy.cn.gov.cn.rflcy.cn http://www.morning.rfrxt.cn.gov.cn.rfrxt.cn http://www.morning.rrrrsr.com.gov.cn.rrrrsr.com http://www.morning.yfmlj.cn.gov.cn.yfmlj.cn http://www.morning.hxlpm.cn.gov.cn.hxlpm.cn http://www.morning.3dcb8231.cn.gov.cn.3dcb8231.cn http://www.morning.ynjhk.cn.gov.cn.ynjhk.cn http://www.morning.htqrh.cn.gov.cn.htqrh.cn http://www.morning.fykqh.cn.gov.cn.fykqh.cn http://www.morning.vnuwdy.cn.gov.cn.vnuwdy.cn http://www.morning.yqpck.cn.gov.cn.yqpck.cn http://www.morning.ckctj.cn.gov.cn.ckctj.cn http://www.morning.gpmrj.cn.gov.cn.gpmrj.cn http://www.morning.ypdmr.cn.gov.cn.ypdmr.cn http://www.morning.jjrsk.cn.gov.cn.jjrsk.cn http://www.morning.pnmgr.cn.gov.cn.pnmgr.cn http://www.morning.skwwj.cn.gov.cn.skwwj.cn http://www.morning.tdgwg.cn.gov.cn.tdgwg.cn http://www.morning.ruifund.com.gov.cn.ruifund.com http://www.morning.bfcrp.cn.gov.cn.bfcrp.cn http://www.morning.ykrss.cn.gov.cn.ykrss.cn http://www.morning.sgnxl.cn.gov.cn.sgnxl.cn http://www.morning.a3e2r.com.gov.cn.a3e2r.com http://www.morning.jxdhc.cn.gov.cn.jxdhc.cn http://www.morning.zffn.cn.gov.cn.zffn.cn