Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

12 return 1;

13 QObject::connect(&spider, SIGNAL(done), &app, SLOT(quit));

14 return app.exec;

15 }

Функция main завершает программу. Если пользователь не задает адрес URL в командной строке, мы выдаем сообщение об ошибке и завершаем программу.

В обоих примерах применения протокола FTP данные, полученные функцией get, записывались в объект QFile. Это не обязательно должно быть так. Если бы мы

захотели хранить данные в памяти, мы могли бы использовать QBuffer — подкласс QIODevice, являющийся оболочкой массива QByteArray. Например:

QBuffer *buffer= new QBuffer;

buffer->open(QIODevice::WriteOnly);

ftp.get(urlInfo.name, buffer);

Мы могли бы также не задавать в функции get аргумент с устройством ввода—вывода или передать нулевой указатель. Класс QFtp тогда генерирует сигнал readyRead при поступлении каждой новой порции данных и данные могут считываться при помощи функции read или readAll.

Написание НТТР—клиента

Класс QHttp реализует клиентскую часть протокола HTTP в Qt. Он содержит различные функции для выполнения самых распространенных операций протокола HTTP, включая get и post, и обеспечивает средство выполнения произвольных запросов HTTP. Если вы прочитали предыдущий раздел о классе QFtp, вы обнаружите, что существует много общего у классов QFtp и QHttp.

Класс QHttp работает асинхронно. Когда мы вызываем такие функции, как get или post, управление сразу же возвращается к нам, а пересылка данных осуществляется после передачи управления обратно в цикл обработки событий Qt. Это обеспечивает работоспособность интерфейса пользователя во время обработки запросов HTTP.

Мы рассмотрим пример консольного приложения с именем httpget, демонстрирующего способ загрузки файла с использованием протокола HTTP. Мы не приводим здесь заголовочный файл, поскольку данный пример очень напоминает пример ftpget, который мы использовали в предыдущем разделе.

01 HttpGet::HttpGet(QObject *parent)

02 : QObject(parent)

03 {

04 …

05 connect(&http, SIGNAL(done(bool)), this, SLOT(httpDone(bool)));

06 }

В конструкторе мы подсоединяем сигнал done(bool) объекта QHttp к закрытому слоту httpDone(bool).

01 bool HttpGet::getFile(const QUrl &url)

02 {

03 if (!url.isValid) {

04 сегг << "Error: Invalid URL" << endl;

05 return false;

06 }

07 if (url.scheme != "http") {

08 cerr << "Error: URL must start with 'http:'" << endl;

09 return false;

10 }

11 if (url.path.isEmpty) {

12 cerr << "Error: URL has no path" << endl;

13 return false;

14 }

15 QString localFileName = QFileInfo(url.path).fileName;

16 if (localFileName.isEmpty)

17 localFileName = "httpget.out";

18 file.setFileName(localFileName);

19 if (!file.open(QIODevice::WriteOnly)) {

20 cerr << "Error: Cannot open "

21 << qPrintable(file.fileName) << " for writing: "

22 << qPrintable(file.errorString) << endl;

23 return false;

24 }

25 http.setHost(url.host, url.port(80));

26 http.get(url.path, &file);

27 http.close;

28 return true;

29 }

Функция getFile проверяет

ошибочные ситуации так же, как рассмотренная ранее функция FtpGet::getFile, и использует тот же подход при задании имени локального файла. При загрузке файлов с веб-сайта не требуется входить в систему, поэтому мы просто указываем хост и порт (используя стандартный для HTTP порт 80, если его нет в URL) и скачиваем данные в файл, заданный вторым аргументом функции QHttp::get.

Запросы HTTP ставятся в очередь и обрабатываются асинхронно в цикле обработки событий Qt. На завершение выполнения запросов указывает сигнал done(bool) объекта QHttp, который мы подсоединили к слоту httpDone(bool) в конструкторе.

01 void HttpGet::httpDone(bool еггог)

02 {

03 if (еггог) {

04 сегг << "Еггог: " << qPrintable(http.errorString) << endl;

05 } else {

06 сегг << "File downloaded as " << qPrintable(file.fileName) << endl;

07 }

08 file.close;

09 emit done;

10 }

После выполнения запросов HTTP мы файл закрываем, уведомляя пользователя о возникновении ошибки.

Функция main очень похожа на такую же функцию в примере ftpget:

01 int main(int argc, char *argv[])

Поделиться:
Популярные книги

Мистики, розенкрейцеры, тамплиеры в Советской России

Никитин Андрей Леонидович
Научно-образовательная:
история
религиоведение
5.00
рейтинг книги
Мистики, розенкрейцеры, тамплиеры в Советской России

Настольная книга по теологии. Библейский комментарий АСД Том 12

Церковь христиан адвентистов седьмого дня
Научно-образовательная:
религиоведение
5.00
рейтинг книги
Настольная книга по теологии. Библейский комментарий АСД Том 12

На границе империй. Том 7

INDIGO
7. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
6.75
рейтинг книги
На границе империй. Том 7

На границе империй. Том 9. Часть 3

INDIGO
16. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 3

Трапеция

Брэдли Мэрион Зиммер
Проза:
современная проза
5.00
рейтинг книги
Трапеция

Моров. Том 1 и Том 2

Кощеев Владимир
1. Моров
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Моров. Том 1 и Том 2

Убивать чтобы жить 6

Бор Жорж
6. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 6

Кодекс Охотника XXVIII

Винокуров Юрий
28. Кодекс Охотника
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Охотника XXVIII

Чужак из ниоткуда 2

Евтушенко Алексей Анатольевич
2. Чужак из ниоткуда
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужак из ниоткуда 2

Личник

Валериев Игорь
3. Ермак
Фантастика:
альтернативная история
6.33
рейтинг книги
Личник

Базис

Владимиров Денис
7. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Базис

Гримуар темного лорда V

Грехов Тимофей
5. Гримуар темного лорда
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда V

Второй кощей

Билик Дмитрий Александрович
8. Бедовый
Фантастика:
юмористическое фэнтези
городское фэнтези
мистика
5.00
рейтинг книги
Второй кощей

Цеховик. Книга 2. Движение к цели

Ромов Дмитрий
2. Цеховик
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Цеховик. Книга 2. Движение к цели