Bootstrap

汽车管理系统——级联下拉框

加载某厂家对应的品牌名

创建一个数据库只读模型

QSqlQueryModel *model = new QSqlQueryModel(this);
model->setQuery(QString("select name from brand where factory='%1'").arg(arg1));

Qsqlmodel *a=new Qsqlmodel()
a.xxx(“select name from brand”)
ui->xxx

setQuery()

在英文中,query 的意思是“查询”或“询问”。具体来说,query 可以有以下几种含义:

  1. 询问(Ask a question):

    • 作为名词时,表示向某人提出的问题或疑问。例如:
      • I have a query about your services.(我对你们的服务有个疑问。)
    • 作为动词时,表示询问某事或质疑某事。例如:
      • He queried the accuracy of the report.(他质疑了报告的准确性。)
  2. 查询(Request for information from a database or system):

    • 在计算机科学中,query 常用来指向数据库或系统请求信息的操作。例如:
      • The program sent a query to the database to retrieve user data.(程序向数据库发送查询以检索用户数据。)
 ui->sellBrandComboBox->setModel(model);

connect(ui,signal(),this,slot(on_()))

在这里插入图片描述
combox是有索引的

为什么要ui->sellBrandComboBox->setEnabled(true);

你可能希望在某些情况下禁用控件(例如当某些条件未满足时),而在其他条件满足后再启用它。比如,如果用户没有选择某个商品类型,品牌选择框可能是禁用的,只有当用户选择了商品类型后,才启用品牌选择框。
部分控件一开始是禁用的
在这里插入图片描述

典型使用场景:
这段代码的组合很常见于级联下拉框的场景中。比如,当用户选择了一个工厂时,程序会根据选择的工厂来动态加载对应的品牌列表。
在用户更改工厂选择时,品牌的选项需要刷新,因此:
首先将工厂下拉框选定为默认的第一个工厂(setCurrentIndex(0))。
然后清空品牌下拉框中的旧选项(clear()),以便之后加载新的品牌选项。

级联下拉框

级联下拉框(Cascading ComboBox)是一种用户界面设计模式,其中一个下拉框(ComboBox)的选项会根据另一个下拉框的选择动态更新。例如,用户首先选择一个“工厂”,然后根据该工厂的选择,第二个下拉框“品牌”会显示该工厂下对应的品牌。这样的设计能够根据前一个选择来限制和更新后一个下拉框中的选项,以增强用户体验。

级联下拉框的工作原理:

  1. 主下拉框(如“工厂”):用户从此下拉框中选择一个选项。
  2. 从属下拉框(如“品牌”):根据主下拉框中的选择,从属下拉框的选项会发生变化。
    • 当用户更改主下拉框的值时,从属下拉框的内容被清空并根据新的选择填充新的选项。

级联下拉框的常见场景:

  • 地区选择:先选择国家,然后根据国家显示对应的省/州,再根据省/州显示对应的城市。
  • 分类选择:先选择商品类别,然后根据类别显示具体的产品。
  • 品牌与型号:先选择品牌,再显示该品牌下的可用型号。

如何加载品牌下对应的报价和数量?

 ui->sellNumSpinBox->setValue(0);
 ui->sellNumSpinBox->setEnabled(false);

在这里插入图片描述
先将这个数字调节框设置为0 ,因为这是用户想要卖出的数量

ui->sellSumLineEdit->clear();
ui->sellSumLineEdit->setEnabled(false);

在这里插入图片描述

为什么要先进行这些清空的步骤?

这几行代码是对用户界面进行初始化设置,目的是保证界面在用户进行操作之前处于一种安全且合理的状态,避免因误操作或不完整的数据导致的问题。一般情况下,这些控件会根据用户在界面上的后续操作(如选择了某个商品或输入了某些数据)逐步被启用和更新

典型场景:
用户还没有选择商品或输入数量时,所有与购买相关的控件(数量、总金额、确认按钮)都应该禁用。
只有当用户选择了商品后,才会启用数量选择框;输入了数量后,程序会计算并更新总金额,并启用确认按钮供用户提交。

 ui->sellOkBtn->setEnabled(false);

在这里插入图片描述

