2017-08-09 8 views
2

私の質問はQTableWidgetのセル値の表示方法についてです。QTableWidgetはExcelのような特定の小数を表示します

セルを編集していない場合は3小数しか表示せず、編集のためにダブルクリックした場合は完全な値を表示します。


私はバックグラウンドで計算を行い、その後にセル値を設定しています。

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

excelは、セルに特定の桁数を表示するのと同様の形式をとります。

全値:

enter image description here

表示値:

enter image description here

がどのように私はこれをやって行くのでしょうか?

答えて

2

解決策は、デリゲートを使用して、通常の状態で表示されるものを表示するためのペイントメソッドをオーバーライドすることです。私は上記に基づいて次のクラスを作成しました。

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

プラス:

行O列で:

#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

関連する問題