一、时间类
1、QTime
QTime 是 Qt 框架中专门用于处理时间(时、分、秒、毫秒) 的类,它只关注 "时间点"(比如 14:30:25.500),不包含日期、时区或夏令时相关信息,是 Qt 中处理纯时间的基础工具。
-
核心功能:
-
创建时间对象:可以手动指定时、分、秒、毫秒创建,也可以获取系统当前时间:
time = QTime(12, 30, 0) now = QTime.currentTime() print(time.toString("hh:mm:ss")) print(now.toString("hh:mm:ss.zzz"))
-
-
时间的读取与修改:可以获取时间的小时、分钟、秒、毫秒,也能调整时间(比如加 / 减秒、毫秒):
time = QTime(14, 30, 25) hour = time.hour() # 获取小时:14 mint = time.minute() # 获取分钟:30 print(f"hour: {hour}, mint: {mint}") # 时间调整:加30秒钟,返回新的QTime对象(原对象不变) newTime = time.addSecs(30) print(newTime.toString("hh:mm:ss")) # 14:30:55 # 时间调整:加30000毫秒,返回新的QTime对象 newTime = time.addMSecs(30000) print(newTime.toString("hh:mm:ss")) -
时间比较:支持时间大小比较:
time1 = QTime(14, 30, 25) time2 = QTime(14, 30, 28) print(time1 < time2) # True -
关键特点
- 轻量级:仅聚焦时间维度,不关联日期,比
QDateTime(日期 + 时间)更简洁; - 不可变:调整时间的方法(如
addHours())会返回新的QTime对象,原对象不会被修改; - 精度:支持毫秒级(范围 0-999),满足大部分日常时间处理需求。
- 轻量级:仅聚焦时间维度,不关联日期,比
-
总结
QTime是 Qt 中处理纯时间(时、分、秒、毫秒) 的类,无日期 / 时区信息;- 核心用途:创建时间、获取 / 调整时间、时间比较、格式化为字符串;
- 特点:轻量级、不可变、支持毫秒级精度。
2、QDateTime
QDateTime是Qt中用于处理日期 + 时间 的核心类,它可以看作是 QDate(仅处理日期,如 2026-02-10)和 QTime(仅处理时间,如 15:30:20)的组合体,专门用来表示一个 "具体的时间点",并提供了丰富的QDateTime操作方法。
-
核心功能
- 存储与表示:能存储包含年、月、日、时、分、秒、毫秒的完整时间点,还支持时区(UTC / 本地时间)。
- 时间操作:计算两个时间点的差值(如相差多少天 / 秒)、时间加减(如加 1 小时、减 3 天)、时间比较(早于 / 晚于 / 等于)。
- 格式转换 :支持将时间点转换成指定格式的字符串(如 "2026-02-10 15:30:20"),也能从字符串解析回
QDateTime对象。 - 时区处理:轻松切换本地时间和 UTC 时间(世界协调时间)。
-
简单示例(核心用法)
from PySide6.QtCore import QTime, QDateTime
time = QDateTime(2025, 12, 1, 12, 30, 0, 120)
print(time.toString("yyyy-MM-dd hh:mm:ss.zzz"))
now = QDateTime.currentDateTime()
print(now.time().toString("hh:mm:ss.zzz"))
print(now.date().toString("yyyy-MM-dd"))
new_day = now.addDays(1)
print(new_day.toString("yyyy-MM-dd hh:mm:ss.zzz")) -
常用场景
- 记录日志的时间戳;
- 计算任务执行耗时;
- 界面显示格式化的日期时间;
- 处理跨时区的时间数据。
-
总结
QDateTime是 Qt 中处理 "日期 + 时间" 的核心类,整合了QDate和QTime的能力;- 核心能力包括:获取当前时间、格式转换、时间加减 / 差值计算、时区切换;
- 主要用于程序中时间相关的存储、计算和展示场景。
二、定时器
1、QBasicTimer
QBasicTimer是QtCore 中的轻量级定时器类 ,相比更复杂的 QTimer,它更简洁、开销更小,专门用于在单个对象内处理定时事件,适合简单的定时需求。QTimer的知识见:https://blog.csdn.net/xulibo5828/article/details/156133579
-
QBasicTimer 的核心特点:
- 轻量级:无额外的信号槽开销,通过重写
timerEvent()方法处理定时事件; - 使用方式:创建实例后,需调用
timer.start(interval, receiver)启动(interval是定时间隔,单位毫秒;receiver是接收定时事件的对象);
- 轻量级:无额外的信号槽开销,通过重写
-
示例(完整使用场景):
import sys
from PySide6.QtCore import QBasicTimer, QObject
from PySide6.QtWidgets import QApplicationclass MyObject(QObject):
def init(self):
super().init()
self.timer1 = QBasicTimer() # 创建定时器对象
self.timer1.start(1000, self) # 启动定时器:每隔1000毫秒(1秒)触发一次,事件由当前对象接收
self.timer2 = QBasicTimer()
self.timer2.start(800, self) # 启动定时器:每隔800毫秒(0.8秒)触发一次,事件由当前对象接收# 重写定时事件处理方法,定时器触发时自动调用 def timerEvent(self, event): if event.timerId() == self.timer1.timerId(): print("定时器 1 触发了!") elif event.timerId() == self.timer2.timerId(): print("定时器 2 触发了!") else: # 处理其他定时器事件(如果有) super().timerEvent(event) # print("定时器触发了!")测试
app = QApplication(sys.argv)
obj = MyObject()
app.exec() -
总结:
QBasicTimer是 PySide6 中轻量级的定时器类 ,适合简单定时场景,开销比QTimer更小;- 仅创建
QBasicTimer实例不会启动定时器,需调用start()方法并指定间隔和接收对象; - 定时逻辑需通过重写
timerEvent()方法实现,可通过timerId()区分多个定时器。
2、QElapsedTimer
QElapsedTimer是Qt提供的一个高精度计时器类,主要用于测量两个时间点之间的时间间隔 ,比如统计一段代码的执行耗时、计算操作的响应时间等,比传统的 QTime 更精准、效率更高。
-
核心特性
- 高精度 :底层会优先使用系统的高精度时钟(如 Linux 的
CLOCK_MONOTONIC、Windows 的QueryPerformanceCounter),避免系统时间调整(如手动改时间、NTP 同步)对计时结果的影响。 - 无溢出风险:它不直接存储绝对时间,而是记录时间差,不用担心计时过长导致的数值溢出。
- 轻量级:使用简单,核心只有几个关键方法,学习成本低。
- 高精度 :底层会优先使用系统的高精度时钟(如 Linux 的
-
常用方法(极简示例)
from PySide6.QtCore import QElapsedTimer
timer = QElapsedTimer()
timer.start()模拟一段耗时操作(比如业务逻辑、循环计算)
for i in range(10000000):
i += 1elapsedMs = timer.elapsed()# 单位:毫秒(ms)
elapsedUs = timer.nsecsElapsed() / 1000 # 转换为微秒(μs)
elapsedNs = timer.nsecsElapsed() # 单位:纳秒(ns)print(f"耗时(毫秒):{elapsedMs}")
print(f"耗时(微秒):{elapsedUs}")
print(f"耗时(纳秒):{elapsedNs}") -
关键方法说明
| 方法 | 作用 |
|---|---|
start() |
启动 / 重置计时器,记录当前时间为起始点 |
elapsed() |
返回从启动到当前的毫秒数(最常用) |
nsecsElapsed() |
返回从启动到当前的纳秒数(高精度) |
restart() |
重置计时器并返回上次启动到现在的毫秒数 |
-
适用场景
- 性能测试:统计函数 / 代码块的执行耗时;
- 实时监控:比如检测某个操作是否超时;
- 帧率计算:比如游戏 / 动画中计算每秒帧数(FPS)。
-
总结
QElapsedTimer是 Qt 用于高精度计时的工具,核心是测量时间间隔,而非获取当前系统时间;- 它不受系统时间修改的影响,比
QTime更可靠,优先使用; - 核心用法:
start()启动 → 执行操作 →elapsed()/nsecsElapsed()获取耗时。
3、QTimeLine
QTimeLine是Qt中专门用于创建时间驱动的线性动画的类,简单来说,它的核心作用是在指定时间段内,生成一系列从 0.0 到 1.0(或反向)的数值,你可以基于这些数值来控制 UI 元素的变化(比如移动、缩放、透明度变化等),从而实现平滑的动画效果。
- 核心特性
- 时间范围:可以设定动画的总时长(比如 1000 毫秒,即 1 秒)。
- 数值插值 :在动画运行过程中,它会按时间均匀生成 0.0(开始)到 1.0(结束)的浮点数值(也可以通过设置
setDirection()反向生成 1.0 到 0.0)。 - 信号驱动 :核心信号是
valueChanged(qreal value),每生成一个新数值就会触发这个信号,只需连接这个信号到自定义槽函数,就能用value控制动画和过程。 - 状态控制 :支持启动(
start())、暂停(pause())、停止(stop())等基础操作。
- 极简使用示例
下面是一个用 QTimeLine 实现按钮在3秒内从左向右移动的示例,直观展示核心用法:
import sys
from PySide6.QtWidgets import QApplication, QPushButton
from PySide6.QtCore import QTimeLine, QEasingCurve
app = QApplication(sys.argv)
btn = QPushButton ("动画移动我")
btn.resize(100, 50)
btn.show()
# 1. 创建 QTimeLine 对象,设置总时长 3000 毫秒(3 秒)
timeLine = QTimeLine(3000, btn)
# 2. 连接核心信号:数值变化时更新按钮位置
timeLine.valueChanged.connect(lambda value: btn.move(value * 400, btn.y()))
# 3. 设置动画
timeLine.setLoopCount(2) # 设置循环次数
timeLine.setEasingCurve(QEasingCurve.InOutQuad) # 设置运动函数
# 3. 启动动画
timeLine.start()
app.exec()
- 适用场景
- 简单的线性动画:比如控件的移动、缩放、透明度渐变、进度条填充等。
- 无需复杂曲线的动画:
QTimeLine主要是线性插值,若需要缓入、缓出等非线性效果,可结合setEasingCurve()实现。 - 注意:Qt 5 之后推荐用
QPropertyAnimation(更强大的属性动画),但QTimeLine仍适用于简单场景,且是理解 Qt 动画原理的基础。
- 总结
QTimeLine是 Qt 中用于生成时间驱动的线性数值序列的类,核心输出 0.0~1.0 的浮点值。- 核心通过
valueChanged信号传递数值,开发者基于该数值控制动画效果。 - 适用于简单线性动画,是 Qt 动画体系的基础,Qt 5+ 可优先考虑
QPropertyAnimation。
4、QDeadlineTimer
QDeadlineTimer 是 Qt 提供的一个高精度、易用的超时 / 截止时间管理类,主要用于替代传统的 QElapsedTimer + QTime 组合,专门解决 "设置一个截止时间,判断当前是否超时" 的场景。
-
核心定位
- 本质:它不是单纯的 "计时器"(不是用来统计已流逝时间),而是 **"截止时间管理器"** ------ 你设定一个未来的截止时刻(比如 "1000 毫秒后超时"),它能精准判断当前时间是否已超过这个截止点。
- 优势:相比手动计算超时(比如记录开始时间 + 判断流逝时间),它内置了对系统时间变化的处理(比如系统时钟被手动调整),精度更高(支持纳秒级),且 API 更简洁。
-
核心用法(极简示例)
import sys
from PySide6.QtCore import QDeadlineTimer, QThread
from PySide6.QtWidgets import QApplicationapp = QApplication(sys.argv)
1. 创建截止计时器:设置1000毫秒后超时
deadline = QDeadlineTimer (1000)
模拟耗时操作(休眠500毫秒)
QThread.msleep(500)
2. 判断是否超时:remainingTime() 返回剩余时间(毫秒),<=0 表示超时
print(f"剩余时间:", deadline.remainingTime(), "ms")
print(f"是否超时:", deadline.hasExpired())继续休眠600毫秒,总耗时1100ms
QThread.msleep(600)
print(f"剩余时间:", deadline.remainingTime(), "ms")
print(f"是否超时:", deadline.hasExpired())3. 重置截止时间(重新设置为500毫秒后超时)
deadline.setRemainingTime(500)
print(f"剩余时间:", deadline.remainingTime(), "ms")
print(f"是否超时:", deadline.hasExpired())app.exec()
-
关键特性
- 时间单位灵活 :支持毫秒(ms)、微秒(us)、纳秒(ns),也支持 Qt 的
qint64类型和 C++11 的std::chrono时间类型。 - 处理系统时间变化:如果在计时过程中系统时间被手动修改(比如往前调 1 小时),QDeadlineTimer 仍能正确判断是否到达原设定的截止时间(而不是单纯依赖 "流逝时间")。
- 常用场景:网络请求超时判断、异步操作超时控制、循环等待的超时限制等。
- 时间单位灵活 :支持毫秒(ms)、微秒(us)、纳秒(ns),也支持 Qt 的
-
总结
- QDeadlineTimer 是 Qt 用于管理截止时间 / 超时判断的类,核心是 "判断是否到了设定的截止点",而非 "统计已过时间"。
- 相比手动实现超时逻辑,它精度更高(纳秒级)、能处理系统时间变化,API 更简洁。
- 典型用法:设置超时时间 → 执行操作 → 通过
hasExpired()/remainingTime()判断是否超时。