我创建了一个 PyQt5 对话框,它基于提供的 pandas DataFrame 构建一个表单。表单的每一行都包含一个带有名称、类型标签和状态 QLineEdit 的 QCheckBox。用户能够选择/取消选择行并更改状态 QLineEdit 的内容。当用户单击“确定”按钮时,我希望
onokclick
函数查找选中的行,获取该行的 QLineEdit 值,并将该值上传到数据库。这是我现在的代码:
class EditDetails(QDialog):
def __init__(self, dftable, srecnum, parent=None):
super().__init__(parent)
self.setWindowTitle("Select Names and Edit Status")
self.resize(600,400)
self.dftable = dftable
self.srecnum = srecnum
vlayout = QVBoxLayout()
self.glayout = QGridLayout()
self.glayout.addWidget(QLabel("Name"),0,0)
self.glayout.addWidget(QLabel("Type"),0,1)
self.glayout.addWidget(QLabel("Status"),0,2)
i = 1
for index, row in self.dftable.iterrows():
checkbox = QCheckBox(row["Name"])
checkbox.setChecked(True)
self.glayout.addWidget(checkbox,i,0)
slabel = row["Type"]
qtlabel = QLabel(slabel)
self.glayout.addWidget(qtlabel,i,1)
qtentry = QLineEdit(row[srecnum]["status"])
self.glayout.addWidget(qtentry,i,2)
i += 1
vlayout.addLayout(self.glayout)
newqw = QWidget()
newqw.setLayout(vlayout)
scrollarea = QScrollArea(widgetResizable=False)
scrollarea.setWidget(newqw)
layout = QVBoxLayout()
layout.addWidget(scrollarea)
QBtn = QDialogButtonBox.Ok | QDialogButtonBox.Cancel
self.buttonBox = QDialogButtonBox(QBtn)
self.buttonBox.accepted.connect(self.onokclick)
self.buttonBox.rejected.connect(self.reject)
layout.addWidget(self.buttonBox,i,0)
self.setLayout(layout)
def onokclick(self):
widgets = (self.glayout.itemAt(i).widget() for i in range(self.glayout.count()))
for widget in widgets:
if isinstance(widget, QCheckBox):
if widget.isChecked():
name = widget.text()
status = ??? # How do I fetch the contents of the QLineEdit widget that's in the same grid layout row as this QCheckBox?
self.uploadToDatabase(name, status)
感谢@musicamante,我得以实现此功能。
...
self.widgetrows = []
i = 1
for index, row in self.dftable.iterrows():
checkbox = QCheckBox(row["Name"])
checkbox.setChecked(True)
self.glayout.addWidget(checkbox,i,0)
slabel = row["Type"]
qtlabel = QLabel(slabel)
self.glayout.addWidget(qtlabel,i,1)
qtentry = QLineEdit(row[srecnum]["status"])
self.glayout.addWidget(qtentry,i,2)
self.widgetrows.append((checkbox, qtentry))
i += 1
vlayout.addLayout(self.glayout)
...
def onokclick(self):
for widgetrow in self.widgetrows:
if widgetrow[0].isChecked():
name = widgetrow[0].text()
status = widgetrow[1].text()