我正在开展一个学校项目,几周后我尝试调整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协议的消息。
答案 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派生对象。