请将上个回答中的所有代码整合到一起
时间: 2025-08-24 17:03:55 浏览: 4
<think>好的,用户现在想要将之前关于使用Python PyQt5实现主界面和子界面交互的代码整合成一个完整的代码。我需要先回顾之前的对话,确保整合后的代码满足所有需求。
首先,用户的需求是主界面有一个表格,双击某行数据弹出子界面显示完整数据,并且在子界面修改后,主界面能同步更新。之前的回答已经分步骤给出了主窗口类、子对话框类以及数据同步机制的代码,但可能是分开的,用户现在需要完整的代码。
我需要检查之前的代码是否有遗漏的部分,比如MainWindow类的完整定义,是否有未包含的方法。之前的代码中,MainWindow类有initUI和initData方法,还有open_detail和update_table方法。需要确认这些是否都在同一个类中。
接下来,用户提供的引用中有关于安装依赖和示例代码,但当前问题主要关注PyQt5的代码整合,所以可能不需要考虑这些引用内容,但需要确认是否有其他隐藏的需求。比如用户是否希望添加数据验证或错误处理,但根据问题描述,用户主要关注整合现有代码。
然后,确保代码结构正确,比如导入必要的PyQt5模块,正确使用信号机制。在之前的代码中,DetailDialog类有一个data_updated信号,当保存时发射该信号,主窗口连接这个信号到update_table方法。需要确认信号的定义和连接是否正确,参数是否匹配。
另外,需要考虑应用程序的入口,即if __name__ == '__main__'部分,创建QApplication实例,显示主窗口并启动事件循环。
可能还需要测试代码是否存在语法错误,比如缩进是否正确,括号是否闭合,信号是否正确传递行索引和新数据。
最后,确保代码的注释和结构清晰,方便用户理解和运行。可能需要添加一些注释说明关键部分,如信号连接、数据更新逻辑等。
总结步骤:整合MainWindow和DetailDialog类,确保所有方法都在正确的位置,添加应用程序启动代码,检查导入和语法,验证信号和槽的连接,确保数据同步功能正常。</think>根据需求整合的完整PyQt5实现代码如下,包含详细注释和错误处理机制:
```python
import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTableWidget, QTableWidgetItem,
QDialog, QFormLayout, QLineEdit, QPushButton)
from PyQt5.QtCore import Qt, pyqtSignal
class DetailDialog(QDialog):
""" 数据详情编辑对话框 """
data_updated = pyqtSignal(int, list) # (行索引, 新数据)
def __init__(self, row_data, row_index, parent=None):
super().__init__(parent)
self.row_index = row_index
self.initUI(row_data)
self.setWindowTitle("编辑数据")
self.setFixedSize(300, 200)
def initUI(self, data):
layout = QFormLayout()
# 创建可编辑字段
self.id_edit = QLineEdit(str(data[0]))
self.name_edit = QLineEdit(data[1])
self.age_edit = QLineEdit(str(data[2]))
# ID字段设为只读
self.id_edit.setReadOnly(True)
# 添加表单元素
layout.addRow('ID:', self.id_edit)
layout.addRow('姓名:', self.name_edit)
layout.addRow('年龄:', self.age_edit)
# 保存按钮
btn_save = QPushButton('保存修改')
btn_save.clicked.connect(self.validate_and_save)
layout.addRow(btn_save)
self.setLayout(layout)
def validate_and_save(self):
""" 数据验证与保存 """
try:
new_age = int(self.age_edit.text())
if new_age < 0:
raise ValueError("年龄不能为负数")
new_data = [
int(self.id_edit.text()),
self.name_edit.text().strip(),
new_age
]
self.data_updated.emit(self.row_index, new_data)
self.accept()
except ValueError as e:
QMessageBox.warning(self, "输入错误", f"无效输入: {str(e)}")
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("主从界面演示")
self.setGeometry(100, 100, 600, 400)
self.initUI()
self.initData()
def initUI(self):
""" 初始化界面组件 """
self.table = QTableWidget()
self.table.setColumnCount(3)
self.table.setHorizontalHeaderLabels(['ID', '姓名', '年龄'])
self.table.cellDoubleClicked.connect(self.open_detail_window)
self.setCentralWidget(self.table)
# 设置表格样式
self.table.verticalHeader().setVisible(False)
self.table.setAlternatingRowColors(True)
self.table.setStyleSheet("""
QTableWidget {
font-size: 14px;
selection-background-color: #b0d7ff;
}
QHeaderView::section {
background-color: #0078d4;
color: white;
padding: 4px;
}
""")
def initData(self):
""" 初始化示例数据 """
sample_data = [
[101, '张三', 25],
[102, '李四', 30],
[103, '王五', 28]
]
self._populate_table(sample_data)
def _populate_table(self, data):
""" 填充表格数据 """
self.table.setRowCount(len(data))
for row_idx, row_data in enumerate(data):
for col_idx, value in enumerate(row_data):
item = QTableWidgetItem(str(value))
if col_idx == 0: # ID列不可编辑
item.setFlags(item.flags() & ~Qt.ItemIsEditable)
self.table.setItem(row_idx, col_idx, item)
def open_detail_window(self, row, _):
""" 打开详情窗口 """
row_data = [
self.table.item(row, 0).text(),
self.table.item(row, 1).text(),
self.table.item(row, 2).text()
]
detail_dialog = DetailDialog(row_data, row, self)
detail_dialog.data_updated.connect(self._update_table_row)
detail_dialog.exec_()
def _update_table_row(self, row_index, new_data):
""" 更新指定行数据 """
for col in range(3):
item = self.table.item(row_index, col)
item.setText(str(new_data[col]))
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
```
### 代码特性说明
1. **数据验证机制**:在子窗口`validate_and_save`方法中实现年龄数值校验[^1]
2. **UI优化**:
- 表格交替行颜色
- 自定义表头样式
- 限制对话框尺寸
3. **错误处理**:使用`try-except`块捕获无效输入
4. **数据完整性**:ID字段在表格和对话框均为只读
5. **代码结构**:采用模块化设计,分离数据操作(`_populate_table`)与界面逻辑
### 运行效果
主界面显示简洁数据表格:
```
| ID | 姓名 | 年龄 |
|-----|------|-----|
| 101 | 张三 | 25 |
| 102 | 李四 | 30 |
```
双击任意行弹出编辑对话框:
```
ID: [101] (不可编辑)
姓名: [张三]
年龄: [25]
```
修改后点击保存,主界面对应行数据立即更新。
阅读全文
相关推荐




















