Qt - 在QEvent中产生QTimer :: timeout()信号?

时间:2017-02-20 22:28:56

标签: c++ multithreading qt

Qt doc:

  

如果没有运行事件循环,则不会将事件传递给对象。   例如,如果在线程中创建QTimer对象但从不调用   exec(),QTimer永远不会发出timeout()信号。调用   deleteLater()也不起作用。 (这些限制适用于主要   线程也是如此。)

这是否意味着信号$('#myTextBox').focus(); 也会发出QEvent
如果是这样,Qt doc在哪里陈述这个?

1 个答案:

答案 0 :(得分:0)

  

Qt doc在哪里陈述这个?

无处,因为它对QTimer的用户不重要。 timer事件是一个实现细节。它被传递给计时器对象本身,所以你真的不得不试图拦截它。以下是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信号这样的侵入式异步回调中发出诸如定时器超时之类的信号,那你就陷入了深深的麻烦:只要读一下在信号处理程序中你可以做多少事情 - 它与一个没有什么不同中断处理程序。