gpt4 book ai didi

c++ - 当再次请求相同的 url 时,Qt QNetworkReply readAll 返回空

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:19:37 25 4
gpt4 key购买 nike

这纯粹是为了测试目的和我的好奇心。我使用我的 DataDownloader 类从服务器获取数据列表。它适用于不同的网址,例如 http://tiny-file-url , http://big-file-url .但是如果我传入两个相同的 url,http://tiny-file-url , http://tiny-file-url ,以及来自 http://tiny-file-url 的数据很小,那么 QNetworkAccessManager 的第二个回复是空的。然而两个http://big-file-url似乎工作。我想知道 QNetworkAccessManager 在从同一个 url 请求小数据时是否会做一些魔术?我似乎无法在 Qt 文档站点上获得任何相关信息。

这是我的 DataDownloader 类:

class DataDownloader : public QObject
{
Q_OBJECT

public:
explicit DataDownloader(QObject* parent = 0);
virtual ~DataDownloader();

QByteArray data() const;
void cancel();
void download(QUrl url);

signals:
void isComplete();

private slots:
void complete(QNetworkReply* reply);

private:
QNetworkAccessManager m_NetworkManager;
QByteArray m_Data;
QNetworkReply* m_pReply;
};

DataDownloader::DataDownloader(QUrl url, QObject* parent) :QObject(parent)
{
connect(&m_NetworkManager, SIGNAL(finished(QNetworkReply*)),
SLOT(complete(QNetworkReply*)));
}

DataDownloader::~DataDownloader()
{
}

void DataDownloader::complete(QNetworkReply* reply)
{
// in the first download it returns data
// but the second time m_Data is empty
m_Data = reply->readAll();
reply->deleteLater();

if (!m_Data.isEmpty()) {
// no signal on the second try
emit isComplete();
}
}

QByteArray DataDownloader::data() const
{
return m_Data;
}

void DataDownloader::cancel()
{
m_pReply->abort();
}

void DataDownloader::download(QUrl url)
{
QNetworkRequest request(url);
m_pReply = m_NetworkManager.get(request);
}

调用此DataDownloader的代码如下:

void PluginManager::downloadPlugins()
{
m_DownloadIndex++;

savePlugin();

if (m_DownloadIndex < m_PluginList.size()) {
QUrl url;
// alway return the same url here
QString pluginUrl = getPluginUrl(m_PluginList.at(m_DownloadIndex));
url.setUrl(pluginUrl);

if (m_pPluginDownloader == NULL) {
m_pPluginDownloader = new DataDownloader();
// call this function again when isComplete is signaled
connect(m_pPluginDownloader, SIGNAL(isComplete()), this, SLOT(downloadPlugins()));
}
m_pPluginDownloader->download(url);
}
}

最佳答案

我认为这里 isComplete 是在您将它连接到 downloadPlugins 插槽之前发出的。尝试先连接此信号,然后执行下载操作:

m_pPluginDownloader = new DataDownloader(url);

connect(m_pPluginDownloader, SIGNAL(isComplete()), this, SLOT(downloadPlugins()));

m_pPluginDownloader.download();

不是在构造函数中执行 get 操作,而是在名为 download 的插槽中执行:

void DataDownloader::download()
{
QNetworkRequest request(url);
m_pReply = m_NetworkManager.get(request);
}

另一点是,不必每次都创建一个新的 DataDownloader 实例。您可以在 PluginManager 的构造函数中创建一个实例,并在那里连接 isComplete 信号。然后,您可以在 download 插槽中提供 url 作为参数。

关于c++ - 当再次请求相同的 url 时,Qt QNetworkReply readAll 返回空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28372199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com