
qlonglong YHHttp::get(QString url, int timeout) { QUrl u = QUrl::fromUserInput(url); if(u.path().isEmpty()){ u.setPath("/"); } QNetworkRequest request(u); setheader(&request); QNetworkReply *reply = d->manager.get(request); connect(reply, SIGNAL(finished()), this, SLOT(slotFinished())); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError(QNetworkReply::NetworkError))); if(timeout!=0){ QTimer* timer = new QTimer(reply); connect(timer,SIGNAL(timeout()),this,SLOT(slot_requestTimeout()));//超時信號 timer->start(timeout); } return (qlonglong)reply; } void YHHttp::slot_requestTimeout() { QNetworkReply *reply = static_cast<QNetworkReply*>(sender()->parent()); emit_deviceevent("Timeout(qlonglong)", (qlonglong)(reply)); reply->abort(); reply->deleteLater(); QNetworkSession(d->manager.configuration()).stop(); }
這里通過sender()獲得了觸發slot_reequestTimeout()槽函數信號的對象。
解釋如下:
當某個Object,emit一個signal的時候,這個Object就是這個sender,系統會記錄當前emit這個signal的Object。所以當你
在對應的slot中,通過sender()可以得到當前是誰觸發了你的slot。
另外這里需要獲取的是QNetworkReply對象,這個對象傳給QTimer的時候變成了timer的parent。