我正在嘗試在此視頻 ( https://youtu.be/G06jT3X3H9E )之后使用 QNetworkRequest 從 API 獲取一些資料
我有一個在 localhost:3000 上運行的 RoR 服務器,我正在嘗試從中獲取一些東西。
.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();
}
它起作用了......為什么在更改編輯文本時呼叫它不起作用?
uj5u.com熱心網友回復:
還記得作用域、生命周期和區域變數的概念嗎?在您的案例作業者是一個區域變數,它將立即被銷毀,因此不會呼叫該插槽,請使用
Worker * worker = new Worker;
worker->get("abc"); //remember to delete the memory when you no longer use it
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/395707.html
上一篇:在我的情況下,anchor.centerIn沒有按預期作業
下一篇:添加按鈕以動態查看現有視圖
