Я начинающий быдлокодер на Qt.
Ищу компонент, который тупо скачивает файл.
Наращиваю базу функций для своих быдлопроектов smile.
Как скачать файл из проекта на Qt
не совсем понятно, что вам надо. что значит "тупо скачивает файл"? по ссылке скачивает или как?
LifeIsMusic
Ну да.
DownloadFile(QUrl, QString) smile.
LifeIsMusic
Ну да.
DownloadFile(QUrl, QString) smile.
Ну совсе "тупо" не получится.
QNetworkAccessManager
Устаревшие:
QHttp
QFtp
Среди примеров идущих с Qt есть "FTP Client" и "HTTP Client"
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)));
}
Моя попытка написать простую, как пень, функцию скачивания файла провалилась.error: invalid use of ‘this’ in non-member function
простите, а почему не fopen() ?
int URLDownloadToFile(const QString URL, const QString FileName)
Естественно. this указатель на экземляр класса. Следовательно это код метода, какого то класса. Но тогда должно начинаться примерно так:
int YourClassName::URLDownloadToFile(const QString URL, const QString FileName)
А так же среди методов этого класса должны быть слоты updateDataReadProgress, httpReadyRead и httpFinished.
connect(reply, SIGNAL(finished()),
this, SLOT(httpFinished()));
чё-то нипрапарсил....
скобки-же вы закрыли КЕМ! после finished. ДВЕ ШТУКИ! вот компилятор и ругается.
простите, а почему не fopen() ?
Да и и это здесь не нужно. Засунуть имя файла в QFileInfo. Этот класс и ответит доступен ли он для записи. Здесь этот опен только для этого и нужен - если записать нельзя то и файл не скачивается
чё-то нипрапарсил....
скобки-же вы закрыли КЕМ! после finished. ДВЕ ШТУКИ! вот компилятор и ругается.
Со скобками на мой взгляд все ок
С QFile* File здесь какаято фигня. Мы его пытаемся открыть только для записи. Создаем объект здесь. Сслка на объект в этом методе.
Когда начинается закачка файла. То как мы можем получить ссылку на открытый файл...... Запись то в файл идет в слоте httpReadyRead
Здается код исправлен и в исходном варианте File является свойство класса.
Со скобками на мой взгляд все ок
ну то на ваш. а я с компилятором негодуем.
ну то на ваш. а я с компилятором негодуем.
Вы с компилятором не внимательны ;) После ваших слов я даже вставил этот кусок в проект. Здесь все Ок.
Ошибка явная и думать не надо. Приведенный выше листинг это листинг функции, а не метода класса. Соответственно нет ни какого this.
Топикасетр, я глянул Вы взяли пример HTTP Client и попытались его выкусить. Не пытайтесь сделать отдельную функцию. Просто возмите этот класс и выкиньте все что не нужно. Начиная с наследия от QDialog
Не проверял но примерно так:
HttpDownload.h
#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
#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
#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();
}
Вы с компилятором не внимательны wink После ваших слов я даже вставил этот кусок в проект. Здесь все Ок.
Ошибка явная и думать не надо. Приведенный выше листинг это листинг функции, а не метода класса. Соответственно нет ни какого this.
ничегонипонял.
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)));
это вообще, на каком языке? пайтон что-ли?
это с++ :D
odin, нет.
это быдлокод. извините.
ну натравите на него ваш же скриптец из соседней темы.... :D
ну натравите на него ваш же скриптец из соседней темы.... :D
не для того я его писал.
odin, нет.
это быдлокод. извините.
Поясните.