Re: [問題] qt語法疑問

作者: uranusjr (←這人是超級笨蛋)   2016-10-25 18:20:45
※ 引述《MOONY135 (談無慾)》之銘言:
: https://gist.github.com/Aix-Shiao/c9ce0d79d373887e914b78700f564f0b
: 我有延伸的問題,目前我需要跟webApi溝通
: 我寫了一個webApiPost的方法
: 在
: manager = new QNetworkAccessManager(this);
: QNetworkReply* reply = manager->post(QNetworkRequest(qurl), multiPart);
: 這行的reply我理解為 manager再丟入post資訊之後,網頁端所回傳給我的訊息
: 那我想問
: 1. 如果當下丟這行的時候是沒有網路的狀態? 我要怎樣確認網路是否通暢?
: 因為網路不通的時候
: QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), this,
: SLOT(finishedSlot(QNetworkReply*)));
: manager所發出finished的SIGNAL應該是永遠不會有回應的吧?
: 2.
: QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), this,
: SLOT(finishedSlot(QNetworkReply*)));
: 為什麼是finished(QNetworkReply*) 而不是finished(reply)呢?
說是延伸, 其實這和前面一個問題沒什麼關聯, 所以引文就刪了
假設你用 Qt 5, 根據文件
http://doc.qt.io/qt-5/qnetworkaccessmanager.html
finished() 在 request 失敗的時候也是會被呼叫的
其實這你自己把網路通通拔掉試試看就知道了吧?
根據 QNetworkReply 的文件
http://doc.qt.io/qt-5/qnetworkreply.html
error(QNetworkReply::NetworkError) 底下
This signal is emitted when the reply detects an error in processing.
The finished() signal will probably follow, indicating that the
connection is over.
然後 finished() 有寫
This signal is emitted in tandem with QNetworkAccessManager::finished()
where that signal's reply parameter is this object.
這代表當你送出一個 request 獲得 reply 物件, 但 request 失敗時
會觸發 QNetworkReply 的 error(QNetworkReply::NetworkError)
接著是 QNetworkReply::finished()
最後是 QNetworkAccessManager::finished(QNetworkReply *)
而最後一個 finished signal 傳入的 QNetworkReply * 就是你獲得的那個 reply
因為 SLOT() macro 接受的是 slot signature
你在裡面填寫的會是你的 slot function 的 definition, 而非你想傳什麼進去
被傳入的東西是由 Qt 的 signal-slot system 為你決定
你現在比較需要的應該是
1. 思考一下語法的道理, 而不是一股腦寫
2. 閱讀文件, 做幾個 proof of concept 驗證 framework 行為, 而不是自己瞎猜
作者: MOONY135 (談無慾)   2016-10-25 19:42:00
會被呼叫但傳回來會是空的東西 還是很感謝你 目前也覺得越寫越覺得腳步空空的
作者: xvid (DivX)   2016-10-25 22:35:00
推最後一句
作者: MOONY135 (談無慾)   2016-10-26 09:01:00
有個疑問 我把自己的網路線拔掉時 finished()會沒有回應...https://goo.gl/PZY5O5 找到這篇所以我應該尋找其他的類別?拔掉網路線之後 QNetworkAccessManager的finished不會有SIGNAL傳出...
作者: uranusjr (←這人是超級笨蛋)   2016-10-26 15:55:00
可以先檢查 manager->networkAccessible()發現你有另外回了, 可以把這兩個檢查合併使用
作者: MOONY135 (談無慾)   2016-10-26 17:07:00
感謝 我目前是用我回的那個先去檢查

Links booklink

Contact Us: admin [ a t ] ucptt.com