如何用QDate选择更新QTableView单元格?含connect语法及导入问题
问题解决方案
1. 实现日期更新的正确connect语法
你遇到的核心问题是dateChanged信号传递的是QDate对象,而item.setText()需要接收字符串类型。解决这个问题的关键是在信号和槽之间加一层转换逻辑,把QDate转成指定格式的字符串。
最直接的方式是用lambda表达式作为中间桥梁,在里面完成日期到字符串的转换:
deDelegate.dateChanged.connect(lambda selected_date: item.setText(selected_date.toString('yyyy-MM-dd')))
当用户选择新日期时,lambda会自动把QDate对象转成yyyy-MM-dd格式的字符串,再调用item.setText()更新单元格内容。如果后续想用Qt.ISODate格式(和yyyy-MM-dd等价),也可以写成:
deDelegate.dateChanged.connect(lambda selected_date: item.setText(selected_date.toString(Qt.ISODate)))
2. Qt.ISODate的正确导入语法
Qt.ISODate是PyQt5.QtCore模块下Qt类的枚举值,你需要直接导入Qt类:
from PyQt5.QtCore import QDate, Qt # 将Qt加入导入列表
之后就能正常使用Qt.ISODate了,比如解析日期时可以替换成更规范的写法:
myQDate = QDate.fromString(date, Qt.ISODate)
修改后的完整代码示例
这里把两个修改点整合到你的代码中:
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys, os from PyQt5 import uic from PyQt5.QtGui import QStandardItemModel from PyQt5.QtWidgets import QDialog, QApplication, QDateEdit from PyQt5.QtCore import QDate, Qt # 导入Qt类 class GUI(QDialog): def __init__(self): super(GUI, self).__init__() dirname = os.path.dirname(os.path.abspath(__file__)) uic.loadUi(os.path.join(dirname,'main.ui'), self) # button self.btnPopulate.clicked.connect(self.populate) # table model self.header = ['col1', 'col2', 'col3'] self.QSModel = QStandardItemModel() self.QSModel.setColumnCount(3) self.QSModel.setHorizontalHeaderLabels(self.header) self.tableView.setModel(self.QSModel) def populate(self): row = self.QSModel.rowCount() for x in range(7): self.QSModel.insertRow(row) self.QSModel.setData(self.QSModel.index(row, 0), 'data') self.QSModel.item(row, 0).setEditable(True) self.QSModel.setData(self.QSModel.index(row, 1), 'data') self.QSModel.item(row, 1).setEditable(True) if x % 2 == 0: self.QSModel.setData(self.QSModel.index(row, 2), '2018-01-06') item = self.tableView.model().item(row, 2) date = self.QSModel.data(self.QSModel.index(row, 2)) deDelegate = QDateEdit() deDelegate.setCalendarPopup(True) deDelegate.setDisplayFormat('yyyy-MM-dd') # 使用Qt.ISODate解析日期 myQDate = QDate.fromString(date, Qt.ISODate) deDelegate.setDate(myQDate) self.tableView.setIndexWidget(item.index(), deDelegate) # 正确的connect写法,用lambda转换日期格式 deDelegate.dateChanged.connect(lambda d: item.setText(d.toString(Qt.ISODate))) else: self.QSModel.setData(self.QSModel.index(row, 2), 'data') if __name__ == '__main__': app = QApplication(sys.argv) window = GUI() window.show() sys.exit(app.exec_())
这样修改后,当你在QDateEdit中选择新日期时,对应的单元格内容会自动更新为指定格式的字符串,同时也能正常使用Qt.ISODate枚举值了。
内容的提问来源于stack exchange,提问作者Nemo XXX
相关产品推荐
相关产品推荐

