簡體   English   中英

Qt信號槽不被調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM