QT QNetworkAccessManager and Signals
QT QNetworkAccessManager and Signals
我有一个类(RequestHandler),我从我的主应用程序类调用它来调用各种Web服务。一旦服务完成,类就会向调用类发送一个信号,表示它已完成(可能带有 QString 消息)。我有信号在测试方法中工作,但QNetworkAccessManager根本不起作用。我对QT和C++很陌生。感谢您的帮助。
RequestHandler.h
#ifndef REQUESTHANDLER_H_
#define REQUESTHANDLER_H_
#include <QNetworkAccessManager>
#include <QUrl>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QOBJECT>
#include "MainAppClass.hpp"
class RequestHandler : public QObject
{
Q_OBJECT
public:
explicit RequestHandler(QObject *parent = 0);
void validateRegistration(QString reg);
void onStatusUpdateCompleted();
void sayHi();
signals:
void sendSignal(QString txt);
private:
QNetworkAccessManager* manager;
QObject* thisObj;
public slots:
void onRequestCompleted();
};
#endif /* REQUESTHANDLER_H_ */
请求处理程序.cpp
#include "RequestHandler.h"
RequestHandler::RequestHandler(QObject *parent) : QObject(parent)
{
thisObj= parent;
}
void RequestHandler::validateRegistration(QString reg) {
QNetworkRequest request;
request.setUrl(QUrl("the_registration_url"));
manager = new QNetworkAccessManager();
QNetworkReply *reply = manager->get(request);
connect(reply, SIGNAL(finished()), this, SLOT(onRequestCompleted()));
}
void RequestHandler::onRequestCompleted() {
// not getting here at all
}
void RequestHandler::sayHi()
{
// this is working
QObject::connect(this, SIGNAL(sendSignal(QString)), thisCellCast, SLOT(recieveValue(QString)));
emit sendSignal("HERES THE SIGNAL");
}
我这样称呼这个类:
// test slots and reg
RequestHandler rh(this);
//working
rh.sayHi();
// not working
rh.validateRegistration("test");
感谢您的帮助。
通常应该QNetworkAccessManager
通过连接到error()
和finished()
信号,以便在发生错误时通知您。
在validateRegistration()
中构造QNetworkAccessManager
对象真是个坏主意,因为它会导致内存泄漏,并且您只需要一个这样的对象 类。所以在RequestHandler
的构造函数中这样做。
void RequestHandler::validateRegistration(QString reg)
{
QUrl url("the_registration_url");
QNetworkRequest request(url);
QNetworkReply *reply = manager->get(request);
connect(reply, SIGNAL(finished()), SLOT(onRequestCompleted()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
SLOT(onError(QNetworkReply::NetworkError)));
}
void RequestHandler::onRequestCompleted()
{
qDebug() << "Request succeeded";
}
void RequestHandler::onError(QNetworkReply::NetworkError code)
{
qError() << "Request failed with code " << code;
}
还要确保在某处调用了 QApplication::exec(),以便运行主事件循环。
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- std::visit and std::variant usage
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- Directx12 and keystrokes
- different between int **arr =new int [ n]; and int a[i][j]?
- C++ getenv and setenv
- Inference pytorch C++ with alexnet and cv::imread image
- Visual Studio 2019 C++ and std::filesystem
- 保证逻辑 AND 表达式中的函数调用
- std::getline and posix signals
- QT QNetworkAccessManager and Signals
- LeapMotion, Qt and signals
- OpenSSL and signals