当再次请求相同的url时,Qt QNetworkReply readAll返回空
Qt QNetworkReply readAll returns empty when request the same url again
这纯粹是为了测试和我的好奇心。我使用DataDownloader类从服务器获取数据列表。它适用于不同的url,比如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作为参数。
相关文章:
- Qt VTK交互风格的信号到小部件
- QT在错误的班级中寻找空位
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 如何在Qt C++中更改光标
- 如何在MS Visual Studio 2019中运行QT UI
- QT通过C++添加映射QML项目
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用Qt C++计算类似Git的SHA1哈希
- Qt focusObjectChanged example?
- 如何在cpp文件之间切换窗口?在Qt中
- QT:管理来自 QNetworkReply 的回复
- QNetworkReply https API 在 Android 设备上不起作用 - QT
- 如何将QNetworkReply信号连接到qt中的进度条
- Qt-QNetworkReply未显示Content-Length标头
- 当再次请求相同的url时,Qt QNetworkReply readAll返回空
- Qt 我们是否应该删除在 QNetworkAccessManager SIGNAL 上收到的 QNetworkReply
- Qt QNetworkReply连接已关闭