PyQt6中QTableWidget多标签页行数据存储问题求助
解决方案
问题根源
QTableWidget.item(row, col)仅能获取单元格的QTableWidgetItem文本项,无法读取通过setCellWidget()嵌入的QLineEdit/QComboBox控件,这类控件必须用cellWidget(row, col)获取。- 原代码中
self.column_inputs的存储逻辑错误:同一标签页同一列的控件会被循环覆盖,最终仅保留最后一行的控件,无法提取所有行的数据。
修复步骤
1. 重构控件存储结构
修改create_tabs方法,构建标签页-行-列的层级存储结构,确保每个单元格的控件都能被准确定位:
def create_tabs(self, tab_info): # 存储所有标签页的控件:键为标签名,值为二维列表[行][列] = 控件 self.tab_controls = {} for info in tab_info: tab_name = info["name"] self.tab_controls[tab_name] = [] tab_widget = QWidget() tab_layout = QVBoxLayout(tab_widget) table = QTableWidget(self.num_rows, info["columns"]) table.setHorizontalHeaderLabels(info["header_labels"]) # 为当前标签页创建每行的控件列表 for row in range(self.num_rows): row_controls = [] for col in range(info["columns"]): # 处理editor_types可能缺失的情况 editor_type = info["editor_types"][col] if col < len(info["editor_types"]) else "line_edit" if editor_type == "line_edit": item = QLineEdit() elif editor_type == "combo_box": item = QComboBox() item.addItems(self.get_combo_box_items(info["header_labels"][col])) else: item = QTableWidgetItem() table.setItem(row, col, item) row_controls.append(None) continue table.setCellWidget(row, col, item) row_controls.append(item) self.tab_controls[tab_name].append(row_controls) tab_layout.addWidget(table) self.tabs.addTab(tab_widget, tab_name)
2. 正确提取所有行数据
修改next_button_clicked方法,改为在最后一个标签页时一次性收集所有标签页的完整数据,避免重复添加:
def next_button_clicked(self): current_tab_index = self.tabs.currentIndex() current_tab_name = self.tabs.tabText(current_tab_index) # 切换到下一个标签,直到最后一个标签 if current_tab_index < self.tabs.count() - 1: self.tabs.setCurrentIndex(current_tab_index + 1) return # 最后一个标签时,收集所有标签页的数据 self.data1 = [] # Screw标签的行数据 self.data2 = [] # Junction标签的行数据 # 遍历所有标签页提取数据 for tab_name, row_controls_list in self.tab_controls.items(): for row_controls in row_controls_list: row_data = [] for control in row_controls: if isinstance(control, QLineEdit): row_data.append(control.text().strip()) elif isinstance(control, QComboBox): row_data.append(control.currentText().strip()) else: row_data.append("") if tab_name == "Screw": self.data1.append(row_data) elif tab_name == "Junction": self.data2.append(row_data) print("Data from Tab 1 (Screw): " + str(self.data1)) print("Data from Tab 2 (Junction): " + str(self.data2)) self.open_output_window()
补充说明
- 移除了原代码中嵌入控件时冗余的
table.setItem(row, col, QTableWidgetItem())调用。 - 增加
strip()处理输入文本的首尾空格,提升数据整洁度。 - 新的存储结构
tab_controls[标签名][行号][列号]直接映射到对应单元格的控件,确保能准确获取每一行的完整输入值。
内容的提问来源于stack exchange,提问作者Gerardo Lopez
相关产品推荐
相关产品推荐

