QT类机制解析

新建一个QT类后,会自动生成三个文件classA.ui, classA.h, classA.cpp

其中,.ui文件是可视化的ui设计文件。在构建项目时,.ui文件以xml文件的形式被读取,向classA中写入各种控件指针和setupUi函数。

所以可以看到,QT提供的代码中可以通过ui->setupUi(this)为当前对象写入各种控件

槽机制:命名对应

QT槽机制是通过Q_OBJECT宏实现的,这个宏会根据命名匹配的规则,自动匹配控件名和信号到对应的函数上。
on_loginButton_clicked()就是实现在loginButton控件上发出clicked信号后应该实现的函数。

QHTTP

QT路由注册

Qt 官方要求:
QHttpServer 的路由函数必须传 free-function 或 lambda,不允许传成员函数指针。

因此模板推导会失败,引发你看到的巨量错误:

'operator()' is not a member of 'QHttpServerResponse (FlightsApi::*)(...)' ArgumentCount is not a member of ... ReturnType is not a member of ...


解决方案:改成 lambda 包装成员函数

把你的路由注册改写成:

m_httpServer.route("/api/flights", QHttpServerRequest::Method::Get, [this](const QHttpServerRequest &request) { return this->handleGetFlights(request); } );

如果你还有 POST 或其他路由,也改成同样格式:

m_httpServer.route("/api/flights", QHttpServerRequest::Method::Post, [this](const QHttpServerRequest &request) { return this->handlePostFlights(request); } );

404 的路由:

m_httpServer.route("/<arg>", QHttpServerRequest::Method::Get, [this](const QHttpServerRequest &request) { return this->handleNotFound(request); } );

QHttp状态码

在 Qt 6 的 QHttpServer 模块中,HTTP 状态码是C++ 枚举类。

  • 完整类型名QHttpServerResponse::StatusCode
  • 特点:类型安全,使用时需带上作用域

常用状态码速查:

✅ 2xx 成功 (Success)

含义:服务器成功接收、理解并处理了请求。

枚举值 (StatusCode::) 数字 含义 典型应用场景
Ok 200 成功 最通用的成功状态。用于 GET 获取数据或普通操作成功。
Created 201 已创建 用于 POST 请求成功创建了新资源(如用户注册成功、添加新航班)。
Accepted 202 已接受 请求已收到,但处理尚未完成(常用于耗时的异步任务)。
NoContent 204 无内容 请求成功,但响应体为空(如 DELETE 删除成功后不需要返回数据)。

⚠️ 4xx 客户端错误 (Client Error)

含义:请求包含错误语法或不能完成(通常是前端/用户的锅)。

枚举值 (StatusCode::) 数字 含义 典型应用场景
BadRequest 400 错误请求 请求参数缺失、JSON 格式错误、类型不匹配。
Unauthorized 401 未授权 用户未登录,或 Token 过期/无效。
Forbidden 403 禁止访问 已登录,但权限不足(如普通用户尝试删除管理员数据)。
NotFound 404 未找到 请求的 URL 路径错误,或查询的 ID 在数据库不存在。
MethodNotAllowed 405 方法禁用 接口只允许 POST,但客户端发送了 GET。
Conflict 409 冲突 资源状态冲突(最常用:注册时用户名已存在)。

❌ 5xx 服务端错误 (Server Error)

含义:服务器在处理请求时发生了错误(通常是后端/数据库的锅)。

枚举值 (StatusCode::) 数字 含义 典型应用场景
InternalServerError 500 内部错误 代码抛出异常、空指针、数据库连接失败等未捕获错误。
NotImplemented 501 未实现 接口已定义,但功能尚未开发完成。
ServiceUnavailable 503 服务不可用 服务器超载或正在停机维护。

QJSON

常见代码解释:

1
!jsonDoc.isObject()

判断这个QJsonDocument 类型的变量是不是一个有键值对的JSON对象,有可能是空值或者是数值等等,这样调用键值对就会报错

QSQL

1
2
3
4
5
6
7
8
9
QSqlQuery query(database);
query.prepare("SELECT U_ID, name, telephone, email, photo FROM users WHERE name = ? AND password = ?");
query.addBindValue(username);
query.addBindValue(password);

if (!query.exec()) {
qWarning() << "Login SQL Error:" << query.lastError().text();
return QHttpServerResponse(QHttpServerResponse::StatusCode::InternalServerError);
}

创建一个数据库查询对象 query(database)指定这个查询是在哪个数据库连接上进行的

.prepare是进行占位,防止字符串拼接产生的SQL注入

如:

1
2
3
4
5
6
7
8
9
QString sql = "SELECT * FROM users WHERE name = '" + username + "'";
query.exec(sql);

如果黑客在输入框里输入了这样一段话: `' OR '1'='1`
程序拼接出来的 SQL 就变成了:

SELECT * FROM users WHERE name = '' OR '1'='1'

全部用户数据将被输出

.addBindValue是在按顺序绑定值到”?”中

query.exec()是执行查询的函数,会执行上面指定的查询,查询成功返回Ture,否则返回false

1
2
3
4
5
6
7
if (query.numRowsAffected() > 0) {
QJsonObject success; success["status"] = "success"; success["message"] = "订单已取消";
return QHttpServerResponse(success, QHttpServerResponse::StatusCode::Ok);
} else {
QJsonObject fail; fail["status"] = "failed"; fail["message"] = "订单不存在或无权操作";
return QHttpServerResponse(fail, QHttpServerResponse::StatusCode::NotFound);
}

query.numRowsAffected() > 0的意思是如果受影响的行数大于0,即成功删除订单如何如何