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

PyQt5中QFileDialog导入CSV后QTableWidget不刷新问题

解决PyQt5中QPushButton触发QFileDialog导入CSV后QTableWidget不刷新的问题

问题根源

  1. 每次导入CSV都会新建QTableWidget实例,旧控件未被清理,新控件可能因层级或布局问题无法显示
  2. 导入数据时未清空pointLocations和pointTimes列表,二次导入会累积旧数据导致显示异常
  3. QFileDialog传入None作为父窗口,可能干扰事件循环导致界面更新不及时

修复方案

1. 初始化时创建Table控件

在__init__中完成QTableWidget的创建和布局配置,后续仅更新数据,不重建控件:

def __init__(self):
    super().__init__()
    self.index = 0
    self.port = None
    self.pointTimes = []
    self.pointLocations = []
    self.main_widget = QWidget(self)
    self.setCentralWidget(self.main_widget)
    self.setWindowTitle("Application")
    self.left = 50
    self.top = 100
    self.width = 1100
    self.height = 700
    self.setGeometry(self.left, self.top, self.width, self.height)
    tabw = self.createtabs()
    self.layout = QVBoxLayout()
    self.layout.addWidget(tabw)
    self.main_widget.setLayout(self.layout)
    
    # 初始化Table控件(假设tab3是你创建的标签页)
    self.initTable()

def initTable(self):
    self.table = QTableWidget(self.tab3)
    # 改用布局管理替代move,确保控件正确显示
    table_layout = QVBoxLayout(self.tab3)
    table_layout.addWidget(self.table)
    
    self.table.setColumnCount(6)
    self.table.setHorizontalHeaderLabels(
        ["Status", "Position", "Expect time", "LED Indicate Time - UTC", "Time 2", "Time 3"])
    header = self.table.horizontalHeader()
    header.setSectionResizeMode(1, QHeaderView.ResizeToContents)
    header.setSectionResizeMode(2, QHeaderView.ResizeToContents)
    self.table.setFixedSize(1035, 420)
    self.table.setColumnWidth(0, 100)
    self.table.setColumnWidth(3, 200)
    self.table.setColumnWidth(4, 200)
    self.table.setColumnWidth(5, 200)
    
    delegate = AlignDelegate(self.table)
    self.table.setItemDelegate(delegate)
    scroll_bar = QScrollBar(self)
    self.table.setHorizontalScrollBar(scroll_bar)

2. 修改导入逻辑,清空旧数据并处理取消选择

def importcsv(self):
    # 设置父窗口为self,确保事件循环正常
    self.filepath, _ = QFileDialog.getOpenFileName(self, "Choose File", "", "(*.csv)")
    if not self.filepath:
        # 用户取消选择,直接返回
        return
    # 清空旧数据,避免累积
    self.pointLocations.clear()
    self.pointTimes.clear()
    self.importlocations()

def importlocations(self):
    with open(self.filepath, "r") as csvfile:  # 直接使用完整路径,避免basename路径问题
        pointreader = csv.reader(csvfile)
        for row in pointreader:
            self.pointLocations.append(row[0])
            self.pointTimes.append(row[1])
    self.updateTableData()

def updateTableData(self):
    self.taskQuantity = len(self.pointLocations)-1
    # 清空现有行,再插入新数据
    self.table.setRowCount(0)
    self.table.setRowCount(self.taskQuantity)
    
    for row in range(self.taskQuantity):
        self.table.setItem(row, 1, QTableWidgetItem(self.pointLocations[row+1]))
        self.table.setItem(row, 2, QTableWidgetItem(self.pointTimes[row+1]))
    # 强制刷新界面
    self.table.viewport().update()

3. 移除原有的createTable函数,拆分职责为初始化和数据更新

关键说明

  • 初始化时创建Table控件,避免重复创建导致的显示冲突
  • 导入前清空数据列表,保证每次导入都是全新数据
  • 用布局管理替代move,确保控件在父窗口中正确渲染
  • 处理取消选择的情况,避免空文件路径引发报错
  • 更新数据后调用viewport().update()强制刷新Table界面

内容的提问来源于stack exchange,提问作者thehusk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:32:44