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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:26:04