为什么我无法使用此代码下载文件

时间:2015-02-16 08:35:05

标签: c++ qt download

我正在开展一个学校项目,几周后我尝试调整this code,但它给我一个空的QByteArray。我真的需要这个代码,因为我的整个项目都基于这个代码。

这是我的代码:

namespace Pixmap {
static QByteArray *bitmap;

QPixmap downloadPixmap(const QUrl &url);
QPixmap downloadPixmap(const QString &url);
}

QPixmap Pixmap::downloadPixmap(QUrl const& url)
{
QNetworkAccessManager access_manager;
QNetworkReply *reply = access_manager.get(
            QNetworkRequest(url)
            );
QPixmap pix;
bitmap = &reply->readAll();
reply->close();
if (/*!bitmap->isNull() && */ !reply->readAll().isNull()) {
    pix.loadFromData(*bitmap);
    return pix;
} else {
    // Apparemment aux tests 1 et 2 pas d'erreurs.
    qDebug("Damned");
    return QPixmap();
}
}

QPixmap Pixmap::downloadPixmap(QString const& url)
{
    return downloadPixmap(QUrl(url));
}

我认为解决方案是使用静态变量来接收数据的回复,但它不是。

请你提出一些建议。

我目前正在使用Qt 5.3在Windows上开发。

谢谢大家。

编辑1: 所以我将Nejat的第二个解决方案与this合并。

结果没有结束。调试器建议我不支持HTTP协议。

Can't download "http://127.0.0.1/Acompte/MCD_Ordi.jpg" : "Protocol type not supported"

if (reply->waitForReadyRead(-1)) //! @bug this does not work as supposed, waitForRead returns false and returns INSTANTLY!!
    qDebug() << "ReadyRead yeha!!!";
if (reply->error()) {
    qDebug() << "Can't download" << reply->url().toString()
            << ":" << reply->errorString();
} else {
    bitmap = reply->readAll();
    qDebug() << "Saving IMG";
}

根据你的问题,问题是什么?我还是Qt Widgets的新手,我不会掌握QObject :: connect。

编辑2: URL是本地的,它是:127.0.0.1/Acompte/MCD_Ordi.jpg我可以使用我的Web浏览器查看它,但不能在我的应用程序中查看。所以我不明白这个问题是什么。

现在我尝试,它返回不支持HTTP协议的消息。

3 个答案:

答案 0 :(得分:1)

您必须设置access_manager的完成信号

connect(access_manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(myFunctionToHandleReply(QNetworkReply *)));

你的myFunctionToHandleReply必须处理回复:

void MyApp::myFunctionToHandleReply(QNetworkReply *reply) {
    QByteArray data = reply->readAll();
}

包含QNetworkAccessManager信号的文档:http://doc.qt.io/qt-5/qnetworkaccessmanager.html

答案 1 :(得分:1)

您也可以通过将finished的{​​{1}}信号连接到广告位来以异步方式执行此操作:

QNetworkAccessManager

并在那里读取数据:

connect(&access_manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(onFinished(QNetworkReply*)));

您还可以使用事件循环等待答复完成,然后读取可用字节:

void onFinished(QNetworkReply* reply)
{

   if (reply->error() == QNetworkReply::NoError)
   {
       QByteArray bts = reply->readAll();

       ...
   }
}

答案 2 :(得分:0)

所以我将Nejat的第二个解决方案与this合并。

结果没有结束。调试器建议我不支持HTTP协议。

Can't download "http://127.0.0.1/Acompte/MCD_Ordi.jpg" : "Protocol type not supported"

if (reply->waitForReadyRead(-1)) //! @bug this does not work as supposed, waitForRead returns false and returns INSTANTLY!!
    qDebug() << "ReadyRead yeha!!!";
if (reply->error()) {
    qDebug() << "Can't download" << reply->url().toString()
            << ":" << reply->errorString();
} else {
    bitmap = reply->readAll();
    qDebug() << "Saving IMG";
}

根据你的问题,问题是什么?我还是Qt Widgets的新手,我不会掌握QObject :: connect。

编辑: 工作中的隐藏代理会阻止此请求。

另外请注意,此代码不会造成内存泄漏:

QEventLoop *loop = new QEventLoop;
QObject::connect(reply, SIGNAL(finished()), loop, SLOT(quit()));
QObject::connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), loop, SLOT(quit()));
loop->exec();

您不需要删除QObject派生对象。