2012-04-25 23 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