日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QEventLoop的简单使用(二)

發(fā)布時間:2023/12/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QEventLoop的简单使用(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近項目有個要求,就是發(fā)送文件到服務(wù)器上面,然后要在程序里面等待服務(wù)器返回的數(shù)據(jù),根據(jù)返回的信息決定繼續(xù)發(fā)還是斷開。本來想用while在那里等待,可是發(fā)現(xiàn)不行,界面卡住了。百度下,發(fā)現(xiàn)可以用QEventLoop來實現(xiàn)這個功能。

我簡單說下QEventLoop的使用,更加具體詳細(xì)的使用,大家可以參考官方文檔或者其他文獻。

QEventLoop類為我們提供了一種進入和退出一個事件循環(huán)的方法。在任何時候,你都可以創(chuàng)建一個QEventLoop實例,然后調(diào)用exec()來啟動一個事件循環(huán),在這個循環(huán)期間,可以調(diào)用exit()來強制使exct()返回。

事件循環(huán)是一個無限“循環(huán)”,當(dāng)調(diào)用事件的exec()的時候,程序就會在exec()里面無限循環(huán),讓在exec()后面的程序得不到運行的機會,除非程序從exec()里面跳出來。 ?

來啦,劃重點了。子層事件循環(huán)具有父層事件循環(huán)的所有功能,所以當(dāng)在主線程中啟動各種exec()(比如QEventLoop::exec())時,雖然會打斷main函數(shù)中的QApplication::exec(),但是Gui界面還是可以正常響應(yīng),不會出現(xiàn)卡住的現(xiàn)象。這與用while來循環(huán)是不一樣的。

下面介紹下使用的方法,其實使用很簡單

(1)實例化
?

QEventLoop loop;

(2)啟動事件循環(huán)

//以上省略了部分代碼,這是使用HTTP中的post來發(fā)送文件到服務(wù)器 QNetworkReply *postReply = m_pNetManager->post(request, qbt); //post方式到本地服務(wù)器 connect(postReply, SIGNAL(finished()), this, SLOT(postFileReplyFinished())); //成功后會有返回響應(yīng) loop->exec(); //設(shè)置等待,若文件成功發(fā)送,則退出等待

(3)在其他的響應(yīng)函數(shù)中退出循環(huán)

void Widget::postFileReplyFinished() {QNetworkReply* reply = (QNetworkReply*)sender();QByteArray replyData = reply->readAll();//轉(zhuǎn)為JSon格式,便于提取字段數(shù)據(jù)QJsonDocument jsonDoc= QJsonDocument::fromJson(replyData);if(!jsonDoc.isNull()){QJsonObject jsonObj = jsonDoc.object(); //轉(zhuǎn)換格式if(jsonObj.contains("status")){loop->exit(); //loop退出等待}} }

我實現(xiàn)的功能是,發(fā)送文件后,就進入事件循環(huán),當(dāng)接收到返回的json數(shù)據(jù)后,判斷數(shù)據(jù)是否正確,正確的話就退出事件循環(huán)。

其實還有一種方法來實現(xiàn)事件循環(huán)的退出。就是使用QT中的信號與槽的機制,在初始化的時候,將?reply的響應(yīng)與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就退出事件的循環(huán),如果想要判斷一下還是用前面的方法比較好。

參考文獻:

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
?

總結(jié)

以上是生活随笔為你收集整理的QEventLoop的简单使用(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。