LinuxForum.Fans
Тема

Как скачать файл из проекта на Qt

Автор: XRevan86 46 сообщений 12205 просмотров
#109351

Я начинающий быдлокодер на Qt.
Ищу компонент, который тупо скачивает файл.
Наращиваю базу функций для своих быдлопроектов smile.

#109352

не совсем понятно, что вам надо. что значит "тупо скачивает файл"? по ссылке скачивает или как?

#109353

LifeIsMusic
Ну да.
DownloadFile(QUrl, QString) smile.

#109421
Darth Revan написал:
LifeIsMusic
Ну да.
DownloadFile(QUrl, QString) smile.

Ну совсе "тупо" не получится.

QNetworkAccessManager

Устаревшие:
QHttp
QFtp

Среди примеров идущих с Qt есть "FTP Client" и "HTTP Client"

#109561

Qt написал:
int URLDownloadToFile(const QString URL, const QString FileName)
{
QFileInfo fileInfo(URL);
QNetworkAccessManager qnam;
QNetworkReply* reply;
QString connect;
if ( FileName.isEmpty() )
return 1;
QFile::remove(FileName);
QFile* File = new QFile(FileName);
if ( !File->open(QIODevice::WriteOnly) )
{
delete File;
File = 0;
return 1;
}
reply = qnam.get(QNetworkRequest(URL));
connect(reply, SIGNAL(finished()),
this, SLOT(httpFinished()));
connect(reply, SIGNAL(readyRead()),
this, SLOT(httpReadyRead()));
connect(reply, SIGNAL(downloadProgress(qint64,qint64)),
this, SLOT(updateDataReadProgress(qint64,qint64)));
}
g++ написал:
error: invalid use of ‘this’ in non-member function
Моя попытка написать простую, как пень, функцию скачивания файла провалилась.
#109566

простите, а почему не fopen() ?

#109567
Darth Revan написал:

int URLDownloadToFile(const QString URL, const QString FileName)

Естественно. this указатель на экземляр класса. Следовательно это код метода, какого то класса. Но тогда должно начинаться примерно так:


int YourClassName::URLDownloadToFile(const QString URL, const QString FileName)

А так же среди методов этого класса должны быть слоты updateDataReadProgress, httpReadyRead и httpFinished.

#109568
Darth Revan написал:
connect(reply, SIGNAL(finished()),
this, SLOT(httpFinished()));

чё-то нипрапарсил....
скобки-же вы закрыли КЕМ! после finished. ДВЕ ШТУКИ! вот компилятор и ругается.

#109569
drBatty написал:
простите, а почему не fopen() ?

Да и и это здесь не нужно. Засунуть имя файла в QFileInfo. Этот класс и ответит доступен ли он для записи. Здесь этот опен только для этого и нужен - если записать нельзя то и файл не скачивается

#109571
drBatty написал:

чё-то нипрапарсил....
скобки-же вы закрыли КЕМ! после finished. ДВЕ ШТУКИ! вот компилятор и ругается.

Со скобками на мой взгляд все ок

#109573

С QFile* File здесь какаято фигня. Мы его пытаемся открыть только для записи. Создаем объект здесь. Сслка на объект в этом методе.
Когда начинается закачка файла. То как мы можем получить ссылку на открытый файл...... Запись то в файл идет в слоте httpReadyRead

Здается код исправлен и в исходном варианте File является свойство класса.

#109577
voral написал:
Со скобками на мой взгляд все ок

ну то на ваш. а я с компилятором негодуем.

#109580
drBatty написал:
ну то на ваш. а я с компилятором негодуем.

Вы с компилятором не внимательны ;) После ваших слов я даже вставил этот кусок в проект. Здесь все Ок.
Ошибка явная и думать не надо. Приведенный выше листинг это листинг функции, а не метода класса. Соответственно нет ни какого this.

Топикасетр, я глянул Вы взяли пример HTTP Client и попытались его выкусить. Не пытайтесь сделать отдельную функцию. Просто возмите этот класс и выкиньте все что не нужно. Начиная с наследия от QDialog

