55-输入和显示-日期时间类及控件-日期时间控件QDateTimeEdit

日期时间控件QDateTimeEdit

日期时间控件包括QDateTimeEdit,QDateEdit 和QTimeEdit 三个控件。

这三个控件可以显示日期时间,但更多的是用于输入日期时间,

  • QDateTimeEdit可以输入日期和时间,QDateTimeEdit是有下拉列表的日历控件用于选择日期
  • QDateEdit 只能输入日期
  • QTimeEdit 只能输人时间

用QDateTimeEdit、QDateEdit和QTimeEdit类创建实例对象的方法如下所示,其中parent是控件所在的窗体或容器控件。

QDateTimeEdit是从QAbstractSpinBox类继承而来的

QDateEdit和QTimeEdit都是从QDateTimeEdit类继承而来的。

from PySide6.QtWidgets import QDateTimeEdit,QTimeEdit,QDateEdit

QDateTimeEdit(d: PySide6.QtCore.QDate,parent: Union[PySide6.QtWidgets.QWidget,NoneType]= None)-> None
QDateTimeEdit(dt: PySide6.QtCore.QDateTime,parent: Union[PySide6.QtWidgets.QWidget,NoneType]= None)-> None
QDateTimeEdit(parent: Union[PySide6.QtWidgets.QWidget,NoneType]= None)-> None
QDateTimeEdit(t: PySide6.QtCore.QTime,parent: Union[PySide6.QtWidgets.QWidget,NoneType]= None)-> None
QDateTimeEdit(val: Any,parserType: PySide6.QtCore.QMetaType.Type,parent: Union[PySide6.QtWidgets.QWidget,NoneType]= None)-> None

QDateEdit(date: PySide6.QtCore.QDate,parent: Union[PySide6.QtWidgets.QWidget,NoneType]= None)-> None
QDateEdit(parent: Union[PySide6.QtWidgets.QWidget,NoneType]= None)-> None

QTimeEdit(parent: Union[PySide6.QtWidgets.QWidget,NoneType]= None)-> None
QTimeEdit(time: PySide6.QtCore.QTime,parent: Union[PySide6.QtWidgets.QWidget,NoneType]= None)-> None
QDateTimeEdit、QDateEdit和QTimeEdit的方法

日期时间控件 QDateTimeEdit 的常用方法如表所示。

由于QDateEdit 和QTimeEdit 都继承自QDateTimeEdit,因此 QDateEdit 和 QTimeEdit 的方法与QDateTimeEdit 的大多数方法相同。

QDateTimeEdit 的主要方法介绍如下:

  • 设置时间日期
    • 用setDate(QDate),setTime(QTime)和 setDateTime(QDateTime)方法为时间和日期控件QDateEditQTimeEdit 和 QDateTimeEdit 设置日期和时间
    • 用setDateRange(QDate,QDate),setTimeRange(QTime,QTime)或 setDateTimeRange(QDateTime,QDateTime)方法设置日期和时间的最小值和最大值
  • 时间格式和获取
    • 用setDisplayFormat(format)方法可以设置QDateTimeEdit 显示日期时间的格式
    • 用displayFormat()方法获取显示格式。关于格式符号的使用,请参考日期类和时间类的内容。
  • 字符串和日期时间对象转换
    • 用dateTimeFromText(str)方法可以将字符串转换成日期时间对象
    • 用textFromDateTime(QDateTime)方法可以将日期时间转换成字符串
  • 日期时间控件的输入部分被分割成年、月、日、时、分、秒、毫秒多个部分,
    • 用setSelectedSection(QDateTimeEdit.Section)方法可以使某个部分被选中,其中QDateTimeEdit.Section可以取:
      • QDateTimeEdit.NoSection
      • QDateTimeEdit.AmPmSection AM/PM
      • QDateTimeEdit.MSecSection 毫秒
      • QDateTimeEdit.SecondSection 秒
      • QDateTimeEdit.MinuteSection 分
      • QDateTimeEdit.HourSection 时
      • QDateTimeEdit.DavSection 日
      • QDateTimeEdit.MonthSection 月
      • QDateTimeEdit.YearSection 年
    • 用sectionText(section:QDateTimeEdit.Section)方法可以获取各个部分的文本;
    • 用sectionAtindex:int)方法可以根据索引获取对应部分,例如sectionAt(0)为QDateTimeEdit.YearSection。
