程序结束后的网络回复

时间:2014-08-09 15:07:14

标签: c++ qt qnetworkaccessmanager slot

我编写的程序从url获取网页的源代码,但我有问题,因为这个代码在程序结束时打印在屏幕上,我不能使用我下载的数据。我认为问题是因为程序等待SIGNAL(finished())。有没有办法在结束前处理我程序中的下载数据?

void Get::getCode()
{
    networkManager = new QNetworkAccessManager(this);
    link = "http://example.com/";
    networkManager->get(QNetworkRequest(QUrl(link)));
    connect(networkManager, SIGNAL(finished(QNetworkReply*)), &process, SLOT(replyFinished(QNetworkReply*)));

    //QDesktopServices::openUrl(QUrl(link));
}

...

    void Process::replyFinished(QNetworkReply* pReply)
{
    QString source(pReply->readAll());
    printf("%s\n", source.toStdString().c_str());
}

...

int main(int argc, char *argv[]){

    QApplication a(argc, argv);

    Get get; get.getCode();
    MainWindow window;

    printf("test point\n");

    return a.exec();
    //return 0;}

"测试点"是第一个在屏幕和后来的HTML代码。

1 个答案:

答案 0 :(得分:0)

网络管理器运行异步,这意味着您的主线程在调用get()方法后立即继续。

您可以通过设置一个等待下载完成的事件循环来解决此问题:

  QEventLoop loop;
  connect(networkManager, SIGNAL(finished()), &loop, SLOT(quit()));
  loop.exec(QEventLoop::ExcludeUserInputEvents);

这应该会给你预期的结果。