#109583

Не проверял но примерно так:
HttpDownload.h

text

#ifndef HttpDownload_H
#define HttpDownload_H

#include <QNetworkAccessManager> #include <QUrl>

QT_BEGIN_NAMESPACE class QFile; class QNetworkReply; QT_END_NAMESPACE

class HttpDownload : public QObject { Q_OBJECT

public: HttpDownload(QObject *parent = 0); void downloadFile(QUrl url);

private slots: void startRequest(QUrl url); void cancelDownload(); void httpFinished(); void httpReadyRead(); void updateDataReadProgress(qint64 bytesRead, qint64 totalBytes);

private: QUrl url; QNetworkAccessManager qnam; QNetworkReply *reply; QFile *file; int httpGetId; bool httpRequestAborted; };

#endif

HttpDownload.cpp

text

#include <QtNetwork>

#include "HttpDownload.h"

HttpDownload::HttpDownload(QObject *parent) : QObject(parent) { }

void HttpDownload::startRequest(QUrl url) { reply = qnam.get(QNetworkRequest(url)); connect(reply, SIGNAL(finished()), this, SLOT(httpFinished())); connect(reply, SIGNAL(readyRead()), this, SLOT(httpReadyRead())); connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(updateDataReadProgress(qint64,qint64))); }

void HttpDownload::downloadFile(QUrl url) { QFileInfo fileInfo(url.path()); QString fileName = fileInfo.fileName(); if (QFile::exists(fileName)) { // обработка ситуации если файл уже есть }

file = new QFile(fileName); if (!file->open(QIODevice::WriteOnly)) { // если файл нельза записать delete file; file = 0; return; } httpRequestAborted = false; startRequest(url); }

void HttpDownload::cancelDownload() { httpRequestAborted = true; reply->abort(); }

void HttpDownload::httpFinished() { if (httpRequestAborted) { if (file) { file->close(); file->remove(); delete file; file = 0; } reply->deleteLater(); return; } file->flush(); file->close(); reply->deleteLater(); reply = 0; delete file; file = 0; }

void HttpDownload::httpReadyRead() { if (file) file->write(reply->readAll()); }

void HttpDownload::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes) { if (httpRequestAborted) return; // если нужно информируем о прогрессе }

создаешь объект этого класса. Вызываешь downloadFile(QUrl url). Прервать можно вызвав cancelDownload()

До кучи тестовый main.cpp

text

 #include <QApplication>
#include <QDialog>
#include "HttpDownload.h"

int main(int argc, char *argv[]) { QApplication app(argc, argv); HttpDownload httpDownload; httpDownload.downloadFile(QUrl("http://linuxforum.ru/index.php")); QDialog dlg; dlg.show(); return dlg.exec(); }

#109592
voral написал:
Вы с компилятором не внимательны wink После ваших слов я даже вставил этот кусок в проект. Здесь все Ок.
Ошибка явная и думать не надо. Приведенный выше листинг это листинг функции, а не метода класса. Соответственно нет ни какого this.

ничегонипонял.

text
      reply = qnam.get(QNetworkRequest(URL));
            connect(reply, SIGNAL(finished()),
                    this, SLOT(httpFinished()));
            connect(reply, SIGNAL(readyRead()),
                    this, SLOT(httpReadyRead()));
            connect(reply, SIGNAL(downloadProgress(qint64,qint64)),
                    this, SLOT(updateDataReadProgress(qint64,qint64)));

это вообще, на каком языке? пайтон что-ли?

#109593

это с++ :D

#109597

odin, нет.
это быдлокод. извините.

#109600

ну натравите на него ваш же скриптец из соседней темы.... :D

#109615
odin написал:
ну натравите на него ваш же скриптец из соседней темы.... :D

не для того я его писал.

#109688
drBatty написал:
odin, нет.
это быдлокод. извините.

Поясните.

Войдите или зарегистрируйтесь, чтобы ответить.