Skip to content

关于siui.components.widgets.table中SiTableView的.deleteRow(index: int)方法使用时出现RuntimeError: wrapped C/C++ object of type SiRow has been deleted问题 #284

@luotianhao21

Description

@luotianhao21

SiTableView中的.deleteRow(index: int)方法出现RuntimeError错误

当我调用由SiTableView构建的表格中的.deleteRow()方法来删除表格中第index行时会出现以下错误:

Traceback (most recent call last):
    File "c:\Users\Admin\AppData\Local\Programs\Python\Python312\Lib\site-packages\siui\components\widgets\table.py", line 119, in resizeEvent
self.container().arrangeWidgets()
    File "c:\Users\Admin\AppData\Local\Programs\Python\Python312\Lib\site-packages\siui\components\widgets\container.py", line 839, in arrangeWidgets
used_height[column_index] += widget.height() + self.spacing[1]
^^^^^^^^^^^^^^^
    RuntimeError: wrapped C/C++ object of type SiRow has been deleted

出现了已经删除了控件但是还有函数在调用.arrangeWidgets()来访问控件而引起的RuntimeError错误,目前看上去是因为库中SiTableView并没有重写.deleteRow()方法导致使用时直接调用了SiTableView继承的ABCSiTable中的.deleteRow():

def deleteRow(self, index):
        deleted_row = self.rows_.pop(index)
        deleted_row.deleteLater()
        self.rowDeleted.emit(index)

这导致了其它函数还在调用self.row_中的控件,.deleteRow()就直接给控件给删除了。

以下是我出现错误的部分代码

self.questionnaire_table = SiTableView(self)
self.questionnaire_table.resize(768, 400)
self.questionnaire_table.addColumn("", 100, 40, Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter) # 复选框按钮列
self.questionnaire_table.addColumn("性别", 64, 40, Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter)
self.questionnaire_table.addColumn("年龄", 64, 40, Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter)
self.questionnaire_table.addColumn("大学", 148, 40, Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter)
self.questionnaire_table.addColumn("年级", 64, 40, Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter)
self.questionnaire_table.addColumn("民族", 64, 40, Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter)
self.questionnaire_table.addColumn("", 98, 40, Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) # 编辑按钮列

self.questionnaire_table.addRow(data=["", "男", "20", "清华大学", "大一", "汉族", ""])
self.questionnaire_table.addRow(data=["", "男", "20", "清华大学", "大一", "汉族", ""])

self.questionnaire_table.deleteRow(0)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions