PySide6:如何让QTableView以普通数字而非科学计数法显示数据
解决QTableView大数值科学计数法显示问题
针对你遇到的QTableView中大于100万的数值自动以科学计数法显示的问题,提供以下两种可靠解决方案:
方案一:自定义显示代理(QStyledItemDelegate)
通过重写代理的displayText方法,指定目标列的数值显示格式,无需修改原有模型逻辑:
from PyQt5.QtWidgets import QStyledItemDelegate from PyQt5.QtCore import Qt class NumberFormatDelegate(QStyledItemDelegate): def displayText(self, value, locale): # 仅处理INPUT和OUTPUT列 col_header = self.parent().model().headerData(self.column(), Qt.Horizontal) if col_header in ["INPUT", "OUTPUT"]: try: num = float(value) # 对大于等于100万的数值使用普通整数格式(带千分位) if abs(num) >= 1000000: return "{:,}".format(int(num)) # 小数值保持原有显示逻辑 else: return super().displayText(value, locale) # 非数值类型直接返回原内容 except (ValueError, TypeError): return super().displayText(value, locale) return super().displayText(value, locale)
在设置表格模型后,给SQLTable绑定这个代理:
delegate = NumberFormatDelegate(widgets.SQLTable) widgets.SQLTable.setItemDelegate(delegate)
方案二:子类化QSqlTableModel重写data方法
在模型层统一处理数据显示格式,所有使用该模型的视图都会自动应用格式:
from PyQt5.QtSql import QSqlTableModel from PyQt5.QtCore import Qt class CustomSqlTableModel(QSqlTableModel): def data(self, index, role=Qt.DisplayRole): if role == Qt.DisplayRole: col_header = self.headerData(index.column(), Qt.Horizontal) if col_header in ["INPUT", "OUTPUT"]: raw_value = super().data(index, role) try: num = float(raw_value) if abs(num) >= 1000000: return "{:,}".format(int(num)) else: return raw_value except (ValueError, TypeError): return raw_value # 其他角色保持原有逻辑 return super().data(index, role)
替换原有模型初始化代码:
# 用自定义模型替代原QSqlTableModel self.model = CustomSqlTableModel(self, self.datab) self.model.setQuery(Qquery) self.model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit) self.model.select() self.model.submitAll() widgets.SQLTable.setModel(self.model) widgets.SQLTable.resizeColumnsToContents()
方案对比
- 代理方案:仅修改显示层,代码侵入性低,适合单视图定制需求。
- 模型方案:从数据源层统一处理,适合多视图需要相同格式的场景。
内容的提问来源于stack exchange,提问作者Bmorg
相关产品推荐
相关产品推荐

