c++ - QT:管理来自 QNetworkReply 的回复
问题描述
我是 QT 开发的新手,我必须制作一个非 GUI 应用程序,它从 a 读取令牌POST request
,然后json requests
使用该令牌启动一些。我的问题是启动时该怎么办finished signal
。我试图将 传递reply.readAll()
给QByteArray
对象的参数,但是当我这样做时,值始终为空(“”)。我的代码是基于this完成的。
。H
#ifndef DOWNLOADER_H
#define DOWNLOADER_H
#include <QObject>
#include <QNetworkAccessManager>
class QNetworkReply;
class Downloader : public QObject
{
Q_OBJECT
public:
Downloader(QObject* parent=0);
void test();
bool finished = false;
QByteArray data;
public slots:
void handleReply(QNetworkReply* reply);
protected:
QNetworkAccessManager m_manager;
};
#endif // DOWNLOADER_H
.cpp
#include "downloader.h"
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QVariant>
#include <QDebug>
Downloader::Downloader(QObject *parent) :
QObject(parent)
{
connect(&m_manager, SIGNAL(finished(QNetworkReply*)), SLOT(handleReply(QNetworkReply*)));
}
void Downloader::test() {
QNetworkRequest request;
QUrl url("http://192.168.25.25:8080/path/to/token");
QUrl postData;
postData.addQueryItem("client_id", "foo");
postData.addQueryItem("username", "bar");
postData.addQueryItem("password", "12345");
postData.addQueryItem("grant_type", "password");
request.setUrl(url);
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
QNetworkReply* rep = m_manager.post(request,postData.encodedQuery());
rep->setProperty("url", QVariant(url));
qDebug() << "Post " << rep << rep->url();
}
void Downloader::handleReply(QNetworkReply *reply) {
qDebug() << "Handle" << reply << reply->url();
qDebug() << "Dynamic property" << reply->property("url").isValid() << reply->property("url");
qDebug() << "ReadAll " << reply->readAll();
finished = true;
data =reply->readAll();
reply->deleteLater();
}
主要是调用:
Downloader down;
down.test();
while (!down.finished)
{
usleep(3*1000*1100);//3,3s
cout << "no finalizado";
}
我想要做的是使用来填充参数并使用来自的reply
这个参数main
,当. 我知道这是不正确的,但我不知道如何管理请求的异步性质。我需要的是一些指南来了解我在做什么,因为我一直在 qt 页面、stackoverflow 和其他人中搜索但没有成功。提前致谢。finished bool
true
更新:我的主要功能
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Downloader down;
down.test();
return a.exec();
}
解决方案
在 classDownloader
中,声明一个信号以将 发射data
到另一个 QObject 派生类的插槽。例如,在Downloader::handleReply
你调用emit dataReady(data)
. 在主函数中添加以下代码:
Downloader down;
JsonSender obj;
connect(&down, &Downloader::dataReady, &obj, &JsonSender::dataReady);
down.test();
return a.exec();
dataReady
在类的槽中,JsonSender
您可以解析令牌并发送请求。
推荐阅读
- eclipse - Eclipse: How remove trailing white spaces on all lines for a non Java file?
- r - R H2o 对象未找到 H2OKeyNotFoundArgumentException
- pandas - Tensorflow:如何在词汇特征列中输入数据?
- php - 在 Woocommerce 中显示或隐藏两个结帐字段
- c# - 部署 C# WinForm 应用程序适用于大多数机器,但不是全部
- jquery - 保持导航链接处于活动状态
- python - 通过子进程python运行praat脚本时无法将字节输出转换为字符串
- assembly - x86 汇编 (NASM) 十进制 > 八进制
- node.js - 如何在不重新加载页面(node.js)的情况下使用 oauth 对 Twitter 用户进行身份验证?
- spring - 使用 Spring Data Paging 确保当前页面是最后一个页面的方法