QDateTimeEdit的方法及参数类型 返回值的类型 说明
[slot]setTime(time: QTime) None 设置时间
time() QTime 获取时间
[slot]setDate(date: QDate) None 设置日期
date() QDate 获取日期
[slot]setDateTime(dateTime: QDateTime) None 设置日期时间
dateTime() QDateTime 获取日期时间
setDateRange(min:QDate,max: QDate) None 设置日期的范围
setTimeRange(min: QTime,max: QTime) None 设置时间的范围
setDateTimeRange(min: QDateTime,max: QDateTime) None 设置日期时间的范围
sefMaximumDate(max: QDate)
setMaximumDateTime(dt:QDateTime)
setMaximumTime(max: QTime)
None 设置显示的最大日期时间
setMinimumDate(min:QDate)
setMinimumDateTime(dt:QDateTime)
setMinimumTime(min:QTime)
None 设置显示的最小日期时间
clearMaximumDate()
clearMaximumDateTime()
clearMaximumTime()
None 清除最大日期时间限制
clearMinimumDate()
clearMinimumDateTime()
clearMinimumTime()
None 清除最小日期时间限制
setCalendarPopup(bool) None 设置是否有日历控件
calendarPopup() bool 获取是否有日历控件
setCalendarWidget(QCalendarWidget) None 设置日历控件
setDisplayFormat(format:str) None 设置显示格式
displayFormat() str 获取显示格式
dateTimeFromText(str) QDateTime 将字符串转换成日期时间对象
textFromDateTime(QDateTime) str 将日期时间对象转换成字符串
setCalendar(QCalendar) None 设置日历
setSelectedSection(QDateTimeEdit.Section) None 设置被选中的部分
sectionText(section:QDateTimeEdit.Section) Str 获取对应部分的文本
sectionCount() int 获取总共分几部分
setTimeSpec(spec: Qt.TimeSpec) None 设置时间计时参考点
日期格式

QDateTimeEdit 通过 setDisplayFormat()函数来设置显示的日期时间格式。

支持的日期格式如表所示。

表 达式 输出效果d
d 一天中的数字,不带前导零(1~31)
dd 以带前导零(01~31)的数字表示的日期
ddd 缩写的日期名称(星期一至星期日)
dddd 一整天的名称(星期一至星期日)
M 以不带前导零(1~12)的数字表示的月份
MM 月份,以前导零(01~12)开头的数字
MMM 缩写的月份名称(从 Jan 到 Dec)
MMMM 长月份名称(一月至十二月)
y 以两位数表示的年份(00~99)
yyyy 以4位数表示的年份。如果年份为负数,则在前面加上负号,以5个字符为单位
h 没有前导零的小时(如果显示 AM/PM,则为0~23 或 1~12)
hh 带前导零的小时(如果显示AM/PM,则为00~23或01~12)
H 没有前导零的小时(0~23,即使有 AM/PM 显示)
HH 带前导零的小时(00~23,即使有 AM/PM 显示)
m 没有前导零(0~59)的分钟
mm 带前导零的分钟(00~59)
s 整秒,不带任何前导零(0~59)
ss 整秒,使用前导零(00~59)
z 秒的小数部分,保留到小数点后,并且不尾随零(0~999)。s.z会将秒显示为完全可用(毫秒)的 精度,不会出现零
zzz 秒的小数部分,以毫秒为单位,在适用的情况下包括尾随零(000~999)
AP或A 使用AM/PM显示。A/AP将替换为AM或PM
ap或a 使用 am/pm 显示。a/ap 将替换为am 或pm
t 时区(如CEST)

使用示例如表所示

格 式 效 果
dd.MM.yyyy 21.05.2001
dd MMMM d yy Tue May 21 01
hh:mm:ss.zzz 13:09.1
hh:mm:ss.z 13:09.1
h:m:s ap 2:13:09 PM
'The day is’dddd The day is Sunday
hh:mm:ss.zzz 14:13:09.042
h:m:s ap 2:13:9 pm
H:m:s a 14:13:9 pm
使用弹出日历小部件

可以将QDateTimeEdit 配置为允许使用QCalendarWidget选择日期

  • 可以通过设置calendarPopup 属性(使用 setCalendarPopup)函数)来启用。
  • 也可以通过setCalendarWidget)函数来使用自定义日历小部件,用作日历弹出窗口:

使用calendarWidget0函数可以获取现有的日历小部件。代码如下:

