1 QTimer必须在有事件循环的线程中运行。如果没有事件循环。那么不会得到timeout的信号。
因为QTimer底层实质上就是基于事件机制的
2 在UI线程里面的QTimer timeout连接的信号中执行Sleep或者while等操作会阻塞UI,这个是肯定的。如果使用QDialog带有exec的操作呢?
带有exec的操作是可以继续QT UI的。因为exec实际上就是实现eventloop。所以UI不会被阻塞。但是timeout不会在exec返回前再次被触发
如下假设定时器每秒执行一次
connect(timout,TimeoutFunc);
void TimeoutFunc()
{
print ("hello")
QDialog.exec()
}
当QDialog.exec执行的时候。如果不关闭Dialog。print hello不会被再次运行。主要是timeout执行slot的时候需要执行完毕,再重置一下timer的状态。slot没有返回。timer状态没有重置。即时有exec的事件循环也不会再运行。如果在TimeoutFunc里面使用emit发射一个信号。在另一个slotA里面QDialog.exec().并且这个slotA是queueconnection连接的(实质是排除DIrectConnection)。那么就会每隔一秒弹出一个Dlg.