Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 2468 razy

Dwie klasy będą niezbędne do pobrania pliku z internetu. Pierwszą z nich jest QNetworkAccessMenager, zaś drugą QNetworkReply. Do realizacji zadania pobierania danych z internetu konieczne będzie utworzenie klasy, której deklaracja będzie wyglądała następująco:

#ifndef DOWNLOADER_H #define DOWNLOADER_H #include <QObject> #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QNetworkReply> #include <QUrl> #include <QDateTime> #include <QFile> #include <QDebug> class Downloader : public QObject{ Q_OBJECT QString fileNameEndPath; // ścieżka wraz z nazwą pliku zapisu ściągniętych danych public: explicit Downloader(QObject *parent = 0); void doDownload(QUrl urlPath, QString fileName); // metoda realizująca pobieranie danych signals: public slots: void replyFinished (QNetworkReply *reply); // slot wywoływany przy zakończeniu pobierania pliku void downloadProgress(qint64,qint64); // slot wykorzystywany do przetwarzania informacji o pobieranych danych private: QNetworkAccessManager *manager; QNetworkRequest request; }; #endif // DOWNLOADER_H

Natomiast poszczególne metody w pliku downloader.cpp będą wyglądały tak:

#include "downloader.h" Downloader::Downloader(QObject *parent) : QObject(parent){ manager = new QNetworkAccessManager(this); // tworzenie nowego obiektu menadżera dostępu QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); // połączenie sygnału zakończenia pobierania } void Downloader::doDownload(QUrl urlPath, QString fileName){ this->fileNameEndPath = fileName; // przypisanie ścieżki do pliku request.setUrl(urlPath); // ustawienie adresu url żądania QNetworkReply *reply = manager->get(request); // wysłanie żądania QObject::connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(downloadProgress(qint64,qint64))); // podpięcie pod sygnał postępu pobierania } void Downloader::replyFinished (QNetworkReply *reply){ // wywoływany, gdy pobieranie zostanie zakończone if(reply->error()){ // jeżeli wystąpił błąd, to qDebug() << "Error:" << reply->errorString(); }else{ // jeżeli nie to qDebug() << "Naglowek strony:" << reply->header(QNetworkRequest::ContentTypeHeader).toString(); qDebug() << "Kod satusu serwera:" << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); qDebug() << "Wyjasnienie bledu (jezeli istnieja):" << reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(); QFile file(fileNameEndPath); if(file.open(QFile::WriteOnly)){ file.write(reply->readAll()); file.flush(); file.close(); } } reply->deleteLater(); // konieczne, aby zwolnić pamięć po zakończeniu żywota obiektu tego } void Downloader::downloadProgress(qint64 bytesReceived, qint64 bytesTotal){ qDebug() << "Pobrano:" << bytesReceived << "z" << bytesTotal; // ile pobrano z ilu }

W końcu użycie klasy Downloader w pliku main.cpp:

#include <QCoreApplication> #include <QTextStream> #include "downloader.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QTextStream str(stdin); qDebug() << "Podaj adres strony:"; QString myURL = str.readLine(); Downloader downloader; // tworzenie obiektu klasy Downloader downloader.doDownload(QUrl(myURL), "file.txt"); // pobieranie danych return a.exec(); }

Przykładowy wynik działania powyższego kodu:

Podaj adres strony:
http://www.obliczeniowo.com.pl
Pobrano: 8105 z -1
Pobrano: 37681 z 37681
Naglowek strony: "text/html;charset=UTF-8"
Kod satusu serwera: 200
Wyjasnienie bledu (jezeli istnieja): "OK"
Strony powiązane
strony powiązane
  1. /doc.qt.io/qt-5/qnetworkaccessmanager.html - opis klasy QNetworkAccessManager na stronie dokumentacji biblioteki Qt
  2. doc.qt.io/qt-5/qnetworkrequest.html - opis klasy QNetworkRequest na stronie dokumentacji biblioteki Qt
Layout wykonany przez autora strony, wszelkie prawa zastrzeżone. Jakiekolwiek użycie części lub całości grafik znajdujących się na tej stronie bez pisemnej zgody jej autora surowo zabronione.