【问题标题】:QT C++ - QNetworkAccessManager help needed! Class problemQT C++ - 需要 QNetworkAccessManager 帮助!班级问题
【发布时间】:2011-08-25 14:16:24
【问题描述】:

我正在尝试将页面从服务器下载到我的 QT 程序,但我一直在寻找方法,但它们并没有真正发挥作用。我不是 QT/C++ 方面的专家,所以请善待 :)

嗯.. 到目前为止,我使用了以下代码:

[OLD CODE] - 检查下面的更新代码!

http.cpp

#include "http.h"

http::http(QObject *parent) :
    QObject(parent)
{

    qDebug() << "HTTP ST";

    http1 = new QHttp(this);
    connect(http1, SIGNAL(done(bool)), this, SLOT(httpdown())); // Correction 1.
    http1->setHost("localhost");
    http1->get("/test.php");

    qDebug() << "HTTP END";


}

void http::httpdown()
{

    qDebug() << "completed!";
    qDebug() << http1->readAll();


}

http.h

#ifndef HTTP_H
#define HTTP_H

#include <QtNetwork>
#include <QHttp>
#include <QDebug>
#include <QObject>

class http : public QObject
{
    Q_OBJECT
public:
    explicit http(QObject *parent = 0);

signals:

public slots:
    void httpdown();

private:
    QHttp *http1;

};

#endif // HTTP_H

问题是 httpdown() 从来没有被调用过,我已经尝试了我所知道的任何东西 :( 可能我没有正确地这样做。

我们将不胜感激。 谢谢。


问题更新

我已听取 alexisdm 的建议并检查 QNetworkAccessManager。所以这里是在 main() 上正确工作的新代码。

当我从另一个类运行它时,我从来没有收到信号。

[新代码]

http2.cpp

#include "http2.h"

http2::http2(QObject *parent) :
    QObject(parent)
{
    m_manager = new QNetworkAccessManager(this);
    connect(m_manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(httpdown(QNetworkReply*)));

    QNetworkRequest request;
    request.setUrl(QUrl("http://localhost/test.php"));
    request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");

    m_manager->get(request);
}

void http2::httpdown(QNetworkReply* result)
{

       QByteArray data= result->readAll();
       QString str(data);

       qDebug() <<  str;

}

http2.h

#ifndef HTTP2_H
#define HTTP2_H

#include <QObject>
#include <QDebug>
#include <QtNetwork>
#include <QNetworkReply>

class http2 : public QObject
{
    Q_OBJECT
public:
    explicit http2(QObject *parent = 0);

signals:

public slots:
    void httpdown(QNetworkReply* result);
private:
    QNetworkAccessManager* m_manager;

};

#endif // HTTP2_H

现在,如果我像这样直接在 main.cpp 下调用它:

ma​​in.cpp

#include <QtCore/QCoreApplication>
#include "tcpserver.h"
#include "http2.h"

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

    http2 h; // --> Working!!

    tcpserver mServer;

    return a.exec();
}

它工作正常。但是,如果我在 tcpserver 类中这样调用它:

tcpserver.cpp

#include "tcpserver.h"
#include "protocol.h"
#include "http2.h"

QTextStream in(stdin);

tcpserver::tcpserver(QObject *parent) :
    QObject(parent)
{
    server = new QTcpServer(this);

    [ ... Other Server Stuff ... ]

    // http2 h; // --> OLD CODE - Not Working :(

    http2 *h = new http2(this); // **--> NEW CODE working provided by alexisdm**

}

信号永远不会发生...怎么了?我是新来的! :P

无论如何,alexisdm 说:“也许 http 对象在发出信号之前就被销毁了(例如,如果它是在堆栈上分配的)” - 已接受解决方案,以下代码已更正 阅读:QT C++ - QNetworkAccessManager help needed! Class problem(答案链接)

我应该怎么做才能避免这种情况?

谢谢! ;)

【问题讨论】:

  • 你也应该发布你的 main() 函数,因为这部分代码似乎没有任何问题(除了 QHttp 已弃用,你应该使用 @987654329 @ 代替)。
  • @alexisdm 正如我对 MrLunchtime 所说的那样,我没有直接在 main() 下运行它。我会检查 QNetworkAccessManager。谢谢。
  • @alexisdm - 谢谢!请检查上面的帖子,我可能错过了一些东西,但使用 QNetworkAccessManager 的新代码正在运行。 ;)

标签: c++ qt qtnetwork


【解决方案1】:

您的 httphttp2 对象在构造函数结束时被销毁,因为它是在本地分配的。

你至少应该动态分配它:

http2 *h = new http2(this);

如果你想重用它,你也可以将它声明为tcpserver的成员,而不是使用局部变量。如果没有,你应该在不再需要它时以某种方式将其销毁。


编辑

    1234563发出信号。
    因此,deleteLater(); 中的 httpdown()h-&gt;deleteLater(); 中的 tcpserver 插槽。
  • 要知道您是否有答案或错误,您可以使用 that code 并将数据或错误转发到您的 tcpserver 自定义信号和插槽类。

【讨论】:

  • 它工作正常,谢谢。最后摧毁它的最好方法是什么?谢谢。
  • 如果我将 httpdown() 更改为 QByteArray,当它被称为大信号时,我应该如何将答案返回给 tcpserver 类?我怎么知道我什么时候有答案? :S
  • 您好,谢谢,我正在使用该方法获取数据,但是如何将其返回到 tcpserver 类?比如在做其他事情之前等待数据回到 tcpclass 中......?
  • 将“其他东西”放入连接到您将在httpdown() 中发出的信号的插槽中。
  • 我认为你应该为你的子问题开始一个新问题,也许可以将问题恢复到以前的状态。
【解决方案2】:

行:

SIGNAL(bool)

确实看起来不太对;你是说

SIGNAL(done(bool))

?

在调试模式下,应该有一些调试输出说它无法连接信号。

【讨论】:

  • 是的,抱歉,我在这里发帖时正在清理代码……但它不起作用 httpdown() 永远不会被调用。
  • 您是否已启动(exec()'d)一个 QApplication/QCoreApplication?编辑:我已经把它变成了一个合适的应用程序,并且 httpDown() 被调用 OK。
  • 好吧,这就是我所拥有的,无论如何:我已经修改它以从 www.google.com 获取 /index.html :bit.ly/qKeJ1q(如果发生错误,也会报告错误)。
  • 它工作得很好我现在发现问题是我正在从我的程序中的另一个类调用http。如果我在 main() 上调用它,它工作正常。从另一个类调用它有什么问题?
  • 也许http 对象在信号发出之前就被破坏了(例如,如果它是在堆栈上分配的)。
猜你喜欢
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多