请教各位,在QT软件编程,MySQL数据库环境中,如何实现下图预算套价的显示及汇总,其中标记为1的行为清单行,标记为2的行为定额行,标记为3的行为主材行,顺序是先添加清单行,后挂接定额行,最后挂接主材行,在MySQL数据库中单独设计为三张表,是一对多或一对一的关系,B列为单位,清单、定额、主材的单位可能不一致,需要在清单单价D汇总时进行换算,C列为数量,在添加定额或主材时自动根据单位换算添加。
主要是在QT中采用何种模型及视图显示,如何在软件中添加、修改后保存回MySQL数据库中。

请教各位,在QT软件编程,MySQL数据库环境中,如何实现下图预算套价的显示及汇总,其中标记为1的行为清单行,标记为2的行为定额行,标记为3的行为主材行,顺序是先添加清单行,后挂接定额行,最后挂接主材行,在MySQL数据库中单独设计为三张表,是一对多或一对一的关系,B列为单位,清单、定额、主材的单位可能不一致,需要在清单单价D汇总时进行换算,C列为数量,在添加定额或主材时自动根据单位换算添加。
主要是在QT中采用何种模型及视图显示,如何在软件中添加、修改后保存回MySQL数据库中。

关注引自强大而免费的微信小程序:皆我百晓生。
在Qt中实现树状结构数据显示及更新可以使用QTreeView和QStandardItemModel配合使用。以下是一种可能的实现方法:
1.创建一个QTreeView控件用于显示树状结构数据。
QTreeView *treeView = new QTreeView(this);
2.创建一个QStandardItemModel作为数据模型。
QStandardItemModel *model = new QStandardItemModel(this);
3.设置数据模型的列数和表头。
model->setColumnCount(4); // 设置模型的列数
model->setHeaderData(0, Qt::Horizontal, "编号"); // 设置表头
model->setHeaderData(1, Qt::Horizontal, "名称");
model->setHeaderData(2, Qt::Horizontal, "单位");
model->setHeaderData(3, Qt::Horizontal, "单价");
4.查询MySQL数据库中的数据,并添加到数据模型中。
// 执行查询语句获取数据
QString queryStr = "SELECT * FROM your_table";
QSqlQuery query(queryStr);
while (query.next()) {
// 从查询结果中获取数据
QString id = query.value(0).toString();
QString name = query.value(1).toString();
QString unit = query.value(2).toString();
double price = query.value(3).toDouble();
// 创建一个QStandardItem,并设置数据
QStandardItem *item = new QStandardItem();
item->setData(id, Qt::DisplayRole); // 设置编号
item->setData(name, Qt::DisplayRole); // 设置名称
item->setData(unit, Qt::DisplayRole); // 设置单位
item->setData(price, Qt::DisplayRole); // 设置单价
model->appendRow(item); // 将item添加到model中
}
5.将数据模型设置给QTreeView控件。
treeView->setModel(model);
6.在用户添加、修改、删除数据时,通过数据模型对数据库进行相应的操作。
// 在添加行时,将数据添加到model中,并插入数据库中
QStandardItem *item = new QStandardItem();
item->setData(id, Qt::DisplayRole); // 设置编号
item->setData(name, Qt::DisplayRole); // 设置名称
item->setData(unit, Qt::DisplayRole); // 设置单位
item->setData(price, Qt::DisplayRole); // 设置单价
model->appendRow(item); // 将item添加到model中
// 将数据插入到数据库中
QString insertStr = "INSERT INTO your_table VALUES (?, ?, ?, ?)";
QSqlQuery insertQuery;
insertQuery.prepare(insertStr);
insertQuery.addBindValue(id);
insertQuery.addBindValue(name);
insertQuery.addBindValue(unit);
insertQuery.addBindValue(price);
insertQuery.exec();
// 在修改行时,更新model中的数据,并更新到数据库中
item->setData(newName, Qt::DisplayRole); // 更新名称
item->setData(newUnit, Qt::DisplayRole); // 更新单位
item->setData(newPrice, Qt::DisplayRole); // 更新单价
int row = item->row();
model->setData(model->index(row, 1), newName); // 更新名称数据
model->setData(model->index(row, 2), newUnit); // 更新单位数据
model->setData(model->index(row, 3), newPrice); // 更新单价数据
// 更新数据到数据库中
QString updateStr = "UPDATE your_table SET name=?, unit=?, price=? WHERE id=?";
QSqlQuery updateQuery;
updateQuery.prepare(updateStr);
updateQuery.addBindValue(newName);
updateQuery.addBindValue(newUnit);
updateQuery.addBindValue(newPrice);
updateQuery.addBindValue(id);
updateQuery.exec();
// 在删除行时,从model中移除数据,并从数据库中删除
model->removeRow(row); // 移除行数据
// 从数据库中删除数据
QString deleteStr = "DELETE FROM your_table WHERE id=?";
QSqlQuery deleteQuery;
deleteQuery.prepare(deleteStr);
deleteQuery.addBindValue(id);
deleteQuery.exec();
通过以上代码,您可以在Qt中实现树状结构数据的显示和更新,并将修改后的数据保存回MySQL数据库中。其中,QTreeView用于显示数据,QStandardItemModel用于存储和更新数据。同时,根据您的需求,您还可以在添加和修改数据时进行单位的换算。