Qt5中如何传递自定义QDialog子类给QObject子类?代码报错解决
Qt项目中JsonPostSender构造函数不匹配错误分析与修复
错误原因
- 成员函数指针与普通函数指针类型不兼容:JsonPostSender构造函数的第四个参数定义为普通函数指针
void (*finishFunc)(QJsonObject),但传入的&loginForm::onPostFinish是类成员函数指针。成员函数必须依赖类实例才能调用,二者类型无法匹配,这是核心错误。 - 参数隐式转换与拼写问题:构造函数第二个参数要求
QUrl类型,传入的字符串字面量虽能隐式转换,但显式转换更稳妥;另外json["passord"]存在拼写错误,应为password,会导致后端无法正确接收密码参数。
修复方案
步骤1:重构JsonPostSender类,改用Qt信号槽处理回调
修改JsonPostSender.h:
#include <QObject> #include <qnetworkaccessmanager.h> #include <qjsonobject.h> class JsonPostSender : public QObject { Q_OBJECT public: // 移除函数指针参数 JsonPostSender(QObject* parent, QUrl url, QJsonObject json); void sendPost(); void onFinish(QNetworkReply* reply); ~JsonPostSender(); signals: // 添加finished信号,用于传递回调结果 void finished(QJsonObject result); private: QNetworkAccessManager mgr; QUrl url; QJsonObject json; // 移除原函数指针成员 };
修改JsonPostSender.cpp中的构造函数和onFinish方法:
#include "JsonPostSender.h" #include <qnetworkaccessmanager.h> #include <qnetworkreply.h> #include <qnetworkrequest.h> #include <qjsondocument.h> // 构造函数移除函数指针参数 JsonPostSender::JsonPostSender(QObject *parent, QUrl url, QJsonObject json) : QObject(parent), url(url), json(json) { connect(&mgr, &QNetworkAccessManager::finished, this, &JsonPostSender::onFinish); } void JsonPostSender::sendPost() { QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); QJsonDocument doc(json); QByteArray data = doc.toJson(); QNetworkReply* reply = mgr.post(request, data); } void JsonPostSender::onFinish(QNetworkReply *reply) { qDebug() << "Finished"; QJsonObject json = QJsonDocument::fromJson(reply->readAll()).object(); // 发射finished信号替代直接调用函数指针 emit finished(json); reply->deleteLater(); // 释放网络回复资源 } JsonPostSender::~JsonPostSender() {}
步骤2:修改loginForm中的调用逻辑
修正loginForm.cpp的tryLogin方法,修复拼写错误并改用信号槽连接:
void loginForm::tryLogin() { QJsonObject json; json["login"] = ui.loginInp->text(); json["password"] = ui.passwordInp->text(); // 修正passord拼写错误 // 用new创建对象(避免局部对象提前销毁),显式转换字符串为QUrl JsonPostSender* sender = new JsonPostSender(this, QUrl("http://localhost:8301/api/get_token"), json); // 连接sender的finished信号到当前窗口的onPostFinish槽 connect(sender, &JsonPostSender::finished, this, &loginForm::onPostFinish); // 发送请求 sender->sendPost(); }
额外说明
- 使用
new创建JsonPostSender时,因为将this作为父对象,Qt的对象树机制会自动管理其内存,无需手动delete。 - 调用
reply->deleteLater()确保网络回复资源被正确释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者medveed
相关产品推荐
相关产品推荐

