pyside6的时间相关的基础知识学习笔记

一、时间类

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 中处理 "日期 + 时间" 的核心类,整合了 QDateQTime 的能力;
    • 核心能力包括:获取当前时间、格式转换、时间加减 / 差值计算、时区切换;
    • 主要用于程序中时间相关的存储、计算和展示场景。

二、定时器

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 QApplication

    class 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()

  • 总结:

  1. QBasicTimer 是 PySide6 中轻量级的定时器类 ,适合简单定时场景,开销比 QTimer 更小;
  2. 仅创建 QBasicTimer 实例不会启动定时器,需调用 start() 方法并指定间隔和接收对象;
  3. 定时逻辑需通过重写 timerEvent() 方法实现,可通过 timerId() 区分多个定时器。

2、QElapsedTimer

QElapsedTimer是Qt提供的一个高精度计时器类,主要用于测量两个时间点之间的时间间隔 ,比如统计一段代码的执行耗时、计算操作的响应时间等,比传统的 QTime 更精准、效率更高。

  • 核心特性

    • 高精度 :底层会优先使用系统的高精度时钟(如 Linux 的 CLOCK_MONOTONIC、Windows 的 QueryPerformanceCounter),避免系统时间调整(如手动改时间、NTP 同步)对计时结果的影响。
    • 无溢出风险:它不直接存储绝对时间,而是记录时间差,不用担心计时过长导致的数值溢出。
    • 轻量级:使用简单,核心只有几个关键方法,学习成本低。
  • 常用方法(极简示例)

    from PySide6.QtCore import QElapsedTimer

    timer = QElapsedTimer()
    timer.start()

    模拟一段耗时操作(比如业务逻辑、循环计算)

    for i in range(10000000):
    i += 1

    elapsedMs = 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 QApplication

    app = 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 仍能正确判断是否到达原设定的截止时间(而不是单纯依赖 "流逝时间")。
    • 常用场景:网络请求超时判断、异步操作超时控制、循环等待的超时限制等。
  • 总结

    • QDeadlineTimer 是 Qt 用于管理截止时间 / 超时判断的类,核心是 "判断是否到了设定的截止点",而非 "统计已过时间"。
    • 相比手动实现超时逻辑,它精度更高(纳秒级)、能处理系统时间变化,API 更简洁。
    • 典型用法:设置超时时间 → 执行操作 → 通过 hasExpired()/remainingTime() 判断是否超时。
相关推荐
时代的凡人5 小时前
0208晨间笔记
笔记
YJlio5 小时前
1.7 通过 Sysinternals Live 在线运行工具:不下载也能用的“云端工具箱”
c语言·网络·python·数码相机·ios·django·iphone
l1t6 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
今天只学一颗糖6 小时前
1、《深入理解计算机系统》--计算机系统介绍
linux·笔记·学习·系统架构
testpassportcn6 小时前
AWS DOP-C02 認證完整解析|AWS DevOps Engineer Professional 考試
网络·学习·改行学it
山塘小鱼儿7 小时前
本地Ollama+Agent+LangGraph+LangSmith运行
python·langchain·ollama·langgraph·langsimth
码说AI7 小时前
python快速绘制走势图对比曲线
开发语言·python
wait_luky7 小时前
python作业3
开发语言·python
Python大数据分析@9 小时前
tkinter可以做出多复杂的界面?
python·microsoft