Вход/Регистрация
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.

  • Читать дальше
  • 1
  • ...
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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