Python:如何设置QTableWidget的指定列以日期格式显示
问题原因
- 原代码中
QDateEdit().setDisplayFormat()方法返回值为None,传入setCellWidget无法生效 - 后续执行
setItem时直接覆盖了第二列的单元格内容,之前的格式设置完全没有生效 - 直接将datetime类型的
datum字段转为字符串会默认携带时间部分
修改方案
方案1:无需编辑功能,直接格式化字符串(推荐,性能更好)
直接在设置单元格内容时对日期字段做格式化,不需要插入控件:
def fill_buchungen(self): self.tableWidget.setRowCount(0) data = helper.select("Select buchungsid,datum,einnahme, ausgabe,buchungstext,belegnr,mwst from buchung") for row, form in enumerate(data): row_position = self.tableWidget.rowCount() self.tableWidget.insertRow(row_position) for column, item in enumerate(form): # 第二列(索引1)是日期字段,单独格式化 if column == 1: # 如果item是datetime对象,用strftime格式化 format_date = item.strftime("%d.%m.%Y") self.tableWidget.setItem(row, column, QTableWidgetItem(format_date)) else: self.tableWidget.setItem(row, column, QTableWidgetItem(str(item)))
如果datum字段查出来是字符串类型的日期时间,就先解析再格式化:
from datetime import datetime # 把上面的format_date行替换为以下内容,解析格式要和你实际的字符串格式匹配 format_date = datetime.strptime(item, "%Y-%m-%d %H:%M:%S").strftime("%d.%m.%Y")
方案2:需要保留日期编辑功能,正确使用QDateEdit控件
def fill_buchungen(self): self.tableWidget.setRowCount(0) data = helper.select("Select buchungsid,datum,einnahme, ausgabe,buchungstext,belegnr,mwst from buchung") for row, form in enumerate(data): row_position = self.tableWidget.rowCount() self.tableWidget.insertRow(row_position) for column, item in enumerate(form): if column == 1: # 先实例化QDateEdit,设置日期和格式 date_edit = QDateEdit() date_edit.setDisplayFormat("dd.mm.yyyy") # 给控件赋值,item如果是datetime就转成QDate date_edit.setDate(item.date() if hasattr(item, 'date') else QDate.fromString(str(item), "yyyy-MM-dd")) # 如果不需要编辑可以加上这行,需要编辑就删除 date_edit.setReadOnly(True) self.tableWidget.setCellWidget(row, column, date_edit) else: self.tableWidget.setItem(row, column, QTableWidgetItem(str(item)))
内容的提问来源于stack exchange,提问作者accpert.com
相关产品推荐
相关产品推荐

