{
Q_OBJECT
public:
MainWindowContainer
(QWidget *parent
= 0);
public slots:
void InvokeDownloadThread();
private:
PhotosDownloadWorker* pm_hotosDownloadWorker;
};
#include <QtGui>
#include "MainWindowContainer.h"
MainWindowContainer
::MainWindowContainer(QWidget* parent
) : {
layout->addWidget(pushButtonInvokeThread);
setLayout(layout);
QObject::connect(pushButtonInvokeThread,
SIGNAL(clicked
()),
this,
SLOT(InvokeDownloadThread
()));
}
void MainWindowContainer::InvokeDownloadThread()
{
pm_hotosDownloadWorker = new PhotosDownloadWorker(this);
pm_hotosDownloadWorker->Execute();
}
class PhotosDownloadWorker
: public QThread {
Q_OBJECT
public :
PhotosDownloadWorker
(QObject *parent
);
~PhotosDownloadWorker();
void Execute();
protected:
void run();
private:
bool m_abort;
QList<QNetworkReply *> currentDownloads;
QNetworkAccessManager* networkMgr ;
public slots:
void downloadFinished(QNetworkReply *reply);
void startNextDownload
(const QUrl &url
);
};
#include "PhotosDownloadWorker.h"
PhotosDownloadWorker
::PhotosDownloadWorker(QObject *parent
){
m_abort = false;
networkMgr = new QNetworkAccessManager(this);
connect(networkMgr, SIGNAL(finished(QNetworkReply*)), this, SLOT(downloadFinished(QNetworkReply*)));
}
PhotosDownloadWorker::~PhotosDownloadWorker()
{
m_abort = true;
wait();
}
void PhotosDownloadWorker::Execute()
{
m_abort = false;
start();
}
void PhotosDownloadWorker::run()
{
m_urlList.append("http://....xxxx......jpg");
m_urlList.append("http://....xxxx......jpg");
m_urlList.append("http://....xxxx......jpg");
m_urlList.append("http://....xxxx......jpg");
m_urlList.append("http://....xxxx......jpg");
m_urlList.append("http://....xxxx......jpg");
m_urlList.append("http://....xxxx......jpg");
m_urlList.append("http://....xxxx......jpg");
m_urlList.append("http://....xxxx......jpg");
m_urlList.append("http://....xxxx......jpg");
m_urlList.append("http://....xxxx......jpg");
m_urlList.append("http://....xxxx......jpg");
m_urlList.append("http://....xxxx......jpg");
// x 30
append(m_urlList);
}
void PhotosDownloadWorker
::append(const QStringList &urlList
) {
{
startNextDownload
(QUrl::fromEncoded(url.
toLocal8Bit()));
}
}
void PhotosDownloadWorker
::startNextDownload(const QUrl &url
) {
QNetworkRequest request(url);
QNetworkReply *reply = networkMgr->get(request);
currentDownloads.append(reply);
}
{
fprintf(stderr, "Could not open %s for writing: %s\n",
qPrintable(filename),
qPrintable(file.errorString()));
return false;
}
file.write(data->readAll());
file.close();
return true;
}
void PhotosDownloadWorker::downloadFinished(QNetworkReply *reply)
{
if (reply->error()) {
fprintf(stderr, "Download of %s failed: %s\n",
url.toEncoded().constData(),
qPrintable(reply->errorString()));
} else {
QString filename
= saveFileName
(url
);
if (saveToDisk(filename, reply))
printf("Download of %s succeeded (saved to %s)\n",
url.toEncoded().constData(), qPrintable(filename));
}
reply->deleteLater();
currentDownloads.removeAll(reply);
if (currentDownloads.isEmpty())
{
this->exit();
}
}
QString PhotosDownloadWorker
::saveFileName(const QUrl &url
) {
if (basename.isEmpty())
basename = "download";
if (QFile::exists(basename
)) { // already exists, don't overwrite
int i = 0;
basename += '.';
++i;
}
return basename;
}
//main
#include "MainWindowContainer.h"
int main(int argc, char *argv[])
{
MainWindowContainer mainWindowContainer;
mainWindowContainer.show();
return app.exec();
}