这个应用将使用两个部件,Calendar Widget和Date Edit。日期是由用户在Calendar Widget中选择并反应到Date Edit部件中。这两个部件通常都是用来显示当前日期和用户需要的日期的,唯一的不同就是Calendar Widget有一个更大更易读的可视化显示,而Date Edit部件只占用少量的空间。
为了构建这个示例,我们首先需要理解下面这几个东西:
Calendar Widget 显示了所需的日历
QDate类会访问系统时钟
Date Edit部件将显示Calendar Widget中显示的日期
因此,让我们先来一个一个理解前面的部件和类。
为了让用户能够选择一个日期,你需要显示一个日历。Qt Designer中的Calendar Widget可以帮助做这样的事。这个部件是QCalendarWidget类的一个实例,黙认显示当前的年和月,如果有必要还可以更改。日是以简短的形式(Sun,Mon,Tue等等)出现的,并且周六周日被标记为红色。此外,周日在日历是显示在首列。你可以使用Calendar Widget部件中的以下属性来配置显示:
minimumDate:这个属性用于指定最小的日期范围。
maximumDate:这个属性用于指定最大的日期范围。
selectionMode:这个属性能够帮助启用或禁用从Calendar Widget中选择日期的功能。如果这个属性被设置为NoSelection,它就不允许用户选择任何日期。
verticalHeaderFormat:你可以通过将这个属性设置为NoVerticalHeader来删除Calendar Widget中的周末数字。
gridVisible:此属性有助于使日历网格可见或不可见。您可以将此属性设置为布尔值True,以使日历网格可见。
HorizontalHeaderFormat:这个属性用于显示天的显示格式。下面是可用的一些选项:
SingleLetterDayNames:在标题中显示一个天的字母,例如M表示星期一,T表示星期二,等等。
ShortDayNames:头部显示天的简短形式,如Mon是星期一,Tue是星期二等等。
LongDayNames:头部显示天的完整形式,如Monday,Tuesday等等。
NoHorizontalHeader:在HorizontalHeaderFormat中使用这个选项会使头部不可见。
QCalendarWidget提供的方法如下所示:
selectedDate():这个方法返回当前选择的日期。日期是作为QDate对象返回的。
monthShown():这个方法返回当前显示的月份。
yearShown():这个方法返回当前显示的年份。
setFirstDayOfWeek():这个方法用于设置第一列显示一周中的第几天。
selectionChanged():这个方法是当用户改变当前选中的日期时调用。
让我们来看一下QDate类,返回的系统日期是这个类的一个实例。此外,QDate中提供的方法可以从QDate实例中解析出年、月、日。
QDate类可以帮助操作日期。QDate类的实例从系统时钟中访问并使用格林尼治日历显示日期,包括年、月和日。下面是QDate类提供的方法列表:
currentDate():这个方法以QDate实例形式返回系统日期。
setDate():这个方法是基于年、月和日来设置日期的。
year():这个方法是从指定QDate实例中返回年份。
month():这个方法是从指定的QDate实例中返回月份。
day():这个方从是指定的QDate实例中返回天数。
dayOfWeek(): 这个方法是从指定的QDate实例中返回一周中的第几天。
addDays():这个方法是向指定的日期中添加指定的天数值并返回新的日期。
addMonths():这个方法是向指定的日期中添加指定的月数值并返回新的日期。
addYear():这个方法是向指定的日期中添加指定的年数值并返回新的日期。
daysTo():这个方法返回两个日期之间的相差几天的数值。
daysInMonth():这个方法返回指定月份中的天数。
daysInYear():这个方法返回指定年份中的天数。
toPyDate():这个方法返回一个日期字符串。format参数决定日期字符串的格式。
日期字符串的格式是由下面的一些格式指定的:
d:这个表达式以无前导0的形式显示天数值(1到31)
dd:这个表达式以有前导0的形式显示天数值(01到31)
ddd:这个表达式以简短形式显示天数(Mon,Tue等等)
dddd:这个表达式以完整格式显示天数(Monday,Tuesday等等)
M:这个表达式以无前导0的形式显示月份值(1到12)
MM:这个表达式以有前导0的形式显示月份值(01到12)
MMM:这个表达式以简短形式显示月份值(Jan,Feb等等)
MMMM:这个表达式以完整的形式显示月份值(January,February等等)
yy:这个表达式显示两位数年数值(00到99)
yyyy:这个表达式显示四位数的年数值
让我们来看下面的例子:
dd.MM.yyyy会将日期显示为15.01.2018
ddd MMMM d yy 会将日期显示为Sun January 15 18
为了显示用户在Calendar Widget中选择的日期,你需要使用Date Edit部件。
为了显示和编辑日期,要使用Date Edit部件,它是QDateEdit类的实例。
Date Edit部件中配置的属性如下所示:
minimumDate:使用这个属性为部件定义一个日期最小值
maximumDate:使用这个属性为部件定义一个日期最大值
setDate():这个方法用于设置部件中显示的日期
setDisplayFormat():这个方法用于为Date Edit部件中的日期设置显示格式
它们输入的格式如下所示:
dd.MM.yyyy 15.01.2018
MMM d yy Jan 15 18
MMM d yyy Jan 15 2018
MMMM d yy January 15 18
正如前面提到的,在下面的应用程序中你将学习到在Date Edit部件中显示用户通过Calendar Widget选择的日期。
Calendar Widget和Date Edit这两个部件都是用于显示日期的,唯一的不同是Calendar Widget有更大的显示并且还显示日期对应的工作日,而Date Edit部件提供了旋转按钮来转动天数、月份数和年份数。这里是构建一个应用程序的步骤,这个应用程序是将Calendar Widget中选择的日期显示在Date Edit部件中:
打开Qt Designer并基于Dialog without Buttons模板新建一个应用。
拖动Calendar Widget和Date Edit部件放到窗体中。
保存应用程序为demoCalendar.ui。这个应用界面的显示如下截图所示:
使用pyuic5命令将这个.ui的XML文件转换成Python代码。你可以在本书源码中找到生成的Python脚本demoCalendar.py。
创建一个名为callCalendar.pyw的脚本文件并导入前面的代码demoCalendar.py,用于调用用户界面的设计并在Date Edit部件中显示用户在Calendar Widget中选择的日期。Python脚本callCalendar.pyw的代码如下所示:
import sys
from PyQt5.QtWidgets import QDialog, QApplication
from demoCalendar import *
class MyForm(QDialog):
def __init__(self):
super().__init__()
self.ui = Ui_Dialog()
self.ui.setupUi(self)
self.ui.calendarWidget.selectionChanged.connect
(self.dispdate)
self.show()
def dispdate(self):
self.ui.dateEdit.setDate(self.ui.calendarWidget.
selectedDate())
if __name__=="__main__":
app = QApplication(sys.argv)
w = MyForm()
w.show()
sys.exit(app.exec_())
在代码中,你可以看到Calendar Widget中的selectionChanged信号与dispdate函数相关联。因此,当用户选择一个日期时,就会调用这个dispdate函数。在dispdate函数中,用户选择的日期是通过selectedDate()方法获取的并通过setDate方法将其显示在Date Edit部件中。
运行应用程序,Calendar Widget将会显示当前系统的日期并且Date Edit部件简单的显示黙认的日期,01/01/2000。
日期以黙认 mm/dd/yyyy 的格式显示,如下截图所示:
当从Calendar Widget中选择任意日期时,选中的日期会显示在Date Edit部件中,如下截图所示:
你可以通过调用setDisplayFormat()方法来显示不同格式的日期。让我们来修改displaydate()函数以显示 MMM d yyyy格式的日期:
def dispdate(self):
self.ui.dateEdit.setDisplayFormat('MMM d yyyy')
self.ui.dateEdit.setDate(self.ui.calendarWidget.selectedDate())
现在,Calendar Widget中选中的日期将会以期望的格式显示在Date Edit部件中,如下截图所示: