PyQt5问题:获取循环生成的复选框同行文本框的值
解决PyQt5对话框获取勾选行QLineEdit值的方案
核心思路
把每行的QCheckBox和对应的QLineEdit关联存储,同时绑定DataFrame的行索引,点击OK时遍历筛选勾选的行,直接从关联的输入框中提取内容即可。
完整实现代码
import sys import pandas as pd from PyQt5.QtWidgets import (QDialog, QVBoxLayout, QHBoxLayout, QCheckBox, QLabel, QLineEdit, QPushButton, QWidget) class DataFrameEditDialog(QDialog): def __init__(self, df, parent=None): super().__init__(parent) self.df = df # 存储勾选框与对应输入框、行索引的映射 self.checkbox_bindings = {} self._setup_ui() def _setup_ui(self): main_layout = QVBoxLayout() # 遍历DataFrame生成每行控件 for row_idx, row_data in self.df.iterrows(): row_container = QWidget() row_layout = QHBoxLayout(row_container) checkbox = QCheckBox() type_label = QLabel(row_data['类型']) status_edit = QLineEdit(str(row_data['状态'])) # 绑定控件与行信息 self.checkbox_bindings[checkbox] = (status_edit, row_idx) row_layout.addWidget(checkbox) row_layout.addWidget(type_label) row_layout.addWidget(status_edit) main_layout.addWidget(row_container) # 添加OK按钮 ok_btn = QPushButton('确认') ok_btn.clicked.connect(self.onokclick) main_layout.addWidget(ok_btn) self.setLayout(main_layout) self.setWindowTitle('数据状态编辑') def onokclick(self): # 收集待上传的勾选行数据 upload_list = [] for checkbox, (edit_box, row_idx) in self.checkbox_bindings.items(): if checkbox.isChecked(): # 获取输入框内容和对应行的类型信息 new_status = edit_box.text().strip() data_type = self.df.loc[row_idx, '类型'] upload_list.append({ '类型': data_type, '更新状态': new_status, '原数据索引': row_idx }) # 此处替换为你的数据库上传逻辑 print('准备上传的数据:', upload_list) # 示例:若用pymysql,可循环upload_list执行INSERT语句 self.accept() if __name__ == '__main__': # 测试用示例DataFrame test_data = pd.DataFrame({ '类型': ['系统模块', '用户模块', '订单模块'], '状态': ['运行中', '维护中', '待上线'] }) app = sys.argv dialog = DataFrameEditDialog(test_data) dialog.exec_()
关键细节说明
- 控件绑定:通过
checkbox_bindings字典将勾选框与输入框、DataFrame行索引绑定,避免了通过布局查找控件的繁琐操作,直接关联目标数据。 - 数据提取:在
onokclick中遍历绑定字典,判断勾选状态后直接获取输入框文本,同时可通过行索引从原DataFrame中提取其他关联字段,方便组装数据库上传所需的完整数据结构。 - 扩展性:如果需要传递更多行数据,可在绑定字典中存储整行的Series对象,进一步简化数据提取逻辑。
内容的提问来源于stack exchange,提问作者Kes Perron
相关产品推荐
相关产品推荐

