2012-04-25 22 views
1

功能我想知道如何從SocketTest類調​​用函數Do_Download() outisde的的main()函數。 第一cTest.Do_Download()沒有工作,但是當我打電話測試()功能,csTest.Do_Download()不起作用。QT和C++:不能叫外面的main()函數

所以看起來我只能從的main()函數裏面存取權限SocketTest,而不是從其它任何功能。

有人知道如何解決這個問題嗎? 謝謝!

main.cpp中:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 

    SocketTest cTest; 
     cTest.Do_Download(); 

    return a.exec(); 
} 


void test() 
{ 
    qDebug() << "test main functie"; 

    SocketTest csTest; 
     csTest.Do_Download(); 
} 

SocketTest.h:

#ifndef SOCKETTEST_H 
#define SOCKETTEST_H 

#include <QObject> 
#include <QTcpSocket> 
#include <QDebug> 
#include <QHttp> 
#include <QFile> 
#include <QString> 

class SocketTest : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit SocketTest(QObject *parent = 0); 


    void Do_Download(); 
signals: 

public slots: 

    void stateChanged (int state); 
    void responseHeaderReceived (const QHttpResponseHeader & resp); 
    void requestFinished (int id, bool error); 

private: 
    QTcpSocket *socket; 
    QHttp *http; 
    QHttp *http2; 

}; 

#endif // SOCKETTEST_H 
+0

我沒有看到你從main調用'test'函數嗎? – Mahesh 2012-04-25 15:12:08

+1

你什麼時候調用'test()'?事件循環可能需要運行。在不相關的說明中,不推薦使用'QHttp'。如果可能的話,你應該使用'QNetworkAccessManager'。 – 2012-04-25 15:12:29

+0

我在mainwindow.cpp中調用test()。應用程序輸出調試消息,所以我確定test()函數正在運行。 – 2012-04-25 15:23:21

回答

3

如果您DoDownload功能是異步做任何事情(可能與Qt的網絡類打交道時),在SocketTest你在test()創建之前,它可以根據任何返回值進行銷燬。

它在main()中工作,因爲事件循環開始並且SocketTest實例掛起。

+0

感謝您的回答!對於我,這說得通。你知道如何防止test()被快速破壞嗎?然後我可以測試它,看看它是否有效。 – 2012-04-25 16:19:34

+0

您將創建一個'SocketTest' *指針*。然後你必須擔心在完成後刪除它。如果'test'是類的一部分,你可以使指針成爲類的成員,並在類的析構函數中刪除它。否則,你可能可以像'requestFinished'插槽那樣做。 – 2012-04-25 17:01:20

+0

非常感謝你!那就是訣竅:D – 2012-04-25 21:23:11