8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

QNetworkReply 等待完成

Oberon 1月前

40 0

我正在使用 Qt 4.6.3 和以下不起作用的代码QStringList userInfo;QNetworkRequest netRequest(QUrl(\'http://api..com/1.1/users/587532\'));QNetworkReply *netReply = netman->...

我正在使用 Qt 4.6.3 和以下不起作用的代码

QStringList userInfo;
QNetworkRequest netRequest(QUrl("http://api..com/1.1/users/587532"));
QNetworkReply *netReply = netman->get(netRequest);

// from here onwards not working
netReply->waitForReadyRead(-1);
if (netReply->isFinished()==true)
{userInfo << do sth to reply;}
return userInfo;

由于此函数返回一个空的 QStringList,因此应用程序崩溃。如何等待请求完成,然后 在一个函数内

帖子版权声明 1、本帖标题:QNetworkReply 等待完成
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Oberon在本站《qt》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我也知道这一点,但我如何能够在同一函数中返回接收到的数据(我不想有额外的插槽函数)

  • 首先,我建议您阅读 Qt 文档参考中的相关文档,您可以在此处找到: http://doc.qt.nokia.com/latest/classes.html .

    查看您的代码示例,似乎您除了 和 之外 QNetworkRequest QNetworkReply 一个 QNetworkAccessManager 。您需要的是将插槽连接到 finished(QNetworkReply *) 信号。每当待处理的网络答复完成时,就会发出此信号。

    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(replyFinished(QNetworkReply*)));
    
    manager->get(QNetworkRequest(QUrl("http://api..com")));
    

    现在,您可以在插槽中读取响应请求而发送的数据。例如:

    void MyClass::MySlot(QNetworkReply *data) {
        QFile file("dataFromRequest");
        if (!file.open(QIODevice::WriteOnly))
            return;
        file.write(data->readAll());
        file.close();
    }
    

    编辑:

    要同步等待信号,请使用 QEventLoop。这里有一个例子

    http://wiki.forum.nokia.com/index.php/How_to_wait_synchronously_for_a_Signal_in_Qt

  • 这里的回复都使用了旧语法,不适用于最新的 QT。

    等待网络请求完成:

    QEventLoop loop;
    connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
    loop.exec();
    
  • 这只意味着您应该考虑连接到一些额外的信号。如果它“总是被我调用”,那也没关系。可能存在(如文档所述)您不会收到 finish() 信号的情况,因此您的事件循环将卡住

  • 还没有遇到过任何未调用完成槽的情况。我知道文档指出它通常会被调用,但对我来说它总是被调用

  • 您可以使用事件循环:

    QEventLoop loop;
    connect(netReply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();
    // here you have done.
    

    另外,您还应该考虑添加一些比网络超时更短的时间(20 秒?)。我不确定即使发生错误,是否也会调用 finish。因此,您也有可能连接到错误信号。

返回
作者最近主题: