Qt SQL类对比:用餐厅管理系统来理解

        我用一个餐厅管理系统的例子,帮你形象化理解这几个类的区别和使用场景。

一. 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智能点餐系统能理解菜品和分类的关系顾客点餐界面、带分类的商品管理

六. 什么时候用哪个?

  1. 当你要...

    • 执行任意SQL语句:用QSqlQuery(比如创建备份、复杂统计)

    • 只读显示数据:用QSqlQueryModel(比如显示报表)

    • 单表编辑:用QSqlTableModel(比如管理员工信息)

    • 处理关联表:用QSqlRelationalTableModel(比如订单关联客户)

  2. 实际应用示例:

    收银系统
    • 用QSqlQueryModel显示今日销售统计

    • 用QSqlTableModel管理会员信息

    • 用QSqlQuery提交订单和更新库存

    • 用QSqlRelationalTableModel显示带分类的菜单

        记住:就像餐厅里这些岗位会协作一样,你的程序也可以混合使用这些类!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值