# 弹出日历小部件
dateTimeEdit_cal = QDateTimeEdit(QDateTime.currentDateTime(),self)
dateTimeEdit_cal.setCalendarPopup(True)
vlayout.addwidget(QLabel('弹出日历小部件))
vlayout.addWidget(dateTimeEdit_cal)
QDateTimeEdit、QDateEdit和QTimeEdit的信号
信号 描述
dateChanged(QDate) 当日期改变时发送
dateTimeChanged(QDateTime) 当日期或时间改变时发送
timeChangedQTime) 当时间改变时发送
editingFinished() 当编辑完成按Enter 键或失去焦点时发送
QDateTime、QDate、QTime例子
import sys
import time

from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QDateTime")
        self.resize(500,500)
        self.move(400,250)
        self.setup_ui()

    def setup_ui(self):
        # QDateTime QDate QTime 这三个类之间没有继承关系

        # QDateTime
        # -------------创建----------------
        # dt = QDateTime()
        # dt = QDateTime(2021,5,8,12,30)# 创建时设置年、月、日、时、分
        dt = QDateTime.currentDateTime()# 静态方法,获取当前时间
        # dt = QDateTime.currentDateTimeUtc()# 静态方法,获取当前的UTC时间
        print("dt:",dt)

        # -------------调整日期时间------------
        dt_add_year = dt.addYears(1)# 增加1年,返回一个新的QDateTime对象
        print("dt_add_year:",dt_add_year)
        print("dt_add_secs",dt.addSecs(600))# 增加小时或分钟没有专门的函数,需要通过增加秒来设置
        dt.setTime(QTime(12,5,31,0))# 设置时间

        # -----------计算时间差-----------
        print("offset from UTC",QDateTime.offsetFromUtc(QDateTime.currentDateTime()))# 本地时间与UTC时间之差(单位为s)
        print(dt.secsTo(QDateTime.currentDateTime()))# 计算两个时间之差,单位s

        # ----------展示时间-------
        dte = QDateTimeEdit(dt,self)# 方便查看起见,展示一下dt的信息
        dte.move(100,100)

        # QDate
        # ---------构造----------
        # qd = QDate(2020,1,1)# 构造时传入年月日信息
        qd = QDate.currentDate()
        print(QDate.currentDate())# 获取当前日期

        # --------调整日期------
        # 类似QDateTime

        # ---------计算时间差-----
        print("dates to 2001.1.1:",QDate(2001,1,1).daysTo(qd))

        # ---------获取时间--------
        print("day of week",qd.dayOfWeek())# 这一周的第几日
        print("day of year",qd.dayOfYear())# 这一年的第几日
        print("days in month",qd.daysInMonth())# 这一月总共多少天
        print("days in year",qd.daysInYear())# 这一年总共多少天

        # QTime
        # --------构造--------
        my_time = QTime(12,00)
        # my_time = QTime.currentTime()

        # -------调整时间-------
        # 类似QDAteTime

        # --------计算时间差------
        print("secs to:",my_time.secsTo(QTime(12,0)))


if __name__ =="__main__":
    app = QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec())

"""
dt: PySide6.QtCore.QDateTime(2023,3,19,16,10,34,323,0)
dt_add_year: PySide6.QtCore.QDateTime(2024,3,19,16,10,34,323,0)
dt_add_secs PySide6.QtCore.QDateTime(2023,3,19,16,20,34,323,0)
offset from UTC 28800
14703
PySide6.QtCore.QDate(2023,3,19)
dates to 2001.1.1: 8112
day of week 7
day of year 78
days in month 31
days in year 365
secs to: 0
"""
DateTimeEdit 例子

55-输入和显示-日期时间类及控件-日期时间控件QDateTimeEdit_第1张图片

# -*- coding: UTF-8 -*-
# File date: Hi_2023/2/28 23:03
# File_name: 04-DateTimeEdit 例子.py


import sys
from PySide6.QtGui import *
from PySide6.QtWidgets import *
from PySide6.QtCore import QDate,QDateTime,QTime


