You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 10:07:47