PySide2子类化QSqlTableModel重写data方法如何避免递归深度错误
PySide2 QSqlTableModel秒数字段格式化问题
我有一个已稳定运行一年的PySide2生产应用,通过QSqlTableView展示QSqlTableModel的数据。其中三个字段存储原始秒数(例如6282代表六千多秒),需要将这三个字段在表格中的显示效果,以及导出到Word文档时的格式改为h:mm:ss格式。
我尝试子类化QSqlTableModel并重写data方法来实现格式化,但在获取原始字段值时遇到瓶颈——所有尝试的方式都会触发最大递归深度错误,因为这些操作最终会反复调用重写的data方法。
相关代码如下:
class myQSqlTableModel(PySide2.QtSql.QSqlTableModel): def __init__(self, db: QSqlDatabase): super().__init__() self.DB = db def data(self, index, role): if not index.isValid(): return None # ********** 瓶颈位置 *************** # 以下尝试均触发递归错误 # self.selectRow(index.row()) # val = self.record(index.row()).value(index.column()) # val = index.sibling(index.row(), index.column()) # item = self.itemData(index) # for key in item: # print(f"key is {key}, value is {item[key].ToString()}") # QAbstractTableModel示例会调用内部存储的二维列表获取值,但QSqlTableModel没有类似的直接内部结构 # *********** 瓶颈注释结束 *********** if role==Qt.ItemDataRole.DisplayRole: # 将指定字段的秒数格式化为h:mm:ss col_name = self.headerData(index.column(), Qt.Horizontal, Qt.ItemDataRole.DisplayRole) if col_name in ['start', 'end', 'duration']: x = val s = x % 60 m = (x // 60) % 60 h = x // 3600 return "%01d:%02d:%02d" % (h, m, s) else: return val return None class Ui_ExportWindow(QMainWindow, Ui_ExportWindow): def __init__(self, DB): super().__init__() self.setupUi(self) self.DB = DB self.dbFile = settings['dbFile'] self.doc_folder = settings['export_folder'] # 跳过无关代码 # 配置QTableView关联自定义模型 self.umodel = myQSqlTableModel(self.DB)
我已经搜索了两天相关资料,但大多是关于样式设置(如高亮、字体)的内容,很少有关于将整数字段转换为格式化字符串的案例。希望能得到解决当前递归问题的建议,或者是否有其他替代方案实现需求。
内容的提问来源于stack exchange,提问作者Persistent at Python
相关产品推荐
相关产品推荐

