PyQt5中QFileDialog导入CSV后QTableWidget不刷新问题
问题根源
- 每次导入CSV都会新建
QTableWidget实例,旧控件未被清理,新控件可能因层级或布局问题无法显示 - 导入数据时未清空
pointLocations和pointTimes列表,二次导入会累积旧数据导致显示异常 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
相关产品推荐
相关产品推荐

