This question already has an answer here:
Qt signal slot connection - QNetworkAccessManager

(1个答案)


5年前关闭。




我检查了一些使用QNetworkAccessManager的简单示例,然后发现了这一点(假设管理器是QNetworkAccessManager:
QNetworkRequest request;
request.setUrl(QUrl("http://www.someserver.com"));

QNetworkReply *reply = manager->get(request);
connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
    this, SLOT(slotError(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(sslErrors(QList<QSslError>)),
    this, SLOT(slotSslErrors(QList<QSslError>)));

据我了解,对manager-> get的调用将发出GET请求。但是,用于处理该请求答案的插槽仅在发送 call 后才连接,这对我来说似乎没有意义。这是我的问题:
  • 在完成请求后将插槽连接到信号不是问题吗?是否可能在连接发生之前完成请求并发出信号,从而导致信号丢失并从未被相应的插槽处理?

  • 谢谢!

    L.

    更新:正如cyber_raj所指出的,此问题已在此处得到解答:Qt signal slot connection - QNetworkAccessManager

    最佳答案

    没问题
    get调用是异步的:
    http://doc.qt.io/qt-5/qnetworkaccessmanager.html#details

    QNetworkAccessManager将接收到的请求排队,并每次运行6个异步任务。
    因此,正如您所指出的,没有太大的错误余地。

    但是如果您害怕,可以尝试第一个示例,连接管理器的信号:

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

    关于c++ - Qt:在QNetworkAccessManager中发送请求后连接信号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29370840/

    10-09 18:47