c++ Qt信号和插槽在QObject内部不工作

snz8szmq  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(127)

我试图在服务器上为我的API创建一个客户端类,但我的插槽在请求后不起作用。connect函数返回true,这应该意味着signal和slot相互连接。
header file

#ifndef QRESTCLIENT_H
#define QRESTCLIENT_H

#include <QObject>
#include <QUrl>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>

class QRestClient : public QObject
{
    Q_OBJECT
public:
    explicit QRestClient(QUrl root_url, QObject *parent = nullptr);
    bool ping();

private:
    QUrl root_url;

private slots:
    void ping_finished(QNetworkReply * response);

};

#endif // QRESTCLIENT_H

cpp file

#include "qrestclient.h"

QRestClient::QRestClient(QUrl root_url, QObject *parent)
    : QObject{parent}
{
    this->root_url = root_url;
}

void QRestClient::ping_finished(QNetworkReply * response) {
    qDebug() << "It is here 3";
    qDebug() << response->readAll();
};

bool QRestClient::ping()
{
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    qDebug() << connect(manager, &QNetworkAccessManager::finished,
            this, &QRestClient::ping_finished);

    qDebug() << "It is here 1";
    manager->get(QNetworkRequest(this->root_url));
    qDebug() << "It is here 2";
    return true;
};

我试着在mainwindow.cpp文件中写同样的东西,它就像它应该的那样工作。对于来自我的类的ping()函数的请求,我在服务器日志中没有看到任何请求。如果mainwindow.cpp的所有内容都相同,我会在日志中看到请求。问题是什么,为什么不发送请求?

gc0ot86w

gc0ot86w1#

正如@Botje所说,问题是QRestClient对象在调用代码结束时被销毁,然后才得到响应。解决方案是将其放在调用类的私有属性中。

相关问题