C++ C++;-Qt QObject::跨类连接获取请求使用情况

C++ C++;-Qt QObject::跨类连接获取请求使用情况,c++,qt,qtnetwork,C++,Qt,Qtnetwork,快速概述所发生的情况:我正在尝试使用Qt的QNetworkAccessManager执行GET请求,但是没有调用我的QObject::connect(…)函数上的回调函数。我的问题是,我可以从一个对象调用QObject::connect,但可以连接到另一个对象的插槽(假设我有一个指向该对象和插槽的指针)-有关详细信息,请参见下文 我的最终目标是发布数据(因为它是一个登录函数),我的POST请求代码最终也遇到了同样的问题——没有调用回调函数。所以我希望能够先做一个简单的GET请求,一旦我有了它,我

快速概述所发生的情况:我正在尝试使用Qt的
QNetworkAccessManager
执行GET请求,但是没有调用我的
QObject::connect(…)
函数上的回调函数。我的问题是,我可以从一个对象调用
QObject::connect
,但可以连接到另一个对象的插槽(假设我有一个指向该对象和插槽的指针)-有关详细信息,请参见下文

我的最终目标是发布数据(因为它是一个登录函数),我的POST请求代码最终也遇到了同样的问题——没有调用回调函数。所以我希望能够先做一个简单的GET请求,一旦我有了它,我想我自己就可以了

我目前有一个QMainWindow
LoginWindow
,其中有一个按钮可以调用LoginWindow类中的slot
doLogin()
。这一切都如你所料。LoginWindow还有一个名为
loginResponse(QNetworkReply*response)
public slots
函数

这里的目标是在my
Network
类中创建一个登录函数,该函数可以在任意数量的窗口中使用和连接(因为用户可以从多个位置登录)。但是我没有得到响应-
LoginWindow::loginResponse
没有运行

我在控制台中看到“登录…”和“发布登录数据”输出,但没有看到“登录完成”

谁能告诉我正确的方向,或者告诉我我疯了,或者这是个坏主意


提前谢谢

请注意
QNetworkAccessManager
是异步操作的。
get()
方法在网络运行时不阻塞;它立即返回。(有关更多信息,请参阅文档的一节。)

这是典型的Qt网络相关API,因为您通常不希望应用程序在等待数据通过网络移动时冻结

这意味着您的实例,
nam
,没有足够长的活动时间,GET请求无法实际完成。调用
login()
后,会立即删除
Product::Network
类的实例,因为它是在堆栈上分配的。虽然我看不到代码,但我猜它也会清理
QNetworkAccessManager

如果延长
网络
对象的生存期,您可能会发现插槽最终将被调用



此外,这更多是一个偏好问题,但我认为避免将接收器和插槽传递给
login()
函数会更简洁。我建议您在
网络
类中声明自己的信号作为其API的一部分,并连接到
登录窗口
类中的信号。

就是这样
nam
仅在本地范围内,并且在请求返回之前已被销毁。非常感谢你。我现在正在考虑为我的网络课程制作自己的信号。
//---LoginWindow.h

...

public slots:
    void doLogin();
    void loginResponse(QNetworkReply* response)

...

//---LoginWindow.cpp

LoginWindow::LoginWindow(QWidget *parent) :
    QMainWindow(parent),
ui(new Ui::LoginWindow)
{
    ui->setupUi(this);
    ui->username_le->setFocus();
}

void LoginWindow::doLogin()
{
   MyProduct::Network network(this);
    qDebug() << "Logging in...";

    //Here I call network.login from LoginWindow and pass 
    //references to the Slot I want to use and the LoginWindow itself
    network.login(
        ui->username_le->text(), //username
        ui->password_le->text(), //password
        this,                    //reference to this object (LoginWindow*)
        SLOT(loginResponse(QNetworkReply*)) //loginResponse slot
    );
}

void LoginWindow::loginResponse(QNetworkReply* response)
{
    qDebug() << "Log in complete";
}
void MyProduct::Network login(QString username, QString password, QObject *receiver, const char *slot)
{
    QNetworkRequest request(QUrl(API_ROOT + LOGIN_PATH)); //"http://localhost/basic/login.php"
    request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");

    //nam = QNetworkAccessManager* declared in the constructor
    QObject::connect(nam,SIGNAL(finished(QNetworkReply*)), receiver, slot);

    qDebug() << "Posting login data...";
    nam->get(request);
}