PyQt5快速入门到项目实战:12、与日期时间相关的控件

PyQt5快速入门到项目实战:12、与日期时间相关的控件

PyQT5admin2022-08-25 13:40:1465A+A-

PyQt5快速入门项目实战:12、与日期时间相关的控件

本章介绍QCalendarWidget和QDateTimeEdit两个控件。

12.1 QCalendarWidget

下面来简单显示一个日历控件,点击不同的星期,会显示不同的心情:

import sys
from PyQt5.QtCore import QDate, Qt
from PyQt5.QtWidgets import QApplication, QWidget, QCalendarWidget, QLabel, QVBoxLayout
EMOTION = {                                                                     # 1 
    'Mon': '(╯°Д°)╯︵ ┻━┻',
    'Tue': '(╯ ̄Д ̄)╯╘═╛',
    'Wed': '╭( ̄▽ ̄)╯╧═╧',
    'Thu': '_(:з」∠)_',
    'Fri': '(๑•̀ㅂ•́)و✧',
    'Sat': '( ˘ 3˘)♥',
    'Sun': '(;′༎ຶД༎ຶ`)'
}

class Demo(QWidget):
    def __init__(self):
        super(Demo, self).__init__()
        self.calendar = QCalendarWidget(self)
        self.calendar.setMinimumDate(QDate(1946, 2, 14))                        # 2
        self.calendar.setMaximumDate(QDate(6666, 6, 6))                         # 3
        # self.calendar.setDateRange(QDate(1946, 2, 14), QDate(6666, 6, 6))
        # self.calendar.setFirstDayOfWeek(Qt.Monday)                            # 4
        # self.calendar.setSelectedDate(QDate(1946, 2, 14))                     # 5
        self.calendar.setGridVisible(True)                                      # 6
        self.calendar.clicked.connect(self.show_emotion_func)                   # 6
        print(self.calendar.minimumDate())                                      # 7
        print(self.calendar.maximumDate())
        print(self.calendar.selectedDate())
        self.label = QLabel(self)                                               # 8
        self.label.setAlignment(Qt.AlignCenter)
        weekday = self.calendar.selectedDate().toString('ddd')                  # 9
        self.label.setText(EMOTION[weekday])
        self.v_layout = QVBoxLayout()
        self.v_layout.addWidget(self.calendar)
        self.v_layout.addWidget(self.label)

        self.setLayout(self.v_layout)
        self.setWindowTitle('QCalendarWidget')
    def show_emotion_func(self):                                                # 10
        weekday = self.calendar.selectedDate().toString('ddd')
        self.label.setText(EMOTION[weekday])

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())
  1. 设置一个字典,并将各个星期及对应的颜文字分别作为键值输入;

  2. 通过setMinimumDate()和setMaximumDate()可以设置日历的最小和最大日期(可用setDateRange()替代),传入的参数为QDate。

  3. setFirstDayOfWeek()方法可以设置一个星期的第一天,默认第一天为星期天,可传入的参数有:

Qt.Monday
Qt.Tuesday
Qt.Wednesday
Qt.Thursday
Qt.Friday
Qt.Saturday
Qt.Sunday
  1. setSelectedDate()方法可以设置日历初始化时所显示的日期,如果不设置,则默认是当天日期;

  2. setGridVisible(bool)方法可以设置是否在日历上显示网格;

  3. 当点击到日历上的某个日期时,clicked信号就会被触发。

  4. minimumDate()、maximumDate()和selectedDate()分别获取日历的最早日期,最后日期和当前所选日期,类型为QDate;

  5. 实例化一个QLabel控件用于显示颜文字;

  6. 首先通过selectedDate()方法获取到当前所选日期,接着通过toString(‘ddd‘)方法获取星期的缩写,然后作为字典的键获取对应的值(注:笔者系统语言为英语,读者的系统语言为中文的话,则会获取到中文的星期名,那么此时应该将开头字典的键换成中文);

  7. 在槽函数中同理,获取到对应的值后,让QLabel控件进行显示。

运行截图如下:

12.2 QDateTimeEdit

QDateTimeEdit是QDateEdit和QTimeEdit的父类,看名字就知道QDateTimeEdit可以编辑日期和时间,QDateEdit只能编辑日期(年月日),而QTimeEdit只能编辑时间(时分秒),三种控件用法十分类似,以下重点讲QDateTimeEdit:

