2014-01-30 122 views
0

我得到了信號和插槽的問題,當我從主函數調用test()函數時,信號和插槽不工作(它們不是調用),但是當我在main函數中直接調用test()中的代碼,調用signal和slots!我做錯了什麼? 第二個問題,有什麼方法可以返回響應嗎?我需要在頁面上找到一些東西。Qt信號插槽不被調用

的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(); 
}; 
+0

你是什麼意思的「有什麼方法可以返回響應?」? 。因爲在你的插槽replyFinished答覆指針是響應。您也可能想通過此:http://stackoverflow.com/questions/1053099/how-can-i-get-content-of-web-page – Metoo

+0

不要忘記處理錯誤。 –

回答

1

您的對象「管理器」在test()函數完成後立即銷燬。爲了避免這種嘗試動態創建對象:

httpManager *manager; 

void test() 
{ 
    manager = new httpManager(); 
    manager->sendRequest("http://google.com/"); 
} 

注意「httpManager * manager」在任何函數之外。

現在,您的「manager」對象位於內存中的某個地方(稱爲堆),並且在test()函數退出時不會被銷燬。 請注意,這種方法不太好,因爲「manager」現在是全局變量,這在面向對象編程中並不是很好的方式,但第一次它並不重要。

2

第一個代碼的問題是,在調用函數「test()」之後,堆棧上創建了一個類型爲「httpManager」的對象「manager」,並在test()返回時分別被銷燬。因此,當「test()」返回並且信號和插槽不工作時,沒有「經理」對象。而在後面的代碼中,「manager」存在直到應用程序終止。