我用一个餐厅管理系统的例子,帮你形象化理解这几个类的区别和使用场景。
一. QSqlQuery - 餐厅的万能服务员
角色:就像餐厅里最全能的服务员,什么活都能干。
特点:
-
能执行任何SQL语句
-
需要自己处理结果
-
最灵活但也最麻烦
场景:老板需要复杂统计报表时
// 查询今日最受欢迎的菜品和销售额
QSqlQuery query;
query.exec("SELECT dish_name, COUNT(*) as order_count, SUM(price) as total "
"FROM orders WHERE date = CURRENT_DATE "
"GROUP BY dish_name ORDER BY order_count DESC LIMIT 5");
while (query.next()) {
qDebug() << "菜品:" << query.value("dish_name").toString()
<< "| 订单数:" << query.value("order_count").toInt()
<< "| 总销售额:" << query.value("total").toFloat();
}
二. QSqlQueryModel - 餐厅的电子菜单屏
角色:像挂在墙上的电子菜单显示屏,只能看不能改
特点:
-
只读数据显示
-
可以显示任何查询结果
-
直接绑定到视图组件
场景:在收银台显示今日特价菜
QSqlQueryModel *specialsModel = new QSqlQueryModel;
specialsModel->setQuery("SELECT dish_name, price FROM dishes WHERE is_special = 1");
// 在收银台的副屏显示
QTableView *specialsView = new QTableView;
specialsView->setModel(specialsModel);
三. QSqlTableModel - 餐厅的库存管理系统
角色:像库存管理员,专门管理一个仓库(表)
特点:
-
专门管理单个表
-
支持增删改查
-
自动生成基本SQL
场景:管理食材库存
QSqlTableModel *inventoryModel = new QSqlTableModel;
inventoryModel->setTable("inventory");
inventoryModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
// 设置友好表头
inventoryModel->setHeaderData(0, Qt::Horizontal, "食材ID");
inventoryModel->setHeaderData(1, Qt::Horizontal, "食材名称");
inventoryModel->setHeaderData(2, Qt::Horizontal, "库存量");
// 绑定到库存管理界面
ui->inventoryTableView->setModel(inventoryModel);
// 添加新食材
QSqlRecord newRecord = inventoryModel->record();
newRecord.setValue("name", "新鲜三文鱼");
newRecord.setValue("quantity", 50);
inventoryModel->insertRecord(-1, newRecord);
四. QSqlRelationalTableModel - 餐厅的点餐系统
角色:像智能点餐系统,能自动关联菜品和分类
特点:
-
处理有关联关系的表
-
自动显示关联表信息(如显示分类名而非ID)
-
支持带关系的编辑
场景:顾客点餐界面
QSqlRelationalTableModel *menuModel = new QSqlRelationalTableModel;
menuModel->setTable("dishes");
// 设置关系:将category_id显示为categories表的category_name
menuModel->setRelation(2, QSqlRelation("categories", "id", "category_name"));
// 只显示在售菜品
menuModel->setFilter("is_available = 1");
menuModel->select();
// 在点餐平板上显示
QTableView *menuView = new QTableView;
menuView->setModel(menuModel);
// 对分类字段使用下拉框
menuView->setItemDelegate(new QSqlRelationalDelegate(menuView));
五. 对比总结:餐厅的不同岗位
类 | 餐厅岗位比喻 | 工作特点 | 典型任务举例 |
---|---|---|---|
QSqlQuery | 全能服务员 | 什么都能做,但比较累 | 复杂报表、数据导入导出 |
QSqlQueryModel | 电子菜单屏 | 只能展示信息,不能交互 | 显示今日特价、畅销榜 |
QSqlTableModel | 库存管理员 | 专门管理一个仓库,可以增删改查 | 食材库存管理、员工信息管理 |
QSqlRelationalTableModel | 智能点餐系统 | 能理解菜品和分类的关系 | 顾客点餐界面、带分类的商品管理 |
六. 什么时候用哪个?
-
当你要...
-
执行任意SQL语句:用QSqlQuery(比如创建备份、复杂统计)
-
只读显示数据:用QSqlQueryModel(比如显示报表)
-
单表编辑:用QSqlTableModel(比如管理员工信息)
-
处理关联表:用QSqlRelationalTableModel(比如订单关联客户)
-
-
实际应用示例:
收银系统:-
用QSqlQueryModel显示今日销售统计
-
用QSqlTableModel管理会员信息
-
用QSqlQuery提交订单和更新库存
-
用QSqlRelationalTableModel显示带分类的菜单
-
记住:就像餐厅里这些岗位会协作一样,你的程序也可以混合使用这些类!