当尝试使用Qt QNetworkAccessManager获取网页时,它总是返回" "



我正在尝试使用Qt获取网页并将其打印在屏幕上。问题是它总是打印"。它不会进入完成的插槽。我不知道连接()是否有问题。代码编译时没有错误。尽量不要使用事件循环。

代码如下:

净值

#ifndef NET_H
#define NET_H
#include <QObject>
#include <QtNetwork>
#include <QString>
#include <QDebug>
class net : public QObject
{
    Q_OBJECT
public:
    explicit net(QObject *parent = 0);
    void get_site(QString url);
    QString data;
signals:
public slots:
    void err(QNetworkReply *);
    void done(QNetworkReply *);
private:
};
#endif // NET_H

净.cpp:

#include "net.h"
net::net(QObject *parent) :
    QObject(parent)
{
}
void net::get_site(QString url) {
    QNetworkAccessManager man;
    QNetworkRequest request;
    request.setUrl (QUrl(url));
    connect (&man , SIGNAL(finished(QNetworkReply*)) ,this, SLOT(done(QNetworkReply*)));
    connect (&man , SIGNAL(finished(QNetworkReply*)) ,this, SLOT(err(QNetworkReply *)));
    man.get (QNetworkRequest(QUrl(url)));
}
void net::done(QNetworkReply * reply) {
    data = QString(reply->readAll ());
}
void net::err(QNetworkReply * reply) {
    data = QString(reply->errorString ());
}

和主要.cpp:

#include <QCoreApplication>
#include "net.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    net netobj;
    netobj.get_site("http://stackoverflow.com");
    qDebug() << netobj.data;
    return a.exec();
}

你的代码中有一些主要问题。首先,您应该将QNetworkAccessManager作为 .h 文件中的类成员:

class net : public QObject
{
    ...
private:
    QNetworkAccessManager nam;
};

此外,您不应将finished信号连接到两个不同的插槽。您的get_site函数应如下所示:

void net::get_site(QString url) {
    QNetworkRequest request;
    request.setUrl (QUrl(url));
    connect (&man , SIGNAL(finished(QNetworkReply*)) ,this, SLOT(done(QNetworkReply*)));
    man.get (QNetworkRequest(QUrl(url)));
}

您应该通过以下方式管理返回的回复:

void net::done(QNetworkReply * reply) {

    if (reply->error() == QNetworkReply::NoError)
    {
       data = QString(reply->readAll ());
    }
    else
    {
       data = QString(reply->errorString ());
    }
}

您的QNetworkAccessManager实例在get_site函数结束时超出范围。 根据Qt文档,一个QNetworkAccessManager应该足以满足整个Qt应用程序的需求。 您的对象应保留在该函数的范围之外,因为接收响应所需的时间可能比该函数结束所需的时间更长。 使 QNetworkAccessManager 成为网络类的成员,而不是 get_site 的本地自动变量。

请注意,您还需要管理 QNetworkReply 对象的生存期,不是通过使用 delete ,而是通过使用 deleteLater(),否则可能会泄漏内存。

相关内容

  • 没有找到相关文章

最新更新