【问题标题】:Use QNetworkRequest in another class在另一个类中使用 QNetworkRequest
【发布时间】:2021-06-17 19:58:41
【问题描述】:

我在 mainWindow 类中有一个 get_curl() 方法。我想将此方法移动到一个单独的类中,以便可以从程序的任何部分使用它。我试图这样做,但没有任何效果。我知道问题出在我在 Utils 类中使用的 connect () 中。我需要我可以从我的 Utils 类调用相同的方法 get_curl () 的方法

我删除了我的一些代码

MainWindow.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

#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

【问题讨论】:

  • 你的问题不清楚
  • 您能否重新表述您的问题,现在您的问题不清楚?
  • 不相关:SIGNAL 和 SLOT 语法不是首选的绑定方法。您应该改用 Qt5 风格的连接。
  • 这能回答你的问题吗? waiting for a signal

标签: c++ qt


【解决方案1】:

finished 信号连接到从外部传入的 C++ lambda。 这只能使用新的连接语法:

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);
}

然后你可以重写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);
    });
}

【讨论】:

  • 所以,如果我将此代码复制到另一个类中,例如 A { void H() {qnetwor acess...} Void J() {using url_cb...}};我可以像 A a 一样调用 thouse 代码吗?啊(); ???
  • url_geturl_cb 的定义可以无处不在。在 A 类的某个方法中,您只需使用回调调用 url_get
  • 我想澄清一下。我是 C++ 的新手。我需要一个单独的类,我可以在其中调用发送此 curl 请求的方法。我应该如何正确编写此方法。我说对了吗?
  • 为什么你认为你需要一个单独的类?你可以在任何你想要的地方调用这个函数。
  • mainWindow - 这是我的 .ui 类。我不想在这门课上有任何“引擎逻辑”。我不知道它在qt中是否不好,但无论如何我都不知道。对不起很多“我”,我的英语不好
猜你喜欢
  • 2017-08-16
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 2013-02-17
相关资源
最近更新 更多