gpt4 book ai didi

c++ - QT C++ - QNetworkAccessManager 需要帮助!类(Class)问题

转载 作者:行者123 更新时间:2023-11-30 04:33:04 28 4
gpt4 key购买 nike

我正在尝试从服务器下载一个页面到我的 QT 程序,但我一直在寻找实现它的方法,但它们并没有真正奏效。我不是 QT/C++ 方面的专家,所以请客气点:)

好吧..到目前为止,我得到了这段代码:

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

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 下调用它:

main.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 (答案链接)

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

谢谢! ;)

最佳答案

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

你至少应该动态分配它:

http2 *h = new http2(this);

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


编辑

  • 如果销毁是在槽内和/或响应来自 h 的信号,您应该使用 QObject::deleteLater 而不是立即删除,因为在发出信号时该对象可能仍在某处被引用。
    因此,deleteLater();httpdown()h->deleteLater();tcpserver 插槽。

  • 要知道您是否有答案或错误,您可以使用 that code并使用自定义信号和插槽将数据或错误转发到您的 tcpserver 类。

关于c++ - QT C++ - QNetworkAccessManager 需要帮助!类(Class)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7191940/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com