"""当有合法的输入被确认时就将其添加至completerModel,以便再次输入时补全
"""
if self.completerModel.findItems(text): # 避免重复添加
return
item = QStandardItem(text)
self.completerModel.appendRow(item)
def weekDayInfo(self, weekDay: int):
"""返回weekDay对应的名称,后面测试中会被使用
"""
week = {
0: self.tr('周一'),
1: self.tr('周二'),
2: self.tr('周三'),
3: self.tr('周四'),
4: self.tr('周五'),
5: self.tr('周六'),
6: self.tr('周日'),
}
return week[weekDay]
整个dateEdit的实现也很简单,所有复杂的逻辑都已经交给了inputMask,验证器和completer,而我们唯一要做的是为completer添加新输入的合法的数据,这在类方法addDateRecord
中完成了。
测试CustomDateEdit
实现CustomDateEdit
之后,我们就要动手实现引论一节中的程序了。
前面已经说过,最终通过信号传递或者由槽函数获取到的值一定是通过了过滤和验证通过的值。所以想实现引论中的程序我们只需要正确处理CustomDateEdit
的信号即可。
下面直接上测试代码:
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent=parent)
center = QWidget()
self.dateEdit = CustomDateEdit()
self.info = QLabel(self.tr('所选日期是'))
self.dateEdit.textEdited.connect(lambda: self.info.setText(self.tr('所选日期是')))
# 输入结束后按回车触发该信号,同时只有输入数据通过过滤和验证后这个信号才会被发送
self.dateEdit.returnPressed.connect(self.calcWeekDay)
layout = QVBoxLayout()
layout.addWidget(self.dateEdit)
layout.addWidget(self.info, alignment=Qt.AlignCenter)
center.setLayout(layout)
self.setCentralWidget(center)
def calcWeekDay(self):
# 计算所选日期是周几
t = arrow.get(self.dateEdit.text(), self.dateEdit.validator().dateFormat())
weekDayInfo = self.dateEdit.weekDayInfo(t.weekday())
self.info.setText(self.tr('所选日期是') + weekDayInfo)
# 添加记录
self.dateEdit.addDateRecord(self.dateEdit.text())
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MainWindow()
win.show()
app.exec_()
当用户输入一个完整的日期后,按下回车键,程序会自动计算结果并更新到下方的label上。很简单的程序,主要就是为了测试我们的CustomDateEdit
:
程序的行为和预想的差不多,现在你已经初步掌握所学的知识了。
另外也许你会奇怪,为什么要大量使用self.tr
这个函数,不用担心,这只是为了以后介绍国际化时做的准备,现在忽略它也没问题。
如果你发现了任何错误疏漏,或者仍有疑问,欢迎提出,共同进步!