QT-执行QTimer :: timout()信号导致QEVENT

Qt - does a QTimer::timeout() signal result in a QEvent?

本文关键字:信号 QEVENT 执行 QTimer timout QT-      更新时间:2023-10-16

qt doc:

如果没有事件循环运行,则不会将事件传递到对象。 例如,如果您在线程中创建QTimer对象,但请勿调用 exec(),QTimer永远不会发出其超时()信号。打电话 Deletelater()也无法正常工作。(这些限制适用于主要 线程也。)

这是否意味着信号void QTimer::timeout()也会发行QEvent
如果是这样,QT DOC在哪里说明?

QT DOC在哪里说明?

无处不在,因为这对QTimer的用户无关紧要。计时器事件是实现细节。它已交付给计时器对象本身,因此您确实必须竭尽全力拦截它。这是QTimer的工作方式:

class QTimer : public QObject {
  Q_TIMER
  QBasicTimer m_timer;
protected:
  void timerEvent(QTimerEvent * ev) override {
    if (ev->timerId() == m_timer.timerId())
      emit timeout();
  }
  /*...*/
};

如果考虑到它,则无法在不运行发出信号的代码的情况下发出任何信号,而安全运行此类代码的唯一方法是将事物异步排放的代码是代码,以供缩小的运行式块,以使其陷入困境。在每个机会中控制事件循环。平台通知了事件循环,该平台已计时器定时发布,然后发出信号。如果QT发出的信号(例如Unix信号等侵入性异步回调)之类的信号(例如,在信号处理程序中您可以做的事情很少),那么您会遇到麻烦。/p>