python - QTableWidget像excel一样显示某些小数

标签 python python-3.x pyqt pyqt5 qtablewidget

我的问题是关于 QTableWidget 显示单元格值的方式。

我希望单元格在未被编辑时仅显示三位小数,而当您双击进行编辑时显示完整值。


我在后台进行计算,然后设置单元格值。

V_D = 3/0.7
self.TableWidget.setItem(0, 0, QTableWidgetItem(str(V_D)))

类似于 excel 格式化单元格以显示特定位数的方式。

完整值:

enter image description here

显示值:

enter image description here

我该怎么做呢?

最佳答案

解决方案是使用委托(delegate)并覆盖负责显示正常状态下外观的 paint 方法,我基于上述构建了以下类。

class FloatDelegate(QItemDelegate):
    def __init__(self, decimals, parent=None):
        QItemDelegate.__init__(self, parent=parent)
        self.nDecimals = decimals

    def paint(self, painter, option, index):
        value = index.model().data(index, Qt.EditRole)
        try:
            number = float(value)
            painter.drawText(option.rect, Qt.AlignLeft, "{:.{}f}".format(number, self.nDecimals))
        except :
            QItemDelegate.paint(self, painter, option, index)

在您的情况下,您应该按如下方式使用它:

self.TableWidget.setItemDelegate(FloatDelegate(3))

例子:

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    w = QTableWidget()
    w.setColumnCount(8)
    w.setRowCount(8)
    for i in range(w.rowCount()):
        for j in range(w.columnCount()):
            number = (i+1)/(j+1)
            w.setItem(i, j, QTableWidgetItem(str(number)))
    w.setItemDelegate(FloatDelegate(3, w))
    w.show()
    sys.exit(app.exec_())

截图:

enter image description here

enter image description here

加上:

按行或列:

#only column 2
setItemDelegateForColumn(2, FloatDelegate(3))
#only row 2
setItemDelegateForRow(2, FloatDelegate(3))

如果你只想应用到单元格 2,3

def paint(self, painter, option, index):
   if index.row() == 2 and index.column() == 3:
        value = index.model().data(index, Qt.EditRole)
        try:
            number = float(value)
            painter.drawText(option.rect, Qt.AlignLeft, "{:.{}f}".format(number, self.nDecimals))
        except :
            QItemDelegate.paint(self, painter, option, index)
    else:
        QItemDelegate.paint(self, painter, option, index)

更新:

  • QStyledItemDelegate:

    from math import log10
    
    class FloatDelegate(QStyledItemDelegate):
        def __init__(self, decimals, parent=None):
            super(FloatDelegate, self).__init__(parent=parent)
            self.nDecimals = decimals
    
        def displayText(self, value, locale):
            try:
                number = float(value)
            except ValueError:
                return super(FloatDelegate, self).displayText(value, locale)
            else:
                precision = log10(number) + 1 + self.nDecimals
                return locale.toString(number, f='f', prec=precision)
    

关于python - QTableWidget像excel一样显示某些小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45599857/

相关文章:

python - 关闭 PyQt 对话框而不关闭主程序

python - Airflow:创建一次性动态 SubDag

python - math.py 和 sys.py 在哪里?

python - 平均成绩计算器

python-3.x - 如何检查列中的值变化

python - 插入在另一个类中创建的像素图

python - PyQt5 - 菜单栏名称中的 "&"符号是什么意思?

python - 为什么通过 for 循环第一次返回正确的计数值?

Python ctypes 用法传递指针

python - 如何在 python 中将函数(矩阵 -> 标量)应用于 3 维的 numpy 数组