简体   繁体   English

Qt C++ QNetworkRequest 未发出任何请求

[英]Qt C++ QNetworkRequest not making any requests

I'm trying to fetch some data from an API using QNetworkRequest following this video ( https://youtu.be/G06jT3X3H9E )我正在尝试在此视频之后使用 QNetworkRequest 从 API 获取一些数据( https://youtu.be/G06jT3X3H9E

I have a RoR server running on localhost:3000 and I'm trying to fetch something from it.我有一个在 localhost:3000 上运行的 RoR 服务器,我正试图从中获取一些东西。

.h file: .h 文件:

#ifndef WORKER_H
#define WORKER_H

#include <QObject>
#include <QDebug>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QAuthenticator>
#include <QNetworkProxy>

class Worker : public QObject
{
    Q_OBJECT
public:
    explicit Worker(QObject *parent = nullptr);

signals:

public slots:

    void get(QString code);

private slots:
    void readyRead();
    void authenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator);
    void encrypted(QNetworkReply *reply);
    void finished(QNetworkReply *reply);
    void networkAccessibleChanged(QNetworkAccessManager::NetworkAccessibility accessible);
    void preSharedKeyAuthenticationRequired(QNetworkReply *reply, QSslPreSharedKeyAuthenticator *authenticator);
    void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator);
    void sslErrors(QNetworkReply *reply, const QList<QSslError> &errors);

private:
    QNetworkAccessManager manager;
};

#endif // WORKER_H

.cpp file: .cpp 文件:

void Worker::get(QString code)
{
    qInfo() << "Getting something from the server...";
    QNetworkReply* reply = manager.get(QNetworkRequest(QUrl(QString("http://localhost:3000/api/v1/circle_gift_cards/scan?codes=" + code))));
    connect(reply, &QNetworkReply::readyRead, this, &Worker::readyRead);
}

void Worker::readyRead()
{
    qInfo() << "ReadReady";
    QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());
    if(reply) qInfo() << reply->readAll();
}

The result from:结果来自:

Worker worker;
worker.get("abc");

is: "Getting something from the server..." it should print "ReadReady" when the request is ready, but I don't think the request is being made, there's nothing in the console either.是:“从服务器获取某些东西......”它应该在请求准备好时打印“ReadReady”,但我不认为请求正在发出,控制台中也没有任何内容。


[Edit 1] What is calling the worker is this [编辑 1] 调用工人的是这个

void MainWindow::on_lineEditScanCard_textChanged(QString code) {
    Worker worker(this->site);
    worker.get(code);
}

It's an Edit field(where the user is supposed to type a code这是一个编辑字段(用户应该在其中键入代码


[Edit 2] [编辑 2]

I removed all app code and did this:我删除了所有应用程序代码并这样做:

#include <QApplication>
#include "Forms/mainwindow.h"
#include "Requests/worker.h"

int main(int argc, char *argv[]) {
  QApplication a(argc, argv);
  Worker worker;
  worker.get("abc");

  return a.exec();
}

And it worked... Why it does not work when called when the Edit text is changed?并且它起作用了...为什么在更改编辑文本时调用它不起作用?

Remember the concepts of scope, life cycle, and local variables?还记得scope、生命周期和局部变量的概念吗? In your case worker is a local variable that will be destroyed instantly so the slot is not invoked, use Worker * worker = new Worker;在您的情况下,worker 是一个将立即销毁的局部变量,因此不会调用插槽,请使用 Worker * worker = new Worker; worker->get("abc");工人->get("abc"); (remember to delete the memory when you no longer use it) (不再使用时记得删除memory)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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