Qt5 Python GUI 编程指南
创建时间:2018-12-10  访问量:6423  8  0

Qt5 Python GUI 编程指南

显示用户从 Calendar 部件中选择的日期

这个应用将使用两个部件,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类的实例从系统时钟中访问并使用格林尼治日历显示日期,包括年、月和日。下面是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部件

为了显示和编辑日期,要使用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部件中:

  1. 打开Qt Designer并基于Dialog without Buttons模板新建一个应用。

  2. 拖动Calendar Widget和Date Edit部件放到窗体中。

  3. 保存应用程序为demoCalendar.ui。这个应用界面的显示如下截图所示:

    使用pyuic5命令将这个.ui的XML文件转换成Python代码。你可以在本书源码中找到生成的Python脚本demoCalendar.py。

  4. 创建一个名为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部件中,如下截图所示: