2017-08-09 326 views
2

我的问题是关于QTableWidget显示单元格值的方式。QTableWidget显示excel等特定小数点

我希望单元格在未编辑时只显示三位小数,并在您双击编辑时显示完整值。


我在做背景计算,然后设置单元格值。

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

与excel格式化单元格以显示特定数量的数字的方式类似。

全部价值:

enter image description here

显示值:

enter image description here

我怎么会去这样做呢?

回答

2

解决方案是使用委托并重写负责显示正常状态下的外观的paint方法,我已经基于上面构建了以下类。

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_()) 

截图:

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) 

在你的情况如下,你应该使用它

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) 
+0

酷有道理。如果一个单元格是空白的呢?它使程序崩溃。另外,你可以.setItemDelegate在某些单元格上,而不仅仅是整个表格? – dre

+0

它仍然崩溃,当我测试你给的代码时,它是好的,直到我删除单元格中的内容然后它崩溃 – dre

+0

https://drive.google.com/file/d/0BzcHlfStubD3UmJIeUdVT1NwTGs/view?usp=sharing – dre