import sys
from PyQt5.QtCore import QDate, QTime, QDateTime
from PyQt5.QtWidgets import QApplication, QWidget, QDateTimeEdit, QDateEdit, QTimeEdit, QVBoxLayout

class Demo(QWidget):
    def __init__(self):
        super(Demo, self).__init__()    
        self.datetime_1 = QDateTimeEdit(self)                                           # 1
        self.datetime_1.dateChanged.connect(lambda: print('Date Changed!'))
        self.datetime_2 = QDateTimeEdit(QDateTime.currentDateTime(), self)              # 2
        self.datetime_2.setDisplayFormat('yyyy-MM-dd HH:mm:ss')
        self.datetime_2.timeChanged.connect(lambda: print('Time Changed!'))
        print(self.datetime_2.date())
        print(self.datetime_2.time())
        print(self.datetime_2.dateTime())
        self.datetime_3 = QDateTimeEdit(QDateTime.currentDateTime(), self)              # 3
        self.datetime_3.dateTimeChanged.connect(lambda: print('DateTime Changed!'))
        self.datetime_3.setCalendarPopup(True)
        self.datetime_4 = QDateTimeEdit(QDate.currentDate(), self)                      # 4
        self.datetime_5 = QDateTimeEdit(QTime.currentTime(), self)
        self.date = QDateEdit(QDate.currentDate(), self)                                # 5
        self.date.setDisplayFormat('yyyy/MM/dd')
        print(self.date.date())
        self.time = QTimeEdit(QTime.currentTime(), self)                                # 6
        self.time.setDisplayFormat('HH:mm:ss')
        print(self.time.time())
        self.v_layout = QVBoxLayout()
        self.v_layout.addWidget(self.datetime_1)
        self.v_layout.addWidget(self.datetime_2)
        self.v_layout.addWidget(self.datetime_3)
        self.v_layout.addWidget(self.datetime_4)
        self.v_layout.addWidget(self.datetime_5)
        self.v_layout.addWidget(self.date)
        self.v_layout.addWidget(self.time)
        self.setLayout(self.v_layout)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())
  1. 实例化一个QDateTimeEdit控件,并将其dateChanged信号与print(‘Date Changed!’)打印函数连接起来,也就是说每当用户改变该控件上的日期(不是时间)时,就会触发dateChanged信号,而控制台就会打印’Date Changed!’;

  2. 实例化一个QDateTimeEdit控件并将日期时间设置为当前的日期和时间,如果没有设置(像1中的QdateTimeEdit一样),那么就会显示默认日期时间2000/1/1 12:00 AM。通过setDisplayFormat()方法可以设置日期时间的显示格式。这里还将timeChanged信号和打印函数进行了连接,也就是说每当用户改变时间(不是日期)时,就会触发timeChanged信号,而控制台就会打印’Time Changed!’,通过调用date()、time()和dateTime()可以分别获取到日期、时间以及合并的日期时间;

  3. 该QDateTimeEdit控件的dateTimeChanged信号和打印函数连接了起来,也就是说用户不管是改了日期还是时间,都会触发该信号,从而打印’DateTime Changed!’,setCalendarPopup(True)方法可以设置日历弹窗;

  4. self.datetime_4只传入了日期参数,没有时间;而self.datetime_5只传入了时间参数,没有日期;

5-6. 分别实例化了一个QDateEdit和QTimeEdit控件,用法和QDateTimeEdit控件极为类似。

运行截图如下:

12.3 小结

  1. QCalendarWidget为日历控件,用户可以设置日期范围,可以设置日历初始化时显示的日期(如果没有设置的话,默认为当天日期);

  2. QDateTimeEdit、QDateEdit以及QTimeEdit这三个控件用法差不多,读者掌握QDateTimeEdit的话其他两种其实也就明白怎么使用了;

  3. 通过setCalendarPopup(True)方法可以让QDateTimeEdit和QDateEdit显示日历。

网易云课堂搜索课程:Pyqt5通用爬虫桌面软件开发实战

点击这里复制本文地址 以上内容来源于互联网,由爱搜问收集整理,如有侵权请联系站长,核实后立即删除,转载分享时注明本文地址!

支持Ctrl+Enter提交
qrcode

爱搜问 ©2021-2022 吉ICP备2022002266号 Aisouwen.COM.
站点地图1 站点地图2 站点地图3