如果没有运行事件循环,则不会将事件传递给对象。 例如,如果在线程中创建QTimer对象但从不调用 exec(),QTimer永远不会发出timeout()信号。调用 deleteLater()也不起作用。 (这些限制适用于主要 线程也是如此。)
这是否意味着信号$('#myTextBox').focus();
也会发出QEvent
?
如果是这样,Qt doc在哪里陈述这个?
答案 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信号这样的侵入式异步回调中发出诸如定时器超时之类的信号,那你就陷入了深深的麻烦:只要读一下在信号处理程序中你可以做多少事情 - 它与一个没有什么不同中断处理程序。