QEventLoop的简单使用(二)
最近項目有個要求,就是發送文件到服務器上面,然后要在程序里面等待服務器返回的數據,根據返回的信息決定繼續發還是斷開。本來想用while在那里等待,可是發現不行,界面卡住了。百度下,發現可以用QEventLoop來實現這個功能。
我簡單說下QEventLoop的使用,更加具體詳細的使用,大家可以參考官方文檔或者其他文獻。
QEventLoop類為我們提供了一種進入和退出一個事件循環的方法。在任何時候,你都可以創建一個QEventLoop實例,然后調用exec()來啟動一個事件循環,在這個循環期間,可以調用exit()來強制使exct()返回。
事件循環是一個無限“循環”,當調用事件的exec()的時候,程序就會在exec()里面無限循環,讓在exec()后面的程序得不到運行的機會,除非程序從exec()里面跳出來。 ?
來啦,劃重點了。子層事件循環具有父層事件循環的所有功能,所以當在主線程中啟動各種exec()(比如QEventLoop::exec())時,雖然會打斷main函數中的QApplication::exec(),但是Gui界面還是可以正常響應,不會出現卡住的現象。這與用while來循環是不一樣的。
下面介紹下使用的方法,其實使用很簡單
(1)實例化
 ?
(2)啟動事件循環
//以上省略了部分代碼,這是使用HTTP中的post來發送文件到服務器 QNetworkReply *postReply = m_pNetManager->post(request, qbt); //post方式到本地服務器 connect(postReply, SIGNAL(finished()), this, SLOT(postFileReplyFinished())); //成功后會有返回響應 loop->exec(); //設置等待,若文件成功發送,則退出等待(3)在其他的響應函數中退出循環
void Widget::postFileReplyFinished() {QNetworkReply* reply = (QNetworkReply*)sender();QByteArray replyData = reply->readAll();//轉為JSon格式,便于提取字段數據QJsonDocument jsonDoc= QJsonDocument::fromJson(replyData);if(!jsonDoc.isNull()){QJsonObject jsonObj = jsonDoc.object(); //轉換格式if(jsonObj.contains("status")){loop->exit(); //loop退出等待}} }我實現的功能是,發送文件后,就進入事件循環,當接收到返回的json數據后,判斷數據是否正確,正確的話就退出事件循環。
其實還有一種方法來實現事件循環的退出。就是使用QT中的信號與槽的機制,在初始化的時候,將?reply的響應與loop的quit連接起來。
QEventLoop loop; qManager = new QNetworkAccessManager(this); QNetworkRequest request; request.setUrl(QUrl("http://localhost/public/index/file/upload")); QNetworkReply *reply = qManager->get(request); connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec();?
這樣的話就更簡潔了。可是有個問題就是,一收到reply就退出事件的循環,如果想要判斷一下還是用前面的方法比較好。
參考文獻:
http://doc.qt.io/archives/qt-4.8/qeventloop.html
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29650836&id=4471683
http://blog.chinaunix.net/uid-27685749-id-3847998.html
 ?
總結
以上是生活随笔為你收集整理的QEventLoop的简单使用(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 笔记本如何禁用自带键盘(怎样在外接键盘时
- 下一篇: 黑暗之魂1二周目区别
