122 lines
5.2 KiB
Python
122 lines
5.2 KiB
Python
|
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},无法删除")
|
||
|
|