• GUI学习之十八——QDateTimeEdit学习总结


     在前面两章我们总结了QSpinBox和QDoubleSpinBox的用法,今天来总结一下QDateTimeEdit控件的基本用法

    一.描述

    1.QDateTimeEdit是一个用来编辑日期和时间的单行文本框,由于大继承自QAbstractSpinBox类,可以用箭头按钮来调节文本内容,也可以用键盘输入。在用按钮修改内容时可以单独修改某个部分(年、月、日、小时、分)

    2.QDateTimeEdit可以用来单独显示日期(QDate),也可以单独显示时间(QTime),当然也可以显示日期时间(QDateTime)

    二.QDateTime的使用

      QDateTime是用来描述日期和时间的对象,他是QDate和QTime两个类的组合,包含了年月日/小时分秒毫秒。

      构造,按照下面的方式构造对象都是可以的。

    date = QDate(2019, 5, 29)
    time = QTime(15, 33)
    date_time = QDateTime(date)
    date_time = QDateTime(date, time)
    date_time = QDateTime(2019, 5, 29, 15, 33)

      日期时间的调整API

    date_time = QDateTime(2019,5,26,15,25)
    date_time.addYears()       #增加年
    date_time.addMonths()      #增加月
    date_time.addDays()        #增加日
    date_time.addSecs()        #增加秒
    date_time.addMSecs()       #增加毫秒
    date_time.setDate()
    date_time.setTime()

      前面几个增加的是有返回值的,并不是把原有的date_time修改,需要对其重新赋值

    date_time = date_time.addYears(3)

      函数传递的参数可以是负值,就是减少相应的值。

    date_time = date_time.addYears(-3)  #减少3年

      计算时间差

    QDateTime.offsetFromUtc()    #到标准时区的时间差(秒)
    QDate.daysTo(QDate)          #相差天数     

      获取时间

    date = QDate.currentDate()
    time = QTime.currentTime()
    date_time = QDateTime.currentDateTime()
    date.day()  # 这个月的第几日
    date.month()  # 哪个月
    date.year()  # 第几年
    date.dayOfWeek()  # 一周的第几日(星期几)
    date.daysInMonth()  # 所在月有多少天
    date.daysInYear()  # 所在年有多少天

      计时功能

    time = QTime.currentTime()
    time.start()        #创建计时开始点
    time.elapsed()      #获取到开始点的时间差
    time.restart()      #重新设置计时点

       可以利用上面的特点做一个秒表(只有功能,不计效果)

    from PyQt5.Qt import *
    import sys
    class Window(QWidget):
        def __init__(self):
            super().__init__()
            self.UI_SetUp()
    
    
        def UI_SetUp(self):
            time = QTime.currentTime()
            time.start()
            self.btn_start = QPushButton('计时开始',self)
            self.btn_start.move(100,200)
            self.btn_restart = QPushButton('重新开始计时',self)
            self.btn_restart.move(100,250)
            self.btn_time = QPushButton('计时',self)
            self.btn_time.move(100,300)
            self.btn_time.setEnabled(False)
            self.label = QLabel(self)
            self.label.move(200,200)
            self.btn_start.clicked.connect(self.start)
            self.btn_time.clicked.connect(self.get_time)
            self.btn_restart.clicked.connect(self.restart)
            pass
        def start(self):
            self.time = QTime.currentTime()
            self.time.start()
            # self.label.setText('计时开始')
            self.label.adjustSize()
            self.btn_time.setEnabled(True)
        def get_time(self):
            # print(self.time.elapsed())
            data = self.label.text()
            print(data)
            self.label.setText(data +'
    '+ str(self.time.elapsed()))
            self.label.adjustSize()
        def restart(self):
            del self.time
            self.label.setText('')
            self.btn_time.setEnabled(False)
    
    
    
    if __name__ =='__main__':
        app = QApplication(sys.argv)
        window = Window()
        window.show()
        sys.exit(app.exec_())
    秒表

    三.QDateTimeEdit的应用

      1.构造函数

    dte = QDateTimeEdit(QDateTime.currentDateTime(),self)
    dte = QDateTimeEdit(QDate.currentDate(),self)
    dte = QDateTimeEdit(QTime.currentTime(),self)

      在声明的时候可以把QDateTime传递进去。

      2.显示格式

      QDateTImeEdit里每一个部分(年月日时分秒)都是一个section,我们可以根据指定的样式来改变显示格式

    QDateTimeEdit.setDisplayFormat()   #指定显示格式

    指定的格式有时间格式符,可以直接使用

    h               #没有前导0的小时(0——12或0——23)
    hh              #有前导0的小时(00——12或00——23)
    H               #没有前导0的显示(0——23)
    HH              #有前导0的显示(00——23)
    m               #没有前导0的分钟(0——59)
    mm              #有前导0的分钟(00——59)
    s               #没有前导0的秒(0——59)
    ss              #有前导0的秒(00——59)
    z               #第二个小数部分,没有尾随0的毫秒(0——999)
    zzz             #第二个小数部分,有尾随0的毫秒(000——999)
    AP/A            #用AM/PM显示(只用一种就可以)
    ap/a            #用am/pm显示
    t               #时区

    还有日期的格式符

    d               #没有前导0的数字日期(1——31)
    dd              #有前导0的数字日期(01——31)
    ddd             #缩写的本地化日期名称(周日——周六,Sun——Sat)
    dddd            #完整的本地化日期名称(星期日——星期六)
    M               #没有前导0的数字月(1——12月)
    MM              #有前导0的数字月(01——12)
    MMM             #缩写的本地化月份(1月——12月)
    MMMM            #完整的本地化月份(一月——十二月)
    yy              #年的后两位
    yyyy            #年(4位)

    就可以直接使用了

    te = QDateTimeEdit(QDateTime.currentDateTime(),window)
    te.setDisplayFormat('yyyy-MMMM-dddd_____AM:hh:mm:ss.zzz')

    出来的就是这样的效果

      3.section操作

      section在选中的情况下可以直接编辑还可以直接用代码操作

    QDateTimeEdit.sectionCount()             #获取section个数——>int
    QDateTimeEdit.setCurrentSection(int)     #设置当前的section
    QDateTimeEdit.currentSectionIndex()      #获取当前section的索引——>int
    QDateTimeEdit.setCurrentSection()        #设置当前操作的日期时间section
    QDateTimeEdit.CurrentSection()           #获取当前的section   
    QDateTimeEdit.sectionAt(int)             #获取指定索引位置的section——QDateTimeEdit.Section
    QDateTimeEdit.sectionText()              #获取section的文本——>str
    QNoSection = ... # type: 'QDateTimeEdit.Section'
    AmPmSection = ... # type: 'QDateTimeEdit.Section'
    MSecSection = ... # type: 'QDateTimeEdit.Section'
    SecondSection = ... # type: 'QDateTimeEdit.Section'
    MinuteSection = ... # type: 'QDateTimeEdit.Section'
    HourSection = ... # type: 'QDateTimeEdit.Section'
    DaySection = ... # type: 'QDateTimeEdit.Section'
    MonthSection = ... # type: 'QDateTimeEdit.Section'
    YearSection = ... # type: 'QDateTimeEdit.Section'
    TimeSections_Mask = ... # type: 'QDateTimeEdit.Section'
    DateSections_Mask = ... # type: 'QDateTimeEdit.Section'
    当前section枚举值QDateTimeEdit.Section

    有几点应该注意一下:

    a.在设置section后,不能重新设置焦点,如果像看看是否设置成功可以用增减按钮测试。如果重新设置焦点则选中的section会重新变到默认值上。

    b.要操作某个section尽量用setCurrentSection(),因为这个操作不考虑section排列的顺序,容错率较高(如果指定小时,不考虑小时在哪个位置上可以直接指定)

      4.范围操作

    QDateTimeEdit.setMaximumDateTime(QDateTime)
    QDateTimeEdit.setMinimumDateTime(QDateTime)
    QDateTimeEdit.setDateTimeRange(mini_datetime,max_datetime)
    QDateTimeEdit.maximumDateTime()
    QDateTimeEdit.minimumDateTime()

    在有些动态设置日期范围的可以这么做

    dte = QDateTimeEdit(QDate.currentDate(),self)
    dte.setDateTimeRange(QDateTime.currentDateTime().addDays(-3),QDateTime.currentDateTime().addDays(3))

    这样就设定了前后3天内。还可以清空自定义的范围

    QDateTimeEdit.clearMaximumDateTime()
    QDateTimeEdit.clearMinimumDateTime()

      5.日历选择控件

    我们上面用的日期修改用的都是键盘输入或者用鼠标点击增减按钮,还有一种方式是利用日历选择控件。

    dte = QDateTimeEdit(QDate.currentDate(),self)
    dte.setCalendarPopup(True)

    当开启了日历选择控件,增减按钮就变成了下拉菜单的样式

    点击了还会弹出个日历控件。如果觉得这个日历的样式不好看,还可以自定义一个控件

    dte.setCalendarWidget(QCalendarWidget)

      6.获取时间

    可以直接获取QDatetime数据,并对其进行相对应的操作

    QDateTimeEdit.dateTime()
    QDateTimeEdit.date()
    QDateTimeEdit.time()

    四.信号

    日期发生改变

    QDateTimeEdit.dateTimeChanged()     #日期时间发生改变    
    QDateTimeEdit.dateChanged()         #日期发生改变    
    QDateTimeEdit.timeChanged()         #时间发生改变

    信号中都传递了相对应的QDateTime或QDate的参数。要注意的是信号发出是在数据彻底发生改变后,比如用键盘输入年份,只有当2019全输入后才会发送信号。

    五.子类

      QDateTimeEdit有两个子类,用法和父类基本一致,只不过一个时描述日期的QDateEdit(),另一个是描述时间的QTimeEdit()。具体作用我们在这里就不细讲了。

  • 相关阅读:
    John Resig 见面会视频
    《程序员羊皮卷》书评
    用 JavaScript 对 JSON 进行模式匹配 (Part 2 实现)
    工具:开发者使用,企业埋单
    「云端 JavaScript 漫游指南」
    如何让你的网站支持 IE9 Pinned Site (Part 1 理论)
    世界顶级黑客自传:Ghost in the Wires
    MVP Summit 2010 Trip (WA)
    Apple 谈论产品 vs Microsoft 谈论技术
    IBatisNet开发使用小结 之二
  • 原文地址:https://www.cnblogs.com/yinsedeyinse/p/10926297.html
Copyright © 2020-2023  润新知