PyQt5跨类调用QTableWidget展示QFileDialog选中文件方法
核心问题点
- 选中文件列表未持久化:
upload_file方法里拿到的文件路径只存在局部变量中,没有存为类属性,跳转页面时无法获取 - 控件引用错误:查找展示文件数量的标签时用了局部变量
label,后续调用self.label.setText会直接抛出属性错误 - 页面实例重复创建:每次点跳转/返回都新建页面实例往
QStackedWidget里添加,既会造成内存泄漏,也无法保留之前页面的状态,更没法传递数据 - 表格无填充逻辑:跳转表格页时没有传入文件数据,也没有编写对应的表格内容渲染逻辑
修复后完整代码
import sys import random from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QLabel, QLineEdit, QMessageBox,QCheckBox,QFrame, QStackedWidget,QFileDialog, QTableWidgetItem) from PyQt5 import uic class ChooseFile(QWidget): def __init__(self): super().__init__() uic.loadUi("choosefile.ui", self) self.setWindowTitle("choose file") # 存储选中的文件列表 self.selected_files = [] # 绑定选择文件按钮 btn = self.findChild(QPushButton,"btn_choose_file") btn.clicked.connect(self.upload_file) # 绑定文件数量标签,改为实例属性 self.label = self.findChild(QLabel,"label") # 绑定获取文件按钮 btn2 = self.findChild(QPushButton,"btn_get_files") btn2.clicked.connect(self.get_file) def upload_file(self): filter = "TXT (*.txt);;PDF (*.pdf)" file_name = QFileDialog() file_name.setFileMode(QFileDialog.ExistingFiles) # 拿到选中的文件路径列表 self.selected_files, _ = QFileDialog.getOpenFileNames(self, "Upload File","", filter) file_count = len(self.selected_files) if self.selected_files: if file_count > 1: self.label.setText(f"{file_count} files selected") else: self.label.setText(self.selected_files[0]) def get_file(self): # 未选文件时提示 if not self.selected_files: QMessageBox.warning(self, "提示", "请先选择文件") return # 切换到表格页,传入文件列表触发填充 table_page = widget.widget(1) table_page.load_file_data(self.selected_files) widget.setCurrentIndex(1) class TableFile(QWidget): def __init__(self): super().__init__() uic.loadUi("showTable.ui", self) # 初始化表格列宽、表头 self.tableWidget.setColumnWidth(0, 300) self.tableWidget.setColumnWidth(1, 100) self.tableWidget.setHorizontalHeaderLabels(["文件路径", "随机数"]) # 绑定返回按钮 btn_back = self.findChild(QPushButton,"btn_back") btn_back.clicked.connect(self.back) def load_file_data(self, file_list): # 按文件数量设置表格行数 self.tableWidget.setRowCount(len(file_list)) for row, file_path in enumerate(file_list): # 第一列放文件路径 self.tableWidget.setItem(row, 0, QTableWidgetItem(file_path)) # 第二列放1-1000的随机整数 random_num = random.randint(1, 1000) self.tableWidget.setItem(row, 1, QTableWidgetItem(str(random_num))) def back(self): # 直接切回选文件页,不新建实例 widget.setCurrentIndex(0) app = QApplication(sys.argv) widget = QStackedWidget() # 初始化时一次性添加两个页面 choose_page = ChooseFile() table_page = TableFile() widget.addWidget(choose_page) widget.addWidget(table_page) widget.show() sys.exit(app.exec_())
改动说明
- 新增
self.selected_files实例属性持久化存储用户选中的文件路径,解决数据丢失问题 - 修复标签控件的引用错误,将局部变量改为实例属性避免运行报错
- 程序启动时就完成两个页面的初始化,跳转/返回仅切换
QStackedWidget的索引,不再重复创建页面实例,返回选文件页时之前的选中状态会保留 - 给
TableFile类新增load_file_data公共方法,接收文件列表后自动按行数填充表格,第二列自动生成1-1000范围的随机整数 - 新增未选文件的提示逻辑,避免用户空点跳转按钮
内容的提问来源于stack exchange,提问作者Abbas Ahmed
相关产品推荐
相关产品推荐

