QT教程:start()和startTimer()的区别
start() - QTimer 类的成员函数
start() 是 QTimer 类的成员函数,用于启动一个基于 QTimer 对象的定时器。QTimer 是 Qt 中常用的定时器类,它会在设定的时间间隔后发出 timeout() 信号。
用法
QTimer timer;
timer.start(1000); // 每隔 1000 毫秒触发一次 timeout() 信号
- 1. 参数:start(int msec),其中 msec 是时间间隔(以毫秒为单位)。
- 2. 触发信号:当时间间隔结束时,QTimer 会发出 timeout() 信号,你可以将这个信号连接到一个槽函数来处理。
示例
QTimer timer;
QObject::connect(&timer,SIGNAL(timeout(), this, SLOT(on_m_clock_timeout());
timer.start(1000); // 每隔 1000 毫秒调用一次 onTimeout()
- 1. 连接信号与槽:通过 connect(),你可以将 SIGNAL(timeout())信号连接到一个槽函数,这样每次定时器触发时,槽函数就会被调用。
- 2. 自动处理:QTimer 自动管理信号与槽,因此非常适合需要定期执行某些任务的场景。
startTimer() - QObject 类的成员函数
startTimer() 是 QObject 类的成员函数,用于启动一个低级别的定时器。它返回一个定时器 ID,之后可以通过 killTimer() 来停止该定时器。
用法
int timerId = startTimer(1000); // 每隔 1000 毫秒触发一次定时器事件
- 1. 参数:startTimer(int msec),其中 msec 是时间间隔(以毫秒为单位)。
- 2. 返回值:startTimer() 返回一个定时器 ID,你可以用这个 ID 来管理和停止定时器。
特点
- 1.不依赖信号与槽:startTimer() 不使用信号与槽,而是通过事件处理机制触发 timerEvent(),需要在派生类中重写 timerEvent() 函数来处理定时器事件。。
- 2.低级别定时器:startTimer() 是更低级别的定时器实现,适用于对性能要求较高或不需要复杂信号与槽机制的场景。
- 3.手动停止:你可以使用 killTimer(timerId) 来停止通过 startTimer() 启动的定时器。
区别
特性 | start() (QTimer) | startTimer() (QObject) |
类 | QTimer | QObject |
触发机制 | 通过 timeout() 信号 | 调用 timerEvent() 事件处理函数 |
使用场景 | GUI 应用中,定期触发信号的场景 | 低级别定时器,适合对事件和性能有特殊需求的场景 |
停止定时器 | stop() | killTimer(timerId) |
依赖事件循环 | 是(基于信号与槽机制) | 是(通过事件机制处理) |
需要重写事件处理 | 否 | 是,需要重写 timerEvent() |
是否返回定时器 ID | 否 | 是,返回定时器 ID |
适合应用 | 适合需要信号与槽的定时器事件(如更新UI、动画) | 适合更细粒度控制和性能要求的场景(如后台处理、非GUI应用) |
总结
- 1. start() (QTimer):适用于典型的定时任务,利用信号与槽机制进行处理。它适合在 GUI 应用中使用,能够方便地每隔一段时间执行某个任务,并且可以轻松管理和停止定时器。
- 2. startTimer() (QObject):适用于需要更低级别定时器控制的场景,必须手动处理定时器事件(timerEvent()),并手动停止定时器(killTimer())。适合需要更高性能或更细粒度控制的任务。