日期时间控件包括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 的大多数方法相同。
QDateTimeEdit 的主要方法介绍如下:
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选择日期
使用calendarWidget0函数可以获取现有的日历小部件。代码如下:
# 弹出日历小部件
dateTimeEdit_cal = QDateTimeEdit(QDateTime.currentDateTime(),self)
dateTimeEdit_cal.setCalendarPopup(True)
vlayout.addwidget(QLabel('弹出日历小部件))
vlayout.addWidget(dateTimeEdit_cal)
信号 | 描述 |
---|---|
dateChanged(QDate) | 当日期改变时发送 |
dateTimeChanged(QDateTime) | 当日期或时间改变时发送 |
timeChangedQTime) | 当时间改变时发送 |
editingFinished() | 当编辑完成按Enter 键或失去焦点时发送 |
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
"""
# -*- 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())