搜索
您的当前位置:首页正文

QEventLoop的简单使用以及QT中的事件循环

来源:易榕旅网

        一般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

      当接收到返回数据的时候,退出事件循环。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top