未调用 Qt 信号槽

Posted

技术标签:

【中文标题】未调用 Qt 信号槽【英文标题】:Qt Signal Slots are not invoked 【发布时间】:2014-01-30 00:48:58 【问题描述】:

我遇到了信号和插槽问题,当我从主函数调用 test() 函数时,信号和插槽不起作用(它们没有调用),但是当我从 test() 调用代码时直接在 main 函数中,调用信号和槽!我做错了什么? 第二个问题,有没有办法返回响应?我需要在页面上找到一些东西。

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();
;

【问题讨论】:

“有什么办法可以返回响应”是什么意思? .因为在您的插槽replyFinished 中,回复指针是响应。您可能还想通过这个:***.com/questions/1053099/… 别忘了处理错误。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

httpManager *manager;

void test()

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

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

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

【讨论】:

以上是关于未调用 Qt 信号槽的主要内容,如果未能解决你的问题,请参考以下文章

Qt源码阅读 信号槽的连接与调用

Qt信号槽原理(链接)

QT信号槽实现原理

Qt高级——Qt信号槽机制源码解析

有啥好方法可以快速触发 Qt 中的信号槽吗?

QT 信号和槽函数签名