You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:09:15