07 Qt服务应用操作实战

注:本章内容对于个人 非重点,后续如有需要深入学习需求需查阅其他资料。

01 INI文件操作

ini文件概述:

.ini文件是Initialization File的缩写,即初始化文件,是Windows的系统配置文件所采用的存储格式。

文件扩展名:配置文件名称.ini。比如项目中的配置文件是整个项目共用的,假设:数据库配置.ini。

(1)INI文件由节、键、值三个部分组成:

节:[section]

参数

(键=值)

name=value;

注意:分号表示(在分号后面的相关字符等信息,直到该行结尾都全部为注解内容)。

比如:

[sectionname]

[Keynames=values]

(2)Qt如何读取INI文件

在整个操作过程当中,Qt使用QSetting进行操作读写文件。

常用API函数:

QSetting::beginGroup:在INI文件中添加索引,根据索引读取相关对应的值。

QSetting::endGroup:将这个组重置,然后调用之前的相关状态。

QSetting::setValue:专门向INI文件写入数据信息,以键值对的形式写入对应的INI文件中,如果键值存在,直接覆盖。

QSetting::value:从INI文件读取信息返回键的值,如果这个键不存在,返回一个默认的值。

QSetting::Group:返回组名。

QSetting::beginWriteArray:将前缀添加到当前组,并且开始写入,大小为数组,根据写入的相关条目索引自动确定。

QSetting::beginReadArray:将前缀添加到当前组,并且从数组中读取返回整个数组的大小。

QSetting::endArray:不管是读还是写,都要通过该函数关闭所操作的数组。

 QSetting::NativeFormat:当我们使用参数时候,NativeForm使用平台最合适的存储格式,在Windows系统中使用系统注册表,在Unix中使用INI文件的文本配置文件。

QSetting::IniFormat:存储在INI文件中进行设置。

QSetting::InvalidFormat:直接返回值。

Unix系统当中,NativeFormat/IniFormat(区别在于文件扩展名不一样:.conf/.ini)。

案例:读写INI文件

(1)创建Qt COnsole Application项目

(2)添加头文件

(3)添加源文件

 (4)修改"wrinifile.h"文件

#ifndef WRINIFILE_H
#define WRINIFILE_H

void WriteIniFile();    //写配置文件
void ReadIniFile();     //读配置文件

void ReadIniFileIsKey();             //一次性读取文件


#endif // WRINIFILE_H

 (5)修改"wrinifile.cpp"文件

#include "wrinifile.h"
#include <QSettings>
#include <QDebug>

void WriteIniFile()    //写配置文件
{
    //直接使用QSetting类读写INI文件
    QSettings *ConfigWriteIniFiles = new QSettings("MySQLFiles.ini",QSettings::IniFormat);

    //向INI文件中写入数据信息
    ConfigWriteIniFiles->setValue("/database/ip","192.168.12.189");            //第一节的第一个参数
    ConfigWriteIniFiles->setValue("/database/port","3308");
    ConfigWriteIniFiles->setValue("/database/user","root");
    ConfigWriteIniFiles->setValue("/database/password","123456");

    ConfigWriteIniFiles->setValue("/notice/version","6.4");
    ConfigWriteIniFiles->setValue("/notice/datetime","2024.07.11 22:06");

    //向INI文件写入完成之后,删除指针
    delete ConfigWriteIniFiles;
}
void ReadIniFile()     //读配置文件
{
    //直接使用QSetting类读INI文件
    QSettings *ConfigReadIniFiles = new QSettings("MySQLFiles.ini",QSettings::IniFormat);
    QString strip = ConfigReadIniFiles->value("database/ip").toString();
    QString strport = ConfigReadIniFiles->value("database/port").toString();
    QString struser = ConfigReadIniFiles->value("database/user").toString();
    QString strpassword = ConfigReadIniFiles->value("database/password").toString();

    QString strversion = ConfigReadIniFiles->value("/notice/version").toString();
    QString strdatetime = ConfigReadIniFiles->value("/notice/datetime").toString();
    //输出读取配置文件的参数信息
    qDebug()<<"读取INI配置文件参数选项如下:";
    qDebug()<<"MySQL IP地址:"<<strip.toUtf8().data();
    qDebug()<<"数据库端口:"<<strport.toUtf8().data();
    qDebug()<<"数据库用户名:"<<struser.toUtf8().data();
    qDebug()<<"数据库密码:"<<strpassword.toUtf8().data();
    qDebug()<<"数据库版本:"<<strversion.toUtf8().data();
    qDebug()<<"数据库时间:"<<strdatetime.toUtf8().data();

}


