2016-01-16 2 views
1

Я хотел бы добавить код примера QT в мой простой проект. Код примера находится здесь: https://wiki.qt.io/Download_Data_from_URLДобавление примера кода в QT C++

Он состоит из filedownloader.cpp и filedownloader.h - этот код загружает графику с предоставленного URL-адреса.

Я добавил эти файлы в свой проект и получаю чистую компиляцию. Я думаю, что я понимаю код в порядке (я в основном ac coder, а не C++), но я не понимаю, как я могу передать QUrl, созданный моим проектом, filedownloader.cpp

«Проект» - это просто main.cpp/mainwindow.cpp/mainwindow.ui, который предлагает кнопку для нажатия. Нажатие кнопки вызывает процедуру ниже:

void MainWindow::on_pushButton_clicked() 
{ 
// pass to filedownloader to process 
QUrl fileloc("http://www.test.com/test.jpg"); 
} 

Как кормить QUrl fileloc к filedownload.cpp?

ответ

1

Вы должны добавить новый метод в FileDownloader, который принимает QUrl и запускает загрузку.

filedownloader.h:

#ifndef FILEDOWNLOADER_H 
#define FILEDOWNLOADER_H 

#include <QObject> 
#include <QByteArray> 
#include <QNetworkAccessManager> 
#include <QNetworkRequest> 
#include <QNetworkReply> 

class FileDownloader : public QObject 
{ 
Q_OBJECT 
public: 
    explicit FileDownloader(QUrl imageUrl, QObject *parent = 0); 
    virtual ~FileDownloader(); 
    QByteArray downloadedData() const; 

signals: 
    void downloaded(); 

public slots: 
    void download(QUrl url); // <------ Here it is 

private slots: 
    void fileDownloaded(QNetworkReply* pReply); 

private: 
    QNetworkAccessManager m_WebCtrl; 
    QByteArray m_DownloadedData; 
}; 

#endif // FILEDOWNLOADER_H 

filedownloader.cpp:

#include "filedownloader.h" 

FileDownloader::FileDownloader(QObject *parent) : 
QObject(parent) 
{ 
connect(
    &m_WebCtrl, SIGNAL (finished(QNetworkReply*)), 
    this, SLOT (fileDownloaded(QNetworkReply*)) 
); 
// <------ Notice, that i've removed downloading code from here 
} 

FileDownloader::~FileDownloader() { } 

void FileDownloader::fileDownloaded(QNetworkReply* pReply) { 
m_DownloadedData = pReply->readAll(); 
//emit a signal 
pReply->deleteLater(); 
emit downloaded(); 
} 

void FileDownloader::download(QUrl url) { // <------ And its definition 
QNetworkRequest request(url); 
m_WebCtrl.get(request); 
} 

QByteArray FileDownloader::downloadedData() const { 
return m_DownloadedData; 
} 

И тогда ваш on_pushButton_clicked будет выглядеть следующим образом:

void MainWindow::on_pushButton_clicked() 
{ 
// pass to filedownloader to process 
QUrl fileloc("http://www.test.com/test.jpg"); 
m_filedownloader.download(fileloc); 
} 
+0

Идея класса, кажется, скорее, чтобы создать один объект FileDownloader для загрузки и передать URL-адрес в качестве аргумента ctor. Я не вижу необходимости в вашей модификации. Это просто добавляет сложности. Например, если download() вызывается дважды, невозможно определить, к какому вызову download() download() относится, а одна загрузка заменяет другую. –

Смежные вопросы