Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我无法使用此代码下载文件_C++_Qt_Download - Fatal编程技术网

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

C++ 为什么我无法使用此代码下载文件,c++,qt,download,C++,Qt,Download,我正在做一个学校的项目,几个星期以来我一直在努力适应,但它给了我一个空的QByteArray。我真的需要这段代码,因为我的整个项目都基于这段代码 这是我的密码: namespace Pixmap { static QByteArray *bitmap; QPixmap downloadPixmap(const QUrl &url); QPixmap downloadPixmap(const QString &url); } QPixmap Pixmap::downloadPi

我正在做一个学校的项目,几个星期以来我一直在努力适应,但它给了我一个空的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));
}
我认为解决方案是使用静态变量来接收数据的回复,但事实并非如此

你能给我一些建议吗

我目前正在使用Qt5.3在Windows上开发

谢谢大家

编辑1: 所以我把Nejat的第二个解决方案和

结果不是结论。不支持调试程序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";
}
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";
}
无法下载“http://127.0.0.1/Acompte/MCD_Ordi.jpg“:“不支持协议类型”
如果(回复->waitForReadyRead(-1))/@bug这不按预期工作,waitForRead返回false并立即返回!!
qDebug()错误(){

qDebug()必须设置access\u管理器的完成信号

connect(access_manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(myFunctionToHandleReply(QNetworkReply *)));
您的myFunctionToHandleReply必须处理回复:

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

带有QNetworkAccessManager信号的文档:

您还可以通过将
QNetworkAccessManager的
完成的
信号连接到插槽,以异步方式执行此操作:

connect(&access_manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(onFinished(QNetworkReply*)));
并在此处读取数据:

void onFinished(QNetworkReply* reply)
{

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

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

QNetworkAccessManager access_manager;

QNetworkReply *reply = access_manager.get(QNetworkRequest(url));

QEventLoop loop;
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), &loop, SLOT(quit()));
loop.exec();

QByteArray bts = reply->readAll();
...

所以我把Nejat的第二个解决方案和

结果不是结论。不支持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";
}
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";
}

你不需要删除QObjor派生对象。< /P>你必须在发送GET请求和在响应中读取数据之间等待,但是你不需要t.Hi Vahancho,通过展示一个例子来解释这个问题是很好的;-我去了事件循环。这里是我的编译器(Visual C++ 2013)返回:QObject::connect:无此类信号QNetworkReplyHttpImpl::error()在..\horaires\u de_commerces\pixmap.cpp:12Damned@SteveHuguenin您还应该提供

error
signal的参数类型。请参阅更新后的答案。谢谢!奇怪的是,Qt Creator没有显示要输入的参数。这不是答案。如果有其他问题,您应该编辑问题或询问新问题。@Nejat您的评论是正确的,但不幸的是,我仍然无法使用Qt和他的QNetworkReply下载任何文件…那个地址是什么。你正在尝试从本地主机下载吗?你有web服务器吗?那是。我可以用我的web浏览器查看它。所以我看不出有什么问题。