void ReadIniFileIsKey()             //一次性读取文件
{
    QSettings setting(".MySQLFiles.ini",QSettings::IniFormat);
    foreach(QString key,setting.allKeys())
    {
        qDebug()<<key.toUtf8().data()<<","<<setting.value(key).toString().toUtf8().data();
    }
}

 (6)修改"main.cpp"文件

#include <QCoreApplication>
#include "wrinifile.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
//    WriteIniFile();
//    ReadIniFile();            //调用读取配置文件
    ReadIniFileIsKey();         //整体读取INI文件
    return a.exec();
}

 02 JSON文件操作

001 json文件概述

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于阅读和编写,可以在多种语言之间进行数据交换。同时也易于机器解析和生成,并有效地提升网络传输效率。采用完全独立于编程语言地文本格式来存储和表示数据。简洁和清晰地层次结构使得JSON成为理想地数据交换语言。

JSON文件扩展名是.json。

JSON使用场景:配置文件、序列化、定义接口等等。

JSON是存储和交换文本信息的语法,类似XML,比XML更小、更快、更加容易解析。

002 json语法规则

JSON是一个标记符的序列。这套标记符包含六个构造字符字符串数字和三个字面名

JSON是一个序列化的对象数组

(1)六个构造字符:

构造字符符号含义
begin-array=ws %x5B ws;[左方括号
begin-object=ws %x7B ws;{左大括号
end-array=ws %x5D ws;]右方括号
end-object=ws %x7D ws;}右大括号
name-separator=ws %x3A ws;:冒号
value-separator=ws %x2C ws;,逗号

(2)在这六个构造字符的前或后允许存在无意义的空白符(ws):

符号含义
ws = *(%x20 /空间
%x09 /水平标签
%x0A /换行
%x0D)回程

(3)JSON的值:

1)JSON的构成: ws 值 ws。

2)可以是对象、数组、数字、字符串或者三个字面值(false、null、true)中的一个。值中的字面值中的英文必须使用小写。

①对象由花括号括起来的逗号分割的成员构成,成员是字符串键和上文所述的值由逗号分割的键值对组成,如:

 {"name": "John Doe", "age": 18, "address": 
{"country" : "china", "zip-code": "10000"}}

JSON中的对象可以包含多个键值对,并且有数组结构,该语言正是一次实现过程内容的描述。

数组是由方括号括起来的一组值构成,如:

[3, 1, 4, 1, 5, 9, 2, 6]

字符串与C或者Java的字符串非常相似。字符串是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。

数字也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。

一些合法的JSON的实例:

{"a": 1, "b": [1, 2, 3]}
[1, 2, "3", {"a": 4}]
3.14
"plain_text"

 003 json与js对象的关系

JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。

var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串

 004  json和js对象互转

要实现从JSON字符串转换为JS对象,使用 JSON.parse() 方法:

var obj = JSON.parse('{"a": "Hello", "b": "World"}'); //结果是 {a: 'Hello', b: 'World'}

 要实现从JS对象转换为JSON字符串,使用 JSON.stringify() 方法:

var json = JSON.stringify({a: 'Hello', b: 'World'}); //结果是 '{"a": "Hello", "b": "World"}'

 005 常用类型

任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型。

对象:对象在 JS 中是使用花括号包裹 {} 起来的内容,数据结构为 {key1:value1, key2:value2, ...} 的键值对结构。在面向对象的语言中,key 为对象的属性,value 为对应的值。键名可以使用整数和字符串来表示。值的类型可以是任意类型。

