QT笔记
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 | QSqlQuery query(database); |
创建一个数据库查询对象 query。(database)指定这个查询是在哪个数据库连接上进行的
.prepare是进行占位,防止字符串拼接产生的SQL注入
如:1
2
3
4
5
6
7
8
9QString 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,否则返回false1
2
3
4
5
6
7if (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,即成功删除订单如何如何





