[英]Use QNetworkRequest in another class
I have a get_curl () method in the mainWindow class. I want to move this method into a separate class so that it can be used from any part of the program.我在主窗口 class 中有一个 get_curl() 方法。我想将此方法移动到一个单独的 class 中,以便它可以从程序的任何部分使用。 i tried to do this but nothing worked.
我试图这样做,但没有任何效果。 I understand that the problem is in the connect () that I used in my Utils class. I need that I can call a method the same method get_curl () but from my Utils class
我知道问题出在我的 Utils class 中使用的 connect () 中。我需要我可以调用与 get_curl () 相同的方法,但来自我的 Utils class
And i delete some of my code我删除了一些代码
MainWindow.h主窗口.h
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_MainWindow.h"
#include <qstackedwidget.h>
#include <qstatusbar.h>
#include <qstring.h>
#include <qdebug.h>
#include <qtextcodec.h>
#include <qvariant.h>
#include <QtNetwork/qnetworkaccessmanager.h>
#include <QtNetwork/qnetworkrequest.h>
#include <QtNetwork/qnetworkreply.h>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = Q_NULLPTR);
private:
Ui::MainWindowClass ui;
QNetworkAccessManager* manager;
QNetworkRequest request;
QNetworkReply* reply;
QString contents;
QString err;
void get_curl();
void set_btn_clicks();
private slots:
void on_btn();
void on_btnRmouteClicked();
void slott(QNetworkReply*);
};
MainWindow.cpp主窗口.cpp
#include "MainWindow.h"
#include "Utils.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
ui.setupUi(this);
set_btn_clicks();
}
void MainWindow::set_btn_clicks()
{
connect(ui.btnRemoute, SIGNAL(clicked()), this, SLOT(on_btnRmouteClicked()));
}//MENU BTN CLICKS
#pragma region Engine
void MainWindow::get_curl()
{
manager = new QNetworkAccessManager();
request.setUrl(QUrl("https://auth.pentagon.com/api/client/account"));
request.setRawHeader("Accept", "application/json");
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
request.setRawHeader("Authorization", "Bearer xxx");
reply = manager->get(request);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(slott(QNetworkReply*)));
}
void MainWindow::slott(QNetworkReply*)
{
if (reply->error() == QNetworkReply::NoError)
{
contents = QString::fromUtf8(reply->readAll());
qDebug() << contents;
}
else
{
err = reply->errorString();
qDebug() << err;
}
}
#pragma endregion
#pragma region BtnClicks
void MainWindow::on_btn()
{
get_curl();
}
void MainWindow::on_btnRmouteClicked()
{
get_curl();
Utils u;
u.print_curl();
ui.stackedWidget->setCurrentWidget(ui.pageRemoute);
}
#pragma endregion
Connect the finished
signal to a C++ lambda that is passed in from outside.将
finished
的信号连接到从外部传入的 C++ lambda。 This is only possible using the new connection syntax:这只能使用新的连接语法:
using url_cb = std::function<void(QNetworkReply*)>;
void url_get(QNetworkRequest request, url_cb cb) {
auto manager = new QNetworkAccessManager;
QObject::connect(manager, &QNetworkAccessManager::finished, manager, &QObject::deleteLater);
QObject::connect(manager, &QNetworkAccessManager::finished, manager, cb);
manager->get(request);
}
You can then rewrite MainWindow::on_btnRmouteClicked()
as follows:然后您可以重写
MainWindow::on_btnRmouteClicked()
如下:
void MainWindow::on_btnRmouteClicked() {
QNetworkAccessRequest request;
request.setUrl(QUrl("https://auth.pentagon.com/api/client/account"));
request.setRawHeader("Accept", "application/json");
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
request.setRawHeader("Authorization", "Bearer xxx");
url_get(request, [=](QNetworkReply * rep) {
if (reply->error() == QNetworkReply::NoError) {
contents = QString::fromUtf8(reply->readAll());
qDebug() << contents;
} else {
err = reply->errorString();
qDebug() << err;
}
Utils u;
u.print_curl();
ui.stackedWidget->setCurrentWidget(ui.pageRemoute);
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.