数组:数组在 JS 中是方括号 [] 包裹起来的内容,数据结构为 ["java", "javascript", "vb", ...] 的索引结构。在 JS 中,数组是一种比较特殊的数据类型,它也可以像对象那样使用键值对,但还是索引使用得多。同样,值的类型可以是任意类型。

006 基础示例分析

简单地说,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式,例如在 PHP 中,可以将 JSON 还原为数组或者一个基本对象。在用到AJAX时,如果需要用到数组传值,这时就需要用JSON将数组转化为字符串。 

0001 表示对象

对象是一个无序的“‘名称/值’对”集合。一个对象以{左括号开始,}右括号结束。每个“名称”后跟一个:冒号;“‘名称/值’ 对”之间使用,逗号分隔。

{"firstName": "Brett", "lastName": "McLaughlin"} 

0002 表示数组

和普通的 JS 数组一样,JSON 表示数组的方式也是使用方括号 []。

{ 
"people":[ 
{
"firstName": "Brett",            
"lastName":"McLaughlin"        
},      
{        
"firstName":"Jason",
"lastName":"Hunter"
}
]
}

在这个示例中,只有一个名为 people的变量,值是包含两个条目的数组,每个条目是一个人的记录,其中包含名和姓。上面的示例演示如何用括号将记录组合成一个值。当然,可以使用相同的语法表示更过多的值(每个值包含多个记录)。

在处理 JSON 格式的数据时,没有需要遵守的预定义的约束。所以,在同样的数据结构中,可以改变表示数据的方式,也可以使用不同方式表示同一事物。

如前面所说,除了对象和数组,你也可以简单地使用字符串或者数字等来存储简单的数据,但这样并没有多大意义。

案例:

(1)创建"Dialog"文件(带ui文件)

(2)编辑UI文件

(3)修改头文件

#ifndef QJSONOPER_H
#define QJSONOPER_H

#include <QDialog>
#include <QMessageBox>

QT_BEGIN_NAMESPACE
namespace Ui { class qjsonoper; }
QT_END_NAMESPACE

class qjsonoper : public QDialog
{
    Q_OBJECT

public:
    qjsonoper(QWidget *parent = nullptr);
    ~qjsonoper();

private slots:
    void on_pushButton_2_clicked();

    void on_pushButton_clicked();

private:
    Ui::qjsonoper *ui;
};
#endif // QJSONOPER_H

(4)修改源文件

#include "qjsonoper.h"
#include "ui_qjsonoper.h"


#include <QMessageBox>
#include <QDebug>

#include <QFile> // 文件读写

#include <QJsonDocument> // JSON文档
#include <QJsonObject> // JSON对象
#include <QJsonParseError> // JSON异常捕捉



qjsonoper::qjsonoper(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::qjsonoper)
{
    ui->setupUi(this);
}

qjsonoper::~qjsonoper()
{
    delete ui;
}

// 将数据信息-->写入JSON文件
void qjsonoper::on_pushButton_2_clicked()
{
    // 1:创建json对象
    QJsonObject mysqinfo;

    mysqinfo.insert("ip","192.168.0.125");
    mysqinfo.insert("port",3308);
    mysqinfo.insert("user","root");
    mysqinfo.insert("password","123456");

    QJsonObject jsonifo;
    jsonifo.insert("code",1);
    jsonifo.insert("dbmsg","MySQL数据库配置参数");
    jsonifo.insert("data",mysqinfo); // 将json对象作为Json对象插入的数据值

    // 2: 创建JSON文档
    QJsonDocument jsondoc;
    jsondoc.setObject(jsonifo);

    // 3: 创建文件
    QFile qfiles("./databasejsonfiles.json");
    if(qfiles.open(QIODevice::WriteOnly))
    {
        qfiles.write(jsondoc.toJson());
        qfiles.close();
        qDebug()<<"恭喜你,json数据文件写入成功!";
    }
    QMessageBox::information(this,"写入成功","恭喜你,json数据文件写入成功!");

}

