發生了什麼事情的快速概覽:我想使用Qt的QNetworkAccessManager
做一個GET請求,但我的QObject::connect(..)
函數上的回調函數沒有被調用。我的問題是我可以從一個對象調用QObject::connect
,但連接到另一個對象的一個插槽(因爲我有一個指向對象和插槽的指針) - 請參閱下面的更多細節。C++ - Qt QObject ::連接GET請求使用各類
我最終的目標是發佈數據(因爲它是一個登錄函數),我有POST請求代碼,最終遭受同樣的問題 - 回調函數沒有被調用。所以我希望能夠首先做一個簡單的GET請求,一旦我有了,我想我會從那裏自行處理。
我目前有一個QMainWindow LoginWindow
,帶有一個按鈕,它在LoginWindow類中調用了一個槽doLogin()
。這一切都如你所願。 LoginWindow也有一個public slots
函數,稱爲loginResponse(QNetworkReply* response)
。
//---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";
}
接下來我還有一個類中,MyProduct
命名空間下,所謂的Network
。正如你在上面看到的,Network
有一個叫做login的函數。那就是:
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);
}
這裏的目標是建立在我的Network
類的登錄功能,可用於連接任意數量的窗口(因爲用戶可以從多個地方登錄)。但我沒有收到任何迴應 - LoginWindow::loginResponse
未運行。
我在控制檯中看到「正在登錄...」和「正在登錄數據」輸出,但沒有顯示「登錄完成」。
任何人都可以請指點我在正確的方向或告訴我我瘋了,或者這是一個壞主意?
在此先感謝!
就是這樣! 'nam'只在本地範圍內,並且在請求返回之前被銷燬。非常感謝你。我現在正在考慮爲我的網絡課程製作自己的信號。 – Jace