PyQt5 - 返回通过循环创建的复选框旁边的文本框的值

问题描述 投票:0回答:1

我创建了一个 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)
python pyqt5
1个回答
0
投票

感谢@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()
© www.soinside.com 2019 - 2024. All rights reserved.