QNetworkAccessManager 放到线程中---finished信号不触发

3 篇文章 0 订阅
使用QNetworkAccessManager进行数据下载时,由于是比较耗时的工作,所以需要丢到线程中去执行


代码说明:

void MyThread::run()
{
 if (!QFile::exists(m_strTileLocalPath))
 {
  QNetworkRequest request(m_strTileUrl);
  request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferNetwork);
  request.setAttribute(QNetworkRequest::CacheSaveControlAttribute, true);
  m_networkAccessManager.get(request);
 }
}

此情况下finished信号永远不被触发,在线程外面调用则可正常触发使用,通过查资料终于弄明白,
放在线程内使用QNetworkAccessManager时没有进行线程的事件循环,需要调用exec()才能开启线程的事件循环,
因此解决方式为:get(request)后面加上exec(),使线程进行事件循环。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
您可以通过QNetworkAccessManager的error信号捕获连接失败的情况,并在槽函数里面打印"失败"。以下是一个示例代码: ```cpp #include <QCoreApplication> #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QNetworkReply> #include <QDebug> class NetworkManager : public QObject { Q_OBJECT public: NetworkManager(QObject *parent = nullptr) : QObject(parent) {} void sendRequest() { QNetworkAccessManager *manager = new QNetworkAccessManager(this); connect(manager, &QNetworkAccessManager::finished, this, &NetworkManager::requestFinished); QNetworkRequest request(QUrl("your_url_here")); QNetworkReply *reply = manager->get(request); } private slots: void requestFinished(QNetworkReply *reply) { if (reply->error() != QNetworkReply::NoError) { qDebug() << "失败"; } else { // 处理成功响应 } reply->deleteLater(); reply->manager()->deleteLater(); } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); NetworkManager manager; manager.sendRequest(); return a.exec(); } #include "main.moc" ``` 在上述示例,我们创建了一个名为NetworkManager的类,其的sendRequest函数发送HTTP请求。在请求完成后,会触发QNetworkAccessManager的finished信号,然后调用requestFinished槽函数来处理响应。 在requestFinished槽函数,我们首先检查reply对象的error函数是否返回了NoError,如果不是,则打印"失败"。否则,您可以在else分支处理成功的情况。 请确保将"your_url_here"替换为您要发送请求的实际URL。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值