Qt4.1中QHttp::requestFinished信号槽连接成功但槽函数未触发问题
问题分析与解决
核心问题:信号连接晚于请求发送
你在构造函数里先调用http->request(header)发起请求,之后才执行connect绑定信号槽。此时请求可能已同步完成(或信号已发出),但槽函数还未完成绑定,自然接收不到requestFinished信号。
修复步骤
调整顺序:先绑定信号槽,再发起请求
将connect代码移到request调用之前,确保信号槽在请求发送前完成绑定:Status::Status() { QHttp *http = new QHttp("plaza.one"); // 先绑定信号槽 bool what = QObject::connect(http, SIGNAL(requestFinished(int, bool)), this, SLOT(onRequestFinished(int, bool))); std::cout << what << std::endl; // 再构造请求并发送 QHttpRequestHeader header("GET", "/status"); header.setValue("Host", "plaza.one"); http->request(header); }保障QHttp对象的生命周期
你用new创建的QHttp对象未设置父对象,也未作为类成员保存。若请求完成前http对象意外销毁,会导致槽无法触发。建议将QHttp *http设为Status类的成员变量,或设置父对象为this:// 在Status类的private成员中添加: QHttp *m_http; // 构造函数中修改: m_http = new QHttp("plaza.one", this); // 设置父对象为this,由Qt自动管理内存确认事件循环正常运行
Qt信号槽依赖事件循环,确保程序主函数中存在QApplication::exec()调用,否则事件无法分发,槽函数不会被触发。
额外提示
Qt4.1的QHttp属于老旧类,使用时注意:
- 处理请求错误可通过
QHttp::error()获取错误类型 - 读取响应内容可在
onRequestFinished中调用http->readAll()获取返回数据
内容的提问来源于stack exchange,提问作者ioi-xd
相关产品推荐
相关产品推荐

