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

标签 c++ qt http-get qnetworkaccessmanager qnetworkrequest

我正在尝试使用 Qt 获取网页并将其打印在屏幕上。问题是它总是打印“”。它不会进入完成的 SLOT。不知道是不是connect()有问题。代码编译没有错误。 尝试不使用事件循环。

代码如下:

网络.h

#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

net.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 ());
}

和main.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 ());
    }
}

关于c++ - 当尝试使用 Qt QNetworkAccessManager 获取网页时,它总是返回 "",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27829600/

相关文章:

HTTP GET 和 POST 语义和限制

c++ - #include <CEGUI/RendererModules/Ogre/CEGUIOgreRenderer.h> 没有正确包含 ogre 头文件

c++ - 没有复制文件的 TeamCity 依赖?

c++ - Google Test 宏似乎不适用于 Lambda 函数

c++ - 如何声明一个带有成员函数指针的函数

qt - QGraphicsView 滚动和图像缩放/裁剪

qt - 在 Ubuntu 13.04 和 QT-Creator 上设置 SFML

Android (2.1) HttpGet.abort() 不工作

java - 对 HttpClient[Java] 处理 gzip 响应有点困惑

c++ - 为什么在 C++ 中 (0 < 5 < 2) 结果为真?