一般QT中的很多事件循环都是由exec()来开启的,例如:
QCoreApplicaton::exec() //核心程序执行的循环
QApplication::exec() //主程序执行的循环
QDialog::exec() //对话框窗口事件的循环
QThread::exec() //线程执行事件的循环
QDrag::exec() //执行拖放事件的循环
QMenu::exec()//菜单栏事件的循环
这些都开启了事件循环,事件循环首先是一个无限“循环”,程序在exec()里面无限循环,能让跟在exec()后面的代码得不到运行机会,直至程序从exec()跳出。从exec()跳出时,事件循环即被终止。QEventLoop::quit()能够终止事件循环。
事件循环实际上类似于一个事件队列,对列入的事件依次的进行处理,当时间做完而时间循环没有结束的时候,其实际上比较类似于一个不占用CPU事件的for(;;)循环。
其本质实际上是以队列的方式来重新分配时间片。
子层事件循环具有父层事件循环的所有功能,所以当在主线程中启动各种exec()(比如QEventLoop::exec())时,虽然会打断main函数中的QApplication::exec(),但是Gui界面还是可以正常响应,不会出现卡住的现象。这与用while来循环是不一样的。
启动事件循环(这是使用HTTP中的post来发送文件到服务器
):
QNetworkReply *reply = manager->post(request, document.toJson());
QEventLoop eventLoop;
connect(manager, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));
eventLoop.exec(); //block until finish
当接收到返回数据的时候,退出事件循环。
因篇幅问题不能全部显示,请点此查看更多更全内容