在页面加载抛出 AttributeError 时在 pyqt5 上设置 table 值

Set table values on pyqt5 in pageload throws AttributeError

我正在尝试使用助手 class 和方法在页面加载时设置 pyqt5 Qtablewidget 项目。这是我的代码。

#ui - > UI mainwindow class
#examdetails -> a list of dictionaries (table from database)  
def setExamRecords(self,ui,examDetails):
    for rowIndex,exam in enumerate(examDetails):
        for colIndex,key in enumerate(exam):
            print(exam[key])
            item = ui.tableWidget.item(rowIndex, colIndex)
            item.setText(str(exam[key]))
    return True

然而这个returns错误AttributeError: 'NoneType' object has no attribute 'setText'

难道不能像这样在单独的 class 中设置 ui 元素吗?移动到单独的助手 class 的原因主要是为了减少主 ui class.

中的代码堵塞

空单元格的存在并不意味着它与 QTableWidgetItem 相关联,因此 item() 方法 returns None。一种可能的解决方案是检查它是否为 None,如果是则创建 QTableWidgetItem 并使用 setItem():

进行设置
def setExamRecords(self, ui, examDetails):
    for rowIndex, exam in enumerate(examDetails):
        for colIndex, key in enumerate(exam):
            print(exam[key])
            item = ui.tableWidget.item(rowIndex, colIndex)
            if item is None:
                item = QTableWidgetItem()
                ui.tableWidget.setItem(rowIndex, colIndex, item)
            item.setText(str(exam[key]))
    return True

另一种可能的解决方案是使用模型,其中如果每个单元格都与 QModelIndex 关联:

def setExamRecords(self, ui, examDetails):
    for rowIndex, exam in enumerate(examDetails):
        for colIndex, key in enumerate(exam):
            index = ui.tableWidget.model().index(rowIndex, colIndex)
            ui.tableWidget.model().setData(index, str(exam[key]))
    return True