QT c++ - QNetworkAccessManager帮助需要!类问题
QT C++ - QNetworkAccessManager help needed! Class problem
我正试图从服务器下载一个页面到我的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需要帮助!课堂问题(链接到答案)
我该怎么做才能避免这种情况?
谢谢!div;)
您的http
或http2
对象在构造函数结束时被销毁,因为它是在本地分配的。
你至少应该动态地分配它:
http2 *h = new http2(this);
如果你想重用它,你也可以将它声明为tcpserver
的成员,而不是使用局部变量。如果没有,当它不再需要时,你应该以某种方式销毁它。
编辑
如果销毁是在插槽内和/或响应来自
h
的信号时完成的,则应该使用QObject::deleteLater
而不是立即删除,因为在发出信号时对象可能仍然在某处被引用。
所以deleteLater();
在httpdown()
或h->deleteLater();
在tcpserver
插槽。要知道您是否有答案或错误,您可以使用该代码并将数据或错误转发到具有自定义信号和插槽的
tcpserver
类。
一行:
SIGNAL(bool)
看起来真的不对;你是说
SIGNAL(done(bool))
?
在调试模式下,应该有一些调试输出说它不能连接信号
- 需要以下代码的帮助,下面的代码有什么问题
- 我需要这方面的帮助C++在使用逻辑运算符时是/否问题
- 需要帮助调试"attribute parser"!C++ 来自黑客排名的问题
- 做对了一个类似竞争的问题,但需要帮助来提高效率
- Rand() 没有显示随机数,请帮助我了解出了什么问题:)
- C++ DLL 运行时错误"abc.dll is not a valid WIN32 application" 。请帮助解决这个问题
- 如果不是这样,我需要帮助理解这个嵌套的问题
- 使用带有 MEX 包装器的帮助程序 C 文件从 MATLAB 2016 调用C++代码时出现问题
- 谁可以帮助解释我的代码中出了什么问题.计算C ++中的数组
- 在使用 pthread 和信号量实现生产者-消费者问题时需要帮助
- 任何熟悉Codecademy C++/程序的人都可以帮助解决菜鸟问题吗?
- 需要帮助将矢量解决范围问题.C
- 尝试在链表程序的末尾进行更简单的插入.小问题需要帮助
- C++函数问题 = 帮助我理解基本概念
- 谁能帮助我解决以下 c++ 代码中的问题?该程序不提供任何输出
- 我只需要一些调试帮助(C++)。我遇到了多个不确定如何解决的问题
- 上层到下部不起作用,帮助我的代码出了什么问题
- 简而言之,我真的很纠结语法,有人可以帮助我解决这个问题
- GPU 如何帮助改进迭代问题
- 递归问题帮助c++