class DateTimeEditDemo(QWidget):
    def __init__(self):
        super(DateTimeEditDemo,self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('QDateTimeEdit例子')
        self.resize(300,90)
        vlayout = QVBoxLayout()
        self.label = QLabel('显示日期选择信息')
        vlayout.addWidget(self.label)

        # QDateTimeEdit示例
        dateTimeLabel = QLabel('QDateTimeEdit示例:')
        dateTimeEdit = QDateTimeEdit(QDateTime.currentDateTime(),self)
        dateTimeEdit01 = QDateTimeEdit(QDate.currentDate(),self)
        dateTimeEdit01.setDate(QDate(2030,12,31))
        dateTimeEdit02 = QDateTimeEdit(QTime.currentTime(),self)
        vlayout.addWidget(dateTimeLabel)
        vlayout.addWidget(dateTimeEdit)
        vlayout.addWidget(dateTimeEdit01)
        vlayout.addWidget(dateTimeEdit02)

        # QDateEdit 示例
        dateEdit = QDateEdit(QDate.currentDate())
        dateEdit.setDateRange(QDate(2015,1,1),QDate(2030,12,31))
        dateLabel = QLabel('QDateEdit示例:')
        vlayout.addWidget(dateLabel)
        vlayout.addWidget(dateEdit)

        # QTimeEdit 示例
        timeEdit = QTimeEdit(QTime.currentTime())
        timeEdit.setTimeRange(QTime(9,0,0,0),QTime(16,30,0,0))
        timeLabel = QLabel('QTimeEdit示例:')
        vlayout.addWidget(timeLabel)
        vlayout.addWidget(timeEdit)

        # 设置日期和时间格式
        meetingEdit = QDateTimeEdit(QDateTime.currentDateTime())
        formatLabel = QLabel("选择日期和时间格式:")
        formatComboBox = QComboBox()
        formatComboBox.addItems(
           ["yyyy-MM-dd hh:mm:ss(zzz'ms')","hh:mm:ss MM/dd/yyyy","hh:mm:ss dd/MM/yyyy","北京时间: hh:mm:ss",
"hh:mm ap"])
        formatComboBox.textActivated.connect(
            lambda: self.setFormatString(formatComboBox.currentText(),meetingEdit))
        vlayout.addWidget(formatLabel)
        vlayout.addWidget(meetingEdit)
        vlayout.addWidget(formatComboBox)

        # 弹出日历小部件
        dateTimeEdit_cal = QDateTimeEdit(QDateTime.currentDateTime(),self)
        dateTimeEdit_cal.setCalendarPopup(True)
        vlayout.addWidget(QLabel('弹出日历小部件'))
        vlayout.addWidget(dateTimeEdit_cal)

        # 信号与槽
        dateTimeEdit.dateTimeChanged.connect(lambda: self.showDate(dateTimeEdit))
        dateTimeEdit01.dateTimeChanged.connect(lambda: self.showDate(dateTimeEdit01))
        dateTimeEdit02.dateTimeChanged.connect(lambda: self.showDate(dateTimeEdit02))
        dateEdit.dateTimeChanged.connect(lambda: self.showDate(dateEdit))
        timeEdit.dateTimeChanged.connect(lambda: self.showDate(timeEdit))
        meetingEdit.dateTimeChanged.connect(lambda: self.showDate(meetingEdit))
        dateTimeEdit_cal.dateTimeChanged.connect(lambda: self.showDate(dateTimeEdit_cal))

        self.setLayout(vlayout)

    def showDate(self,dateEdit):
        # 当前日期时间
        dateTime = dateEdit.dateTime().toString()
        date = dateEdit.date().toString('yyyy-MM-dd')
        time = dateEdit.time().toString()
        # 最大最小日期时间
        maxDateTime = dateEdit.maximumDateTime().toString('yyyy-MM-dd hh:mm:ss')
        minDateTime = dateEdit.minimumDateTime().toString(Qt.ISODate)

        # 最大最小日期
        maxDate = dateEdit.maximumDate().toString(Qt.ISODate)
        minDate = dateEdit.minimumDate().toString()

        # 最大最小时间
        maxTime = dateEdit.maximumTime().toString()
        minTime = dateEdit.minimumTime().toString()

        _str ='当前日期时间:{}\n当前日期:{}\n当前时间:{}\n最大日期时间:{}\n最小日期时间:{}\n最大日期:{}\n最小日期:{}\n最大时间:{}\n最小时间:{}\n'.format(
            dateTime,date,time,maxDateTime,minDateTime,maxDate,minDate,maxTime,minTime)
        self.label.setText(_str)

    def setFormatString(self,formatString,meetingEdit):
        meetingEdit.setDisplayFormat(formatString)

        if meetingEdit.displayedSections()& QDateTimeEdit.DateSections_Mask:
            meetingEdit.setDateRange(QDate(2004,11,1),QDate(2005,11,30))
        else:
            meetingEdit.setTimeRange(QTime(0,7,20,0),QTime(21,0,0,0))


if __name__ =='__main__':
    app = QApplication(sys.argv)
    demo = DateTimeEditDemo()
    demo.show()
    sys.exit(app.exec())

你可能感兴趣的:(#,pyside6,Python,GUI,ui,java,开发语言,python,qt)