Russian Qt Forum

Qt => Вопросы новичков => Тема начата: GamBitiK от Май 05, 2014, 22:20



Название: Как закрыть соединенение?
Отправлено: GamBitiK от Май 05, 2014, 22:20
void test::GetUrl()
{
   
connect (manager, SIGNAL(finished(QNetworkReply*)),this,
         SLOT(replyFinished(QNetworkReply*)));

manager->get(QNetworkRequest(QUrl(yandex.ru)));

   

}


}











void test::replyFinished(QNetworkReply *Reply)
{

QByteArray txt = Reply->readAll();
if (i=1)
{ оборвать это соединение и не продолжать с ним работать
}
}


Название: Re: Как закрыть соединенение?
Отправлено: carrygun от Май 06, 2014, 04:25
У вас и так соединение ничего уже не делает, после испускания сигнала finished.

P.S. и не забывайте в таких слотах удалять ответ, иначе будет утечка памяти
Код
C++ (Qt)
void finished(QNetworkReply *r) {
   QByteArray ba = r->readAll();
   r->deleteLater();
   ...
 


Название: Re: Как закрыть соединенение?
Отправлено: carrygun от Май 06, 2014, 04:45
Я так понимаю, это связано с этой (http://www.prog.org.ru/index.php?topic=26976) темой.
QNetworkAccessManager при вызове метода get() возвращает вам указатель на ответ QNetworkReply. Этот ответ является наследником класса QIODevice. Вам надо зацепиться на сигнал readyRead() этого ответа и читать данные из потока. Ну и в конце, если необходимо, то вызвать у ответа метод abort().

Псевдокод:
Код
C++ (Qt)
...
QNetworkReply *r = manager->get(...);
connect(r, SIGNAL(readyRead()), SLOT(mySlot()));
...
 
void MyClass::mySlot()
{
   QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
   if (!reply) return;
 
   QByteArray ba = reply->readAll();
   ...
   if (...) {
       ...
       reply->abort();
       reply->deleteLater();
   }
}