汽车管理系统——日销售清单xml

目录

如何在daylist控件中显示销售信息

query.exec(QString("select * from brand where name='%1' "))

text=

ui->daylist->settext();

为什么要创建xml文件?

cpp 复制代码
if(file.exists())return true;
if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate))
    return false;

这是一个常见的文件写入前的安全检查,以防止程序在无法正确打开文件时崩溃或写入错误数据。

cpp 复制代码
static bool createXml()
{
    QFile file("data.xml");
    if(file.exists())return true;
    if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate))
        return false;
    QDomDocument doc;
    QDomProcessingInstruction instruction;
    instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
    doc.appendChild(instruction);
    QDomElement root = doc.createElement(QString("日销售清单"));
    doc.appendChild(root);
    QTextStream out(&file);
    doc.save(out,4);
    file.close();
    return true;
}

初始化一个xml文件

如何创建xml文件?

cpp 复制代码
QFile file("data.xml");

先用QFile创建文件,再把xml内容写进去

用什么类来进行xml内容的操作?

cpp 复制代码
QDomDocument doc;
QDomProcessingInstruction instruction;

QDomDocument 用于创建、操作和保存 XML 文档。

QDomProcessingInstruction 用于创建 XML 的处理指令,通常在文档头部添加一些元数据信息(如版本、编码等)。

这两个类如何进行操作的?
cpp 复制代码
instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");

创建一个 XML 处理指令,用来声明 XML 文档的版本和字符编码。

其中有转义符

感觉QDomProcessingInstruction就是用来存放信息的

cpp 复制代码
doc.appendChild(instruction);

doc.appendChild(instruction); 的作用是将 XML 声明添加到 XML 文档中,使得该文档符合标准的 XML 格式,明确规定文档的版本和字符编码。

cpp 复制代码
QDomElement root = doc.createElement(QString("日销售清单"));

这行代码会创建一个名为"日销售清单"的元素,它是 XML 文档的根节点。在 XML 文档结构中,根节点是唯一的、包含整个文档的最外层元素。

cpp 复制代码
QTextStream out(&file);
doc.save(out,4);
file.close();

这段代码的作用是将创建的 XML 文档保存到文件中,并在保存完成后关闭该文件。具体解释如下:

  1. QTextStream out(&file);:
  • QTextStream 是 Qt 提供的一个类,用于以文本格式读写数据。
  • 通过将 QFile 对象(在这里是 file)的引用传递给 QTextStream 的构造函数,out 就成为一个与该文件关联的文本流。
  • 这使得可以通过 out 来写入文本数据到文件中。
  1. doc.save(out, 4);:
  • save()QDomDocument 类的一个方法,用于将 XML 文档的内容写入到指定的输出流中。
  • out 是前面创建的 QTextStream 对象,表示要写入的目标文件。
  • 第二个参数 4 是用来指定缩进的空格数。这里表示在输出的 XML 文档中,每个层级将使用四个空格进行缩进,以增强可读性。
  • 这会将 doc 中的 XML 内容写入到 file 文件中,格式化为易于阅读的结构。
  1. file.close();:
  • close()QFile 类的一个方法,用于关闭文件。
  • 在完成写入后,关闭文件是个好习惯,这样可以释放文件资源,确保所有的数据都已写入并保存到磁盘中。

总结:

这段代码的整体功能是:

  1. 创建一个文本流 out,用于将数据写入 file
  2. 调用 doc.save(out, 4); 将 XML 文档以格式化的形式写入到 file 中。
  3. 最后,调用 file.close(); 关闭文件,确保所有操作结束后释放资源。
out有什么用?

通过 out,你可以调用 write()、operator<< 等方法,将文本数据写入到 file 中。

在这个例子中,doc.save(out, 4); 通过 out 将整个 XML 文档写入文件。

如何创建时间的变量?

enum DateTimeType{Time,Date,DateTime};

这段代码定义了一个名为 DateTimeType 的枚举类型(enum),它包含三个常量:TimeDateDateTime。下面是对这段代码的详细解释:

  1. 枚举(enum
  • 枚举类型是 C++ 中的一种数据类型,用于定义一组命名的常量。枚举可以使代码更具可读性,帮助程序员理解变量可能的取值。
  • 枚举的每个常量都有一个对应的整数值,默认情况下,第一个常量的值为 0,后续常量的值会自动递增。
  1. DateTimeType
  • DateTimeType 是你定义的枚举类型的名称。它可以用于声明变量,使得这些变量只能取 TimeDateDateTime 这三个值。
  1. 常量值
  • TimeDateDateTimeDateTimeType 枚举中的三个命名常量。

    • Time 默认值为 0
    • Date 默认值为 1
    • DateTime 默认值为 2

    这些值可以在程序中被使用,比如:

    cpp 复制代码
    DateTimeType currentType = DateTimeType::Date;
  1. 用途
  • 这种枚举类型通常用于表示时间相关的数据状态或类型,方便在函数中进行判断或在界面中显示不同的日期和时间格式。
  • 使用枚举的好处在于可以提高代码的可读性和可维护性,避免使用魔法数字(即直接使用数字而不加解释),使得代码更容易理解。

为什么用枚举类型来创建时间?

type 是一个枚举类型,可能的取值为 Date, Time, 和 DateTime

如何获取时间?

cpp 复制代码
QDateTime datetime = QDateTime::currentDateTime();

使用了 QDateTime 类的静态方法 currentDateTime() 来获取当前的日期和时间

cpp 复制代码
QString date = datetime.toString("yyyy-MM-dd");
QString time = datetime.toString("hh:mm");
QString dateAndTime = datetime.toString("yyyy-MM-dd dddd hh:mm");

toString("yyyy-MM-dd") 方法会将 datetime 转换为指定格式的字符串,"yyyy" 表示四位年份,"MM" 表示两位月份,"dd" 表示两位日期。

如何修改xml文档

枚举的变量都是整型吗

是的,在 C++ 中,枚举类型的枚举值实际上是整型常量。每个枚举值都被分配了一个整型值,默认情况下,从 0 开始,依次递增。

那为什么在以下代码中可以用字符串赋值给枚举类型?

cpp 复制代码
QString date = datetime.toString("yyyy-MM-dd");
QString time = datetime.toString("hh:mm");
QString dateAndTime = datetime.toString("yyyy-MM-dd dddd hh:mm");

没有将字符串直接赋给枚举

在这个上下文中,并没有将字符串赋给枚举类型的变量。相反,是根据枚举值来决定返回哪个字符串。

这意味着 type 是 DateTimeType 枚举的一个实例,而 date、time 和 dateAndTime 则是 QString 类型的变量,用于存储格式化后的日期和时间字符串。

枚举就是一组常量,可能是直接使用他的常量名称,清晰可见一些。有点像是switch这样的阀门开关

cpp 复制代码
QDomElement root = doc.documentElement();

需要先创建一个根元素

如何在根元素下插入元素

cpp 复制代码
root.appendChild(date);

如何为该元素添加属性?

cpp 复制代码
QDomAttr curDate = doc.createAttribute("date");
curDate.setValue(currentDate);
date.setAttributeNode(curDate);

先创建一个属性,然后对属性赋值,最后将元素包含属性

.toElement()什么用法?

toElement() 是 QDomNode 类的方法,它将节点转换为 QDomElement 类型。如果该节点不是一个元素节点(例如,是一个文本节点或注释节点),则返回一个空的 QDomElement。

若是空的时间节点,则创建一个,然后获取已有的节点的时间,判断,如果是今天的,就继续在该时间下创建子节点,如果时间与当前时间不对应,是昨天的,那就重新获取时间,重新创建时间节点。

如何创建汽车销售信息的节点

首先是创建xml内容中的元素,然后再讲控件当前的内容赋给元素

cpp 复制代码
QDomElement time = doc.createElement(QString("时间"));
QDomAttr curTime = doc.createAttribute("time");
curTime.setValue(getDateTime(Time));
time.setAttributeNode(curTime);
date.appendChild(time);

实现了每一天下的具体的时间点

cpp 复制代码
QDomElement factory = doc.createElement(QString("厂家"));
QDomText text;
text = doc.createTextNode(QString("%1").arg(ui->sellFactoryComboBox->currentText()));
factory.appendChild(text);

先用createElement创建新元素,然后用QDomText的对象来在这个元素下创建文本,值为控件中对应的信息。

最后再将文本包含到元素中

cpp 复制代码
time.appendChild(factory);
time.appendChild(brand);
time.appendChild(price);
time.appendChild(num);
time.appendChild(sum);

一层一层地,最后再将这些子元素包含到上一个元素中去

如何将xml文件中的内容显示到控件中去?

cpp 复制代码
QListWidgetItem *titleItem = new QListWidgetItem;
titleItem->setText(QString("-----%1-----").arg(title));
titleItem->setTextAlignment(Qt::AlignCenter);
ui->dailyList->addItem(titleItem);

是用一个专有对象addItem到列表里去

QListWidgetItem

QListWidgetItem 是 Qt 框架中的一个类,用于表示 QListWidget 中的单个条目(项)。QListWidget 是 Qt 的一个控件,它提供了一个基于项(item-based)的列表,QListWidgetItem 就是列表中的每个项的类。通过它可以设置每一项的内容、外观等属性。

cpp 复制代码
 QString title = root.tagName();

标题使用根元素的名称,根元素名称通过.tagname()来获取

先判断时间

cpp 复制代码
QDomNodeList children = dateElement.childNodes();

QDomNodeList children = dateElement.childNodes(); 这段代码的作用是获取 XML 元素 dateElement 的所有子节点

如何遍历所有子节点?

cpp 复制代码
 for(int i=0;i<children.count();i++)

.count()有点像数组.size()

如何获取子节点

cpp 复制代码
QDomNode node = children.at(i);

从 QDomNodeList 中获取指定索引 i 处的子节点,并将其存储在 node 变量中。

这里就是用几个字符串对象获取节点中的具体信息了

然后用专有对象以及additem来讲具体信息加载到控件中

addItem能够接受的数据类型有什么?

addItem() 可以接受的主要数据类型是 QString 和 QListWidgetItem*。

就是两种

为什么这里使用xml文件来存储数据而不用其他数据库呢?

在汽车管理系统中,使用 XML 文件来展示销售清单,而不是使用 SQLite 数据库,可能有以下几个原因和考虑:

  1. 数据的复杂性和结构化需求
  • XML 是一种层次化的数据格式,适合表示嵌套或分层的数据。它以树状结构存储信息,这使得它在需要保存简单、轻量级的、结构化的或层次化数据时非常有用。XML 的格式还使得它非常直观,特别是当需要在多个层级中组织数据时。
  • SQLite 则是一个关系型数据库,通常用于存储更复杂、可查询的表格化数据。如果你的销售清单只是一些简单的、定期更新的记录,而不需要复杂的查询操作或大量的数据操作,那么使用 XML 是完全合适的。
  1. 数据交互和可移植性
  • XML 是一种非常通用的格式,可以很容易地在不同的平台、应用程序之间共享和传递。比如,它可以轻松导入到其他系统,或者与 Web 服务进行数据交换。如果系统需要和其他外部程序、应用交互,XML 文件格式是常见的选择。
  • SQLite 的数据库文件虽然小巧易用,但如果你需要与外部系统交互,还需特定的数据库驱动和工具。XML 更加通用和灵活,尤其在应用程序之间传输时无需特殊的数据库环境。
  1. 数据的可读性和手动编辑
  • XML 文件是纯文本格式,可以使用任何文本编辑器打开和查看。它直观、易读,用户可以直接查看和修改文件的内容(尽管这种方式不适合在生产环境中使用),而 SQLite 数据库文件则需要专门的工具或库来查看和编辑。
  • 在开发或调试时,使用 XML 文件可以让开发者快速看到存储的数据并进行修改,而不需要操作数据库。
  1. 轻量级的场景
  • 如果销售清单的数据量不大,XML 文件是一种足够轻量的解决方案。SQLite 尽管也很轻量,但其引入了数据库的复杂性,而 XML 是纯文件格式,可能更适合小规模数据存储。对于只需要记录简单的销售清单而不进行复杂的查询或数据处理,XML 足以满足需求。
  1. 无需复杂的事务管理
  • 在使用 SQLite 时,事务管理、并发控制等是数据库系统固有的机制,尤其在高并发场景中十分重要。而对于一个仅仅用来展示销售清单的文件,XML 足以处理。因为销售清单的更新频率可能较低,并且大部分是只读操作,XML 格式能轻松应对,且没有事务管理的复杂性。
  1. 简单存储需求
  • XML 适合存储结构化的、无需复杂关系的静态数据。例如,销售清单数据通常是一个简单的"记录"集合,不需要进行复杂的关联查询操作,XML 通过树形结构可以直观地存储这些信息,而不需要使用数据库来进行表的设计和查询操作。

总结:

使用 XML 来存储销售清单有以下优势:

  • 直观、易读:可以轻松查看和编辑内容。
  • 轻量级:不需要数据库的复杂管理,非常适合存储简单的数据。
  • 可移植性:可以跨平台、跨应用程序交换数据,且不需要数据库驱动支持。
  • 适合小规模数据:当数据量不大时,XML 是一个非常简便的选择。

但是,如果数据量增加,查询复杂性提高,或者需要并发访问和数据完整性保证,数据库(如 SQLite)可能是更好的选择。

相关推荐
阿里巴巴P8资深技术专家5 小时前
小鹏汽车智慧材料数据库系统项目总成数据同步
汽车
亚远景aspice5 小时前
ISO 21434标准:汽车网络安全管理的利与弊
网络·web安全·汽车
龙智DevSecOps解决方案5 小时前
汽车软件开发中的ASPICE合规挑战与Jama Connect解决方案
汽车·需求管理·jamaconnect·汽车aspice·汽车软件开发
找藉口是失败者的习惯6 小时前
从传统到未来:Android XML布局 与 Jetpack Compose的全面对比
android·xml
一二小选手7 小时前
【MyBatis】全局配置文件—mybatis.xml 创建xml模板
xml·java·mybatis
国际展会招商15 小时前
2025杭州国际智能网联新能源汽车展览会
汽车
虹科Pico汽车示波器15 小时前
汽车免拆诊断案例 | 2012款路虎揽胜运动版柴油车加速无力
汽车·虹科pico汽车示波器·汽修·发动机故障·路虎揽胜·汽车失火·喷油器
哔哥哔特商务网1 天前
一文探究48V新型电气架构下的汽车连接器
架构·汽车
电子科技圈1 天前
IAR与鸿轩科技共同推进汽车未来
科技·嵌入式硬件·mcu·汽车
思尔芯S2C2 天前
面向未来的智能视觉参考设计与汽车架构,思尔芯提供基于Arm技术的创新方案
arm开发·架构·汽车·iot·fpga原型验证·prototyping·智慧视觉