不调用Qt信号槽

时间:2014-01-30 00:48:59

标签: c++ qt qt5 signals-slots qnetworkaccessmanager

我遇到信号和插槽的问题,当我从main函数调用test()函数时,信号和插槽不工作(它们没有调用),但是当我从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();
};

2 个答案:

答案 0 :(得分:2)

第一个代码的问题是,在调用函数“test()”之后,在堆栈上创建了具有“httpManager”类型的对象“manager”,并且当test()返回时分别被销毁。因此,当“test()”返回并且信号和插槽不起作用时,没有“管理器”对象。而在后一种代码中,“manager”一直存在,直到应用程序终止。

答案 1 :(得分:1)

您的对象“manager”在test()函数完成后立即销毁。为避免这种情况,请尝试动态创建对象:

httpManager *manager;

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

请注意,“httpManager * manager”不在任何函数之内。

现在,您的“manager”对象位于内存中的某个位置(称为堆),并且在test()函数退出时不会被销毁。 请注意,这种方法不太好,因为“manager”现在是全局变量,这在面向对象编程中并不好,但是第一次没关系。