void qjsonoper::on_pushButton_clicked()
{
    QString strjson;

    QString strmsg;

    QFile qfiles("./databasejsonfiles.json");
    if(qfiles.open(QIODevice::ReadOnly))
    {
        strjson=qfiles.readAll();
        qfiles.close();
    }

    QJsonParseError jsonerror; // 返回JSON解析错误的时候,报告错误信息
    QJsonDocument jsondoc=QJsonDocument::fromJson(strjson.toUtf8(),&jsonerror);

    QString strtemp;
    if(!jsondoc.isEmpty() && (jsonerror.error==QJsonParseError::NoError))
    {
        // 只要jsondoc不为空,和jsonerror没有错误
        // 将它转换为JSON对象
        QJsonObject json=jsondoc.object();
        QJsonValue code=json.value("code");
        QJsonValue data=json.value("data");

        // 检查数据
        if(code.isUndefined() || code.toDouble()!=1 || data.isUndefined() || !data.isObject())
        {
            qDebug()<<"转换JSON数据错误,请重新检查?";
            QMessageBox::critical(this,"错误","转换JSON数据错误,请重新检查?");
            exit(100);
        }

        // 如果没有错误,读取data数据信息
        QJsonObject databaseinfo=data.toObject();

        QJsonValue dbip=databaseinfo.value("ip");
        QJsonValue dbport=databaseinfo.value("port");
        QJsonValue dbuser=databaseinfo.value("user");
        QJsonValue dbpassword=databaseinfo.value("password");

        // 检查接口是否正确
        if(dbip.isUndefined()||
                dbport.isUndefined()||
                dbuser.isUndefined()||
                dbpassword.isUndefined())
        {
            qDebug()<<"接口错误,请重新检查?";
            QMessageBox::critical(this,"错误","接口错误,请重新检查?");
            exit(100);
        }

        QString strip=dbip.toString();
        int iport=dbport.toInt();
        QString struser=dbuser.toString();
        QString strpassword=dbpassword.toString();

        // 判断每一项配置是否为空
        if(strip.isEmpty() || struser.isEmpty() || strpassword.isEmpty())
        {
            qDebug()<<"此数据项不能为空,请重新检查?";
            QMessageBox::critical(this,"错误","此数据项不能为空,请重新检查?");
            exit(100);
        }

        qDebug()<<"数据库IP地址:"<<strip;
        qDebug()<<"数据库端口:"<<iport;
        qDebug()<<"数据库用户:"<<struser;
        qDebug()<<"数据库密码:"<<strpassword;

        // 拼接字符串
        strmsg+="【JSON配置参数】";
        strmsg+="\n数据库IP地址:"+strip;
        strmsg+="\n数据库端口:"+QString::number(iport,10);
        strmsg+="\n数据库用户:"+struser;
        strmsg+="\n数据库密码:"+strpassword;

    }

    QMessageBox::information(this,"成功",strmsg,QMessageBox::Yes);

}

(5)结果演示

 03 XML文件操作 

XML文件基础:
可扩展标记语言(Extensible Markup Language,XML),标准通用标记语言的子集,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML是标准通用标记语言,可扩展性良好,内容与形式分离,遵循严格的语法要求,保值性良好等优点。

XML语言可以从Html中分离数据,能够在html文件之外将数据存储在XML文档之中,开发者将精力投入到html文件布局中,并且确保数据在改动时不会导致html文件也需要改动。

XML文件可用于交换数据,共享数据,充分利用数据。XML同软件硬件无任何关系,数据可以被很多用户或设备使用,不仅仅局限于html浏览格式。

XML可用于创建新的语言,主要用于基于Web应用。

XML文档中大小写是有区别的,大小写表示不同的标记,在写元素的时候,尽可能保证大小写一致。XML文档有且仅有一个根元素,属性值使用引号,所有标记必须有相应的结束标记,所有的空标记(标记之间没有内容的标记)也必须被关闭。

推荐课程:

https://xxetb.xetslk.com/s/vgpHh

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值