from PyQt5.QtWidgets import * from PyQt5.QtCore import * class PersonTable(QWidget): def __init__(self, parent=None): super(PersonTable, self).__init__(parent) self.id = None self.name = None self.table_widget = QTableWidget() self.table_widget.setFixedSize(500, 300) self.setLayout(QVBoxLayout()) self.layout().addWidget(self.table_widget) # 模拟数据 data = [ {"name": "张三", "id": 20}, {"name": "李四", "id": 21}, {"name": "王五", "id": 22} ] self.names = ["张三", "李四", "王五"] # 用于下拉框的选项 self.table_widget.setColumnCount(3) self.table_widget.setHorizontalHeaderLabels(["姓名", "ID", "操作"]) for row_index, row_data in enumerate(data): self.table_widget.insertRow(row_index) self.table_widget.setItem(row_index, 0, QTableWidgetItem(row_data["name"])) self.table_widget.setItem(row_index, 1, QTableWidgetItem(str(row_data["id"]))) # 创建水平布局,用于放置切换按钮和删除按钮 h_layout = QHBoxLayout() # 创建 QStackedWidget 用于切换编辑和更新按钮 stacked_widget = QStackedWidget() edit_button = QPushButton("编辑") update_button = QPushButton("更新") stacked_widget.addWidget(edit_button) stacked_widget.addWidget(update_button) h_layout.addWidget(stacked_widget) # 添加删除按钮 delete_button = QPushButton("删除") h_layout.addWidget(delete_button) self.table_widget.setCellWidget(row_index, 2, QWidget()) self.table_widget.cellWidget(row_index, 2).setLayout(h_layout) edit_button.clicked.connect(lambda checked, row=row_index: self.edit_row(row)) # 明确参数 checked update_button.clicked.connect(lambda checked, row=row_index: self.update_row(row)) # 明确参数 checked delete_button.clicked.connect(lambda checked, row=row_index: self.delete_row(row)) # 明确参数 checked self.table_widget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) # 使表格行高和列宽自适应 self.table_widget.verticalHeader().setDefaultSectionSize(50) def edit_row(self, row): print(f"编辑行 {row}: 姓名 - {self.table_widget.item(row, 0).text()}, ID - {self.table_widget.item(row, 1).text()}") try: self.name = self.table_widget.item(row, 0).text() self.id = self.table_widget.item(row, 1).text() # 隐藏原来的表格项内容 self.table_widget.item(row, 0).setFlags(Qt.ItemIsEnabled) self.table_widget.item(row, 1).setFlags(Qt.ItemIsEnabled) # 创建下拉框 name_combo = QComboBox() name_combo.addItems(self.names) name_combo.setCurrentText(self.table_widget.item(row, 0).text()) # 创建输入框 age_edit = QLineEdit(self.table_widget.item(row, 1).text()) # 隐藏原来的表格项显示 self.table_widget.setItem(row, 0, QTableWidgetItem("")) self.table_widget.setItem(row, 1, QTableWidgetItem("")) self.table_widget.setCellWidget(row, 0, name_combo) self.table_widget.setCellWidget(row, 1, age_edit) # 切换到更新按钮 stacked_widget = self.table_widget.cellWidget(row, 2).layout().itemAt(0).widget() stacked_widget.setCurrentIndex(1) except Exception as e: print(f"Edit row {row} error: {e}") # 打印编辑行时的错误 def update_row(self, row): print(f"更新行 {row}: 姓名 - {self.table_widget.cellWidget(row, 0).currentText()}, ID - {self.table_widget.cellWidget(row, 1).text()}") try: new_name = self.table_widget.cellWidget(row, 0).currentText() new_id = self.table_widget.cellWidget(row, 1).text() self.table_widget.setItem(row, 0, QTableWidgetItem(new_name)) self.table_widget.setItem(row, 1, QTableWidgetItem(new_id)) # 显示原来的表格项内容,并恢复其可编辑状态 self.table_widget.item(row, 0).setFlags(Qt.ItemIsEnabled | Qt.ItemIsEditable) self.table_widget.item(row, 1).setFlags(Qt.ItemIsEnabled | Qt.ItemIsEditable) # 移除下拉框和输入框 self.table_widget.setCellWidget(row, 0, None) self.table_widget.setCellWidget(row, 1, None) # 切换回编辑按钮 stacked_widget = self.table_widget.cellWidget(row, 2).layout().itemAt(0).widget() stacked_widget.setCurrentIndex(0) except Exception as e: print(f"Update row {row} error: {e}") # 打印更新行时的错误 def delete_row(self, row): if 0 <= row < self.table_widget.rowCount(): try: print(f"删除行 {row}: 姓名 - {self.table_widget.item(row, 0).text()}, ID - {self.table_widget.item(row, 1).text()}") except Exception as e: print(f"删除行 {row} 时出错: {e}") else: print(f"无效的行索引 {row},无法删除")