C++ 将代码示例添加到QT C++;

C++ 将代码示例添加到QT C++;,c++,qt,C++,Qt,我想在我的简单项目中添加一些QT示例代码。示例代码如下: 它由filedownloader.cpp和filedownloader.h组成——这段代码从提供的URL下载图形 我已经将这些文件添加到我的项目中,并得到了一个干净的编译。我想我理解代码还可以(我主要是一名c程序员,而不是c++),但我不明白如何将项目创建的QUrl传递给filedownloader.cpp “项目”只是一个简单的main.cpp/mainwindow.cpp/mainwindow.ui,它提供了一个要按下的按钮。按下按钮

我想在我的简单项目中添加一些QT示例代码。示例代码如下:

它由filedownloader.cpp和filedownloader.h组成——这段代码从提供的URL下载图形

我已经将这些文件添加到我的项目中,并得到了一个干净的编译。我想我理解代码还可以(我主要是一名c程序员,而不是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?

您必须向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对象,并将url作为参数传递。我看不出你有任何修改的必要。这只会增加复杂性。例如,如果两次调用download(),则不可能找到download()调用download()所指的是哪个,并且一次下载会替换另一次下载。
#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;
}
void MainWindow::on_pushButton_clicked()
{
// pass to filedownloader to process
QUrl fileloc("http://www.test.com/test.jpg");
m_filedownloader.download(fileloc);
}