[英]Qt Signal Slots are not invoked
我從主函數調用test()函數時遇到信號和插槽問題,信號和插槽不起作用(它們沒有調用),但是當我直接在main中從test()調用代碼時功能,信號和插槽正在調用! 我做錯了什么? 第二個問題,有什么辦法可以返回答復嗎? 我需要在頁面上找到一些東西。
main.cpp
void test()
{
httpManager manager;
manager.sendRequest("http://google.com/");
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MfzBot w;
w.show();
test();
return a.exec();
}
工作main.cpp:
void test()
{
httpManager manager;
manager.sendRequest("http://google.com/");
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MfzBot w;
w.show();
httpManager manager;
manager.sendRequest("http://google.com/");
return a.exec();
}
httpmanager.cpp:
httpManager::httpManager()
{
QObject::connect(manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
}
QNetworkCookieJar cookies;
void httpManager::sendRequest(const char* url)
{
QNetworkProxyFactory::setUseSystemConfiguration (true);
QByteArray outArray;
QDataStream stream(&outArray, QIODevice::WriteOnly);
manager->setCookieJar(cookies);
QNetworkRequest request(QUrl(url));
manager->post(request, outArray);
}
void httpManager::replyFinished(QNetworkReply *reply)
{
qDebug() << "ok! ";
qDebug() << reply->readAll();
}
httpmanager.h:
class httpManager : public QObject
{
Q_OBJECT
public:
httpManager();
protected slots:
void replyFinished(QNetworkReply *reply);
public:
void sendRequest(const char *url);
private:
QNetworkCookieJar *cookies = new QNetworkCookieJar();
QNetworkAccessManager *manager = new QNetworkAccessManager();
};
第一個代碼的問題是,在調用函數“ test()”之后在堆棧上創建了類型為“ httpManager”的對象“ manager”,並在返回test()時將其銷毀。 因此,當“ test()”返回並且信號和插槽不起作用時,就沒有“ manager”對象。 在后面的代碼中,“ manager”存在,直到應用程序終止。
在test()函數完成后,您的對象“ manager”將被銷毀。 為了避免這種情況,請嘗試動態創建對象:
httpManager *manager;
void test()
{
manager = new httpManager();
manager->sendRequest("http://google.com/");
}
請注意,“ httpManager * manager”在任何函數之外。
現在,您的“經理”對象位於內存中的某個位置(稱為堆),並且在test()函數退出時不會被銷毀。 當心,這種方法不是很好,因為“ manager”現在是全局變量,這在面向對象編程中不是一種好方法,但是第一次沒有關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.