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



我正在尝试使用以下视频中的QNetworkRequest从API获取一些数据(https://youtu.be/G06jT3X3H9E)

我有一个RoR服务器在localhost:3000上运行,我正试图从中获取一些东西

.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文件:

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

结果来自:

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

是:";正在从服务器获取内容"它应该打印";ReadReady";当请求准备好了,但我认为没有发出请求时,控制台中也没有任何内容。


[编辑1]这个叫工人什么

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

这是一个编辑字段(用户应该在其中键入代码


[编辑2]

我删除了所有的应用程序代码并这样做:

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

它奏效了。。。为什么在更改"编辑"文本时调用它时不起作用?

还记得范围、生命周期和局部变量的概念吗?在您的情况下,worker是一个将立即销毁的本地变量,因此不会调用插槽,请使用

Worker * worker = new Worker; 
worker->get("abc"); //remember to delete the memory when you no longer use it

最新更新