先将上两个框设置为禁用
ui->combox->setenable(false);

数据只读模型
QSqlquerymodel *a=new QSqlquerymodel(this);
a->setQuery(Qstring(“select price from brand where brand==(arg)”).arg(agr1));
ui->pricelineedit->setmodel(a);
数量同

QSqlQuery query;
query.exec(QString("select price from brand where name='%1' and factory='%2'").arg(arg1).arg(ui->sellFactoryComboBox->currentText()));

为什么这边不用QSqlQueryModel

在这段代码中,没有使用 QSqlQueryModel 而是直接使用 QSqlQuery 来从数据库中查询数据,主要是因为查询的目的是获取单一结果(价格信息)并将其显示在 QLineEdit 中,而不是将数据展示在需要多条记录的控件(例如 QTableViewQComboBox)中。

让我们详细解释为什么这里选择了 QSqlQuery 而不是 QSqlQueryModel

  1. QSqlQuery 的使用场景
  • QSqlQuery 适用于执行单一查询操作,并且直接处理查询结果。它允许执行任意的 SQL 语句(例如 SELECTINSERTUPDATEDELETE)。
  • 由于这里的查询返回的是特定条件下的单个结果(商品的价格),使用 QSqlQuery 更加简单直接。
  • query.next() 用于遍历查询结果。如果查询成功,它会将指针移动到结果集的下一行,这里实际上只期望获取第一行数据即可。
  1. QSqlQueryModel 的使用场景
  • QSqlQueryModel 是一种数据模型,主要用于为视图类(如 QTableViewQListView)提供数据支持。它通常用于显示多行多列的表格数据
  • QSqlQueryModel 的优势在于处理多条记录并将其绑定到一个支持模型的视图中,比如用户想将整个查询结果展示在 QTableView 或其他可视化控件中时。
  • 在当前场景中,查询结果只是一个简单的值,不需要展示在复杂的表格中,因此使用 QSqlQueryModel 反而显得多余。

为什么不用 QSqlQueryModel

  • 查询结果简单:这里只需要从数据库中提取单一的字段(价格),不需要将多个结果绑定到视图上。QSqlQueryModel 适用于复杂的场景,如显示多条记录,而这里只需要获取一个值。
  • 直接处理查询结果QSqlQuery 更加直接,省去了数据模型的设置和绑定,适合这种单次查询。

何时使用 QSqlQueryModel

  • 如果你需要展示多个查询结果(例如:显示所有商品的价格和名称)在 QTableViewQComboBox 中。
  • 当你需要支持复杂查询并将数据与视图联动时,QSqlQueryModel 是更合适的选择。

总结:

  • QSqlQuery 用于处理简单的查询,尤其是只需要单个值或直接对结果进行操作时,它更为简便。
  • QSqlQueryModel 适合用来处理大量数据并将其展示在视图控件中,比如表格或列表。
ui->sellPriceLineEdit->setEnabled(true);
ui->sellPriceLineEdit->setReadOnly(true);
ui->sellPriceLineEdit->setText(query.value(0).toString());

在这里插入图片描述
启用该文本框,并设置为只读,只能读取不能修改
query.value(0) 是获取 SQL 查询结果的第一个字段,这里假设这个字段是商品的价格。toString() 将其转换为字符串,以便在 QLineEdit 中显示。

if(num == 0){
        QMessageBox::information(this,tr("提示"),tr("该品牌汽车已经售完!"),QMessageBox::Ok);
    }
    else{
        ui->sellNumSpinBox->setEnabled(true);
        ui->sellNumSpinBox->setMaximum(num);
        ui->sellLastNumLabel->setText(tr("剩余数量:%1").arg(num));
        ui->sellLastNumLabel->setVisible(true);
    }

库存量,如果是0进行提示已经售完,否则,
在这里插入图片描述
启用该数字调节框,
设置 sellNumSpinBox 的最大值为当前库存数量 num。
这样可以确保用户在选择数量时不会超过库存的最大值。用户只能选择小于或等于库存数量的值。
tr(“剩余数量:%1”).arg(num) 是动态设置标签内容的方式
将 sellLastNumLabel 标签设置为可见,显示当前库存信息给用户。

;