You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 17:24:31