简体   繁体   English

在另一个 class 中使用 QNetworkRequest

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM