目录
- 如何在daylist控件中显示销售信息
- 如何创建时间的变量?
-
- [enum DateTimeType{Time,Date,DateTime};](#enum DateTimeType{Time,Date,DateTime};)
- 如何获取时间?
- 如何修改xml文档
- 如何在根元素下插入元素
- 如何创建汽车销售信息的节点
- 如何将xml文件中的内容显示到控件中去?
- 为什么这里使用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 文档保存到文件中,并在保存完成后关闭该文件。具体解释如下:
QTextStream out(&file);
:
QTextStream
是 Qt 提供的一个类,用于以文本格式读写数据。- 通过将
QFile
对象(在这里是file
)的引用传递给QTextStream
的构造函数,out
就成为一个与该文件关联的文本流。 - 这使得可以通过
out
来写入文本数据到文件中。
doc.save(out, 4);
:
save()
是QDomDocument
类的一个方法,用于将 XML 文档的内容写入到指定的输出流中。out
是前面创建的QTextStream
对象,表示要写入的目标文件。- 第二个参数
4
是用来指定缩进的空格数。这里表示在输出的 XML 文档中,每个层级将使用四个空格进行缩进,以增强可读性。 - 这会将
doc
中的 XML 内容写入到file
文件中,格式化为易于阅读的结构。
file.close();
:
close()
是QFile
类的一个方法,用于关闭文件。- 在完成写入后,关闭文件是个好习惯,这样可以释放文件资源,确保所有的数据都已写入并保存到磁盘中。
总结:
这段代码的整体功能是:
- 创建一个文本流
out
,用于将数据写入file
。 - 调用
doc.save(out, 4);
将 XML 文档以格式化的形式写入到file
中。 - 最后,调用
file.close();
关闭文件,确保所有操作结束后释放资源。
out有什么用?
通过 out,你可以调用 write()、operator<< 等方法,将文本数据写入到 file 中。
在这个例子中,doc.save(out, 4); 通过 out 将整个 XML 文档写入文件。
如何创建时间的变量?
enum DateTimeType{Time,Date,DateTime};
这段代码定义了一个名为 DateTimeType
的枚举类型(enum
),它包含三个常量:Time
、Date
和 DateTime
。下面是对这段代码的详细解释:
- 枚举(
enum
)
- 枚举类型是 C++ 中的一种数据类型,用于定义一组命名的常量。枚举可以使代码更具可读性,帮助程序员理解变量可能的取值。
- 枚举的每个常量都有一个对应的整数值,默认情况下,第一个常量的值为 0,后续常量的值会自动递增。
DateTimeType
DateTimeType
是你定义的枚举类型的名称。它可以用于声明变量,使得这些变量只能取Time
、Date
或DateTime
这三个值。
- 常量值
-
Time
、Date
和DateTime
是DateTimeType
枚举中的三个命名常量。Time
默认值为 0Date
默认值为 1DateTime
默认值为 2
这些值可以在程序中被使用,比如:
cppDateTimeType currentType = DateTimeType::Date;
- 用途
- 这种枚举类型通常用于表示时间相关的数据状态或类型,方便在函数中进行判断或在界面中显示不同的日期和时间格式。
- 使用枚举的好处在于可以提高代码的可读性和可维护性,避免使用魔法数字(即直接使用数字而不加解释),使得代码更容易理解。
为什么用枚举类型来创建时间?
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 数据库,可能有以下几个原因和考虑:
- 数据的复杂性和结构化需求
- XML 是一种层次化的数据格式,适合表示嵌套或分层的数据。它以树状结构存储信息,这使得它在需要保存简单、轻量级的、结构化的或层次化数据时非常有用。XML 的格式还使得它非常直观,特别是当需要在多个层级中组织数据时。
- SQLite 则是一个关系型数据库,通常用于存储更复杂、可查询的表格化数据。如果你的销售清单只是一些简单的、定期更新的记录,而不需要复杂的查询操作或大量的数据操作,那么使用 XML 是完全合适的。
- 数据交互和可移植性
- XML 是一种非常通用的格式,可以很容易地在不同的平台、应用程序之间共享和传递。比如,它可以轻松导入到其他系统,或者与 Web 服务进行数据交换。如果系统需要和其他外部程序、应用交互,XML 文件格式是常见的选择。
- SQLite 的数据库文件虽然小巧易用,但如果你需要与外部系统交互,还需特定的数据库驱动和工具。XML 更加通用和灵活,尤其在应用程序之间传输时无需特殊的数据库环境。
- 数据的可读性和手动编辑
- XML 文件是纯文本格式,可以使用任何文本编辑器打开和查看。它直观、易读,用户可以直接查看和修改文件的内容(尽管这种方式不适合在生产环境中使用),而 SQLite 数据库文件则需要专门的工具或库来查看和编辑。
- 在开发或调试时,使用 XML 文件可以让开发者快速看到存储的数据并进行修改,而不需要操作数据库。
- 轻量级的场景
- 如果销售清单的数据量不大,XML 文件是一种足够轻量的解决方案。SQLite 尽管也很轻量,但其引入了数据库的复杂性,而 XML 是纯文件格式,可能更适合小规模数据存储。对于只需要记录简单的销售清单而不进行复杂的查询或数据处理,XML 足以满足需求。
- 无需复杂的事务管理
- 在使用 SQLite 时,事务管理、并发控制等是数据库系统固有的机制,尤其在高并发场景中十分重要。而对于一个仅仅用来展示销售清单的文件,XML 足以处理。因为销售清单的更新频率可能较低,并且大部分是只读操作,XML 格式能轻松应对,且没有事务管理的复杂性。
- 简单存储需求
- XML 适合存储结构化的、无需复杂关系的静态数据。例如,销售清单数据通常是一个简单的"记录"集合,不需要进行复杂的关联查询操作,XML 通过树形结构可以直观地存储这些信息,而不需要使用数据库来进行表的设计和查询操作。
总结:
使用 XML 来存储销售清单有以下优势:
- 直观、易读:可以轻松查看和编辑内容。
- 轻量级:不需要数据库的复杂管理,非常适合存储简单的数据。
- 可移植性:可以跨平台、跨应用程序交换数据,且不需要数据库驱动支持。
- 适合小规模数据:当数据量不大时,XML 是一个非常简便的选择。
但是,如果数据量增加,查询复杂性提高,或者需要并发访问和数据完整性保证,数据库(如 SQLite)可能是更好的选择。