三十二、服务应用操作
三十二、服务应用操作
32.1 INI文件操作
.ini文件是Initialization File 的缩写,即初始化文件,是Windows的系统配置文件所采用的存储格式。
文件扩展名:配置文件名称.ini。比如项目中的配置文件是整个项目共用的。例如,数据库配置.ini。
INI文件由节、键、值三个部分组成:
[section(节)]
参数
name=value;(键=值)
注意:分号表示(在分号后面的相关字符等信息,直到该行结尾都全部为注解内容)
实现以下功能
#include<QSettings>
#include<QtDebug>
// 写入 INI 文件的函数
void WriteIniFiles()
{
// 创建一个 QSettings 对象,用于写入 INI 文件,文件名为 MySQLfiles.ini,文件格式为 INI 格式
QSettings *WriteIniFiles = new QSettings("MySQLfiles.ini",QSettings::IniFormat);
// 向 INI 文件的 /database/ip 节点写入 IP 地址
WriteIniFiles->setValue("/database/ip","192.168.12.189");
// 向 INI 文件的 /database/port 节点写入端口号
WriteIniFiles->setValue("/database/port","3308");
// 释放 QSettings 对象的内存
delete WriteIniFiles;
}
// 读取 INI 文件的函数
void ReadIniFiles()
{
// 创建一个 QSettings 对象,用于读取 INI 文件,文件名为 MySQLfiles.ini,文件格式为 INI 格式
QSettings *ReadIniFiles = new QSettings("MySQLfiles.ini",QSettings::IniFormat);
// 从 INI 文件的 /database/ip 节点读取 IP 地址,并将其转换为 QString 类型
QString strIp = ReadIniFiles->value("/database/ip").toString();
// 从 INI 文件的 /database/port 节点读取端口号,并将其转换为 QString 类型
QString strPort = ReadIniFiles->value("/database/port").toString();
// 打印 IP 地址,使用 toUtf8().data() 转换为 char* 类型
qDebug()<<strIp.toUtf8().data();
// 打印端口号,使用 toUtf8().data() 转换为 char* 类型
qDebug()<<strPort.toUtf8().data();
}
// 读取 INI 文件中的所有键值对的函数
void ReadIniFilesIsKey()
{
// 创建一个 QSettings 对象,用于读取 INI 文件,文件名为 MySQLfiles.ini,文件格式为 INI 格式
QSettings setting("./MySQLfiles.ini",QSettings::IniFormat);
// 遍历 INI 文件中的所有键
foreach(QString key,setting.allKeys())
{
// 打印键和对应的值,将它们都转换为 char* 类型
qDebug()<<key.toUtf8().data()<<":"<<setting.value(key).toString().toUtf8().data();
}
}
WriteIniFiles
函数:QSettings *WriteIniFiles = new QSettings("MySQLfiles.ini",QSettings::IniFormat);
:使用QSettings
类创建一个对象WriteIniFiles
,该对象将操作MySQLfiles.ini
文件,文件格式为IniFormat
,使用动态分配内存的方式创建对象。WriteIniFiles->setValue("/database/ip","192.168.12.189");
:使用setValue
方法将键/database/ip
对应的值设置为"192.168.12.189"
,存储在MySQLfiles.ini
文件中。WriteIniFiles->setValue("/database/port","3308");
:类似地,将键/database/port
对应的值设置为"3308"
。delete WriteIniFiles;
:释放为WriteIniFiles
对象分配的内存。
ReadIniFiles
函数:QSettings *ReadIniFiles = new QSettings("MySQLfiles.ini",QSettings::IniFormat);
:创建一个QSettings
对象ReadIniFiles
用于读取MySQLfiles.ini
文件。QString strIp = ReadIniFiles->value("/database/ip").toString();
:通过value
方法读取/database/ip
键对应的值,并将其转换为QString
类型存储在strIp
中。QString strPort = ReadIniFiles->value("/database/port").toString();
:读取/database/port
键对应的值存储在strPort
中。qDebug()<<strIp.toUtf8().data();
和qDebug()<<strPort.toUtf8().data();
:将读取到的IP
地址和端口号打印出来,toUtf8().data()
将QString
转换为char*
类型。
ReadIniFilesIsKey
函数:QSettings setting("./MySQLfiles.ini",QSettings::IniFormat);
:创建QSettings
对象setting
用于读取MySQLfiles.ini
文件。foreach(QString key,setting.allKeys())
:使用allKeys
方法获取文件中的所有键,并通过foreach
循环遍历。qDebug()<<key.toUtf8().data()<<":"<<setting.value(key).toString().toUtf8().data();
:打印出每个键及其对应的值,都转换为char*
类型。
32.2 JSON文件操作
实现以下操作
首先设计ui
#include<QMessageBox>
#include<QDebug>
#include<QFile>
#include<QJsonDocument>
#include<QJsonObject>
#include<QJsonParseError>
qjsonper::qjsonper(QWidget *parent)
: QDialog(parent)
, ui(new Ui::qjsonper)
{
// 初始化界面
ui->setupUi(this);
}
qjsonper::~qjsonper()
{
// 释放 UI 资源
delete ui;
}
// 点击 "写入 JSON" 按钮时执行的槽函数
void qjsonper::on_pushButton_writeJson_clicked()
{
// 创建一个 QJsonObject 用于存储 MySQL 信息
QJsonObject mysqinfo;
// 插入 IP 信息
mysqinfo.insert("ip","192.168.0.125");
// 插入端口信息
mysqinfo.insert("port",3308);
// 创建一个 QJsonObject 用于存储更高级别的信息
QJsonObject jsonifo;
// 插入状态码
jsonifo.insert("code",1);
// 插入消息描述
jsonifo.insert("dbmsg","MySQL数据库配置参数");
// 插入 MySQL 信息作为一个子对象
jsonifo.insert("data",mysqinfo);
// 创建一个 QJsonDocument 对象
QJsonDocument jsondoc;
// 将 QJsonObject 作为文档的对象
jsondoc.setObject(jsonifo);
// 创建一个 QFile 对象,文件名为 databasejsonfiles.json
QFile qfiles("./databasejsonfiles.json");
// 以只写模式打开文件
if(qfiles.open(QIODevice::WriteOnly))
{
// 将 QJsonDocument 转换为 JSON 字节数组并写入文件
qfiles.write(jsondoc.toJson());
// 关闭文件
qfiles.close();
}
// 显示写入成功的消息框
QMessageBox::information(this,"写入成功","恭喜你,Json数据文件写入成功");
}
// 点击 "读取 JSON" 按钮时执行的槽函数
void qjsonper::on_pushButton_readJson_clicked()
{
// 存储 JSON 数据的 QString
QString strjson;
// 存储消息的 QString
QString strmsg;
// 创建一个 QFile 对象,文件名为 databasejsonfiles.json
QFile qfiles("./databasejsonfiles.json");
// 以只读模式打开文件
if(qfiles.open(QIODevice::ReadOnly))
{
// 读取文件的全部内容
strjson = qfiles.readAll();
// 关闭文件
qfiles.close();
}
// 创建一个 QJsonParseError 对象用于存储解析错误信息
QJsonParseError jsonerror;
// 从 UTF-8 编码的字节数组解析 JSON 文档
QJsonDocument jsondoc = QJsonDocument::fromJson(strjson.toUtf8(),&jsonerror);
// 存储临时信息的 QString
QString strtemp;
// 检查解析是否成功且没有错误
if(!jsondoc.isEmpty() && (jsonerror.error == QJsonParseError::NoError))
{
// 获取解析后的 QJsonObject
QJsonObject json = jsondoc.object();
// 获取 code 字段的值
QJsonValue code = json.value("code");
// 获取 data 字段的值
QJsonValue data = json.value("data");
// 检查 code 或 data 是否有问题
if(code.isUndefined() || code.toDouble()!= 1 || data.isUndefined() ||!data.isObject())
{
// 输出错误信息
qDebug()<<"转换 Json 数据错误,请重新检查";
// 显示错误消息框
QMessageBox::critical(this,"错误","转换 Json 数据错误,请重新检查");
// 退出程序
exit(100);
}
// 将 data 转换为 QJsonObject
QJsonObject databaseinfo = data.toObject();
// 获取 IP 地址的值
QJsonValue dbip = databaseinfo.value("ip");
// 获取端口的值
QJsonValue dbport = databaseinfo.value("port");
// 检查 IP 或端口是否有问题
if(dbip.isUndefined() || dbport.isUndefined())
{
// 显示错误消息框
QMessageBox::critical(this,"错误","接口错误,请重新检查");
// 退出程序
exit(100);
}
// 将 IP 地址转换为 QString
QString strip = dbip.toString();
// 将端口转换为 int
int iport = dbport.toInt();
// 检查 IP 地址是否为空
if(strip.isEmpty())
{
// 显示错误消息框
QMessageBox::critical(this,"错误","此数据项不能为空,请重新检查");
// 退出程序
exit(100);
}
// 构建消息
strmsg += "【JSON 配置参数】";
strmsg += "\n数据库 IP 地址:" + strip;
strmsg += "\n数据库端口:" + QString::number(iport,10);
}
// 显示读取成功的消息框
QMessageBox::information(this,"成功",strmsg,QMessageBox::Yes);
}
on_pushButton_writeJson_clicked
槽函数:QJsonObject mysqinfo;
:创建一个QJsonObject
用于存储 MySQL 数据库的信息,如ip
和port
。mysqinfo.insert("ip","192.168.0.125");
和mysqinfo.insert("port",3308);
:向mysqinfo
对象插入ip
和port
信息。QJsonObject jsonifo;
:创建一个更高级别的QJsonObject
用于存储其他信息,包括code
、dbmsg
和data
(包含mysqinfo
)。QJsonDocument jsondoc;
和jsondoc.setObject(jsonifo);
:创建QJsonDocument
并将jsonifo
作为其对象,为写入文件做准备。QFile qfiles("./databasejsonfiles.json");
:创建一个文件对象,用于操作文件。if(qfiles.open(QIODevice::WriteOnly)) {...}
:以只写模式打开文件,如果打开成功,将QJsonDocument
转换为JSON
字节数组并写入文件,然后关闭文件。QMessageBox::information(this,"写入成功","恭喜你,Json数据文件写入成功");
:显示写入成功的消息框。
on_pushButton_readJson_clicked
槽函数:QString strjson;
和QString strmsg;
:用于存储读取的JSON
数据和最终的消息。QFile qfiles("./databasejsonfiles.json");
:创建文件对象用于读取。if(qfiles.open(QIODevice::ReadOnly)) {...}
:以只读模式打开文件,读取文件的全部内容,存储在strjson
中,然后关闭文件。QJsonParseError jsonerror;
和QJsonDocument jsondoc = QJsonDocument::fromJson(strjson.toUtf8(),&jsonerror);
:创建QJsonParseError
对象存储解析错误,使用fromJson
方法将strjson
解析为QJsonDocument
。if(!jsondoc.isEmpty() && (jsonerror.error == QJsonParseError::NoError)) {...}
:检查解析是否成功且没有错误。QJsonObject json = jsondoc.object();
:从QJsonDocument
获取QJsonObject
。QJsonValue code = json.value("code");
和QJsonValue data = json.value("data");
:从QJsonObject
获取code
和data
的值。- 后续一系列检查:检查
code
和data
是否有问题,将data
转换为QJsonObject
并获取ip
和port
,进行类型转换,同时检查是否存在问题,若有问题显示错误消息框并退出程序。 strmsg += "【JSON 配置参数】";
等:构建最终的消息,显示在消息框中。