dre*_*dre 3 python pyqt qtablewidget python-3.x pyqt5
我的问题是关于QTableWidget显示单元格值的方式.
我希望单元格在未编辑时仅显示三位小数,并在双击进行编辑时显示完整值.
我在后台进行计算,然后设置单元格值.
V_D = 3/0.7
self.TableWidget.setItem(0, 0, QTableWidgetItem(str(V_D)))
Run Code Online (Sandbox Code Playgroud)
类似于excel格式化单元格以显示特定数量的数字.
全价:
显示价值:
我该怎么做呢?
解决方案是使用委托并覆盖负责显示正常状态的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)
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您应该使用它如下:
self.TableWidget.setItemDelegate(FloatDelegate(3))
Run Code Online (Sandbox Code Playgroud)
例:
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_())
Run Code Online (Sandbox Code Playgroud)
截图:
加:
按行o列:
#only column 2
setItemDelegateForColumn(2, FloatDelegate(3))
#only row 2
setItemDelegateForRow(2, FloatDelegate(3))
Run Code Online (Sandbox Code Playgroud)
如果您只想申请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)
Run Code Online (Sandbox Code Playgroud)