Qt编程指南
- ■ SQLite
- ■ CSV
- ■ JSON
■ SQLite
Qt 提供了很多操作数据库的类,
SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于 250KiB。 SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。就像其他数据库, SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。 SQLite 可以直接访问其存储文件。
QSqlDatabase 类用于建立数据库的连接,往往以指定加载的数据库驱动,然后设置数据库的登录参数,如主机地址,用户名、登录密码等。这些都是服务器类型的数据库所需要做的操作
在 QSqlDatabase 连接数据库后,用 QSqlTableModel 从数据库里读取出表格模型,然后通过 Qt 的 QTableView 类显示数据库的内容在我们面前。
/*需要添加模块*/
QT += sql/* 查看本机可用的数据库驱动 */
QStringList drivers = QSqlDatabase::drivers();
foreach(QString driver, drivers) {qDebug()<<driver;
}/* 以QSQLITE驱动方式打开或者创建数据库 */
sqlDatabase = QSqlDatabase::addDatabase("QSQLITE");
sqlDatabase.setDatabaseName("alarm.db");
/* 以open的方式打开alarm.db数据库,则会创建一个alarm.db */
if (!sqlDatabase.open())qDebug()<<"连接数据库错误"<<sqlDatabase.lastError()<<endl;
elseqDebug()<<"连接数据库成功"<<endl;QSqlQuery query(sqlDatabase);/* 使用指令式创建表 */
query.exec("create table alarm (id int primary key, time vchar(15), flag vchar(5))"); // primary 说明id不能为空
/* 以指令的方式插入数据 */
//query.exec("insert into alarm values(0, '06:00', 'false')");model = new QSqlTableModel(this, sqlDatabase);
/* 模型设置表的名字,需要与数据库的表的名字相同 */
model->setTable("alarm");/* 如果有修改则同步修改到数据库,* 注意这个规则需要与tabview这样的控件才生效,* 因为tabview可以直接编辑表里的内容 */
model->setEditStrategy(QSqlTableModel::OnFieldChange);
/* 成功则返回true,查看数据库里是否有alarm这个表格 */
model->select();/* 如果数据表数据为空,则添加两个闹钟 */
if (model->rowCount() == 0) {/* 插入一行 */model->insertRow(model->rowCount());/* 在该行插入数据 */model->setData(model->index(0, 0), 1);model->setData(model->index(0, 1), "06:00");model->setData(model->index(0, 2), "false");/* 插入数据后记得提交 */model->submit();/* 再插入一行 */model->insertRow(model->rowCount());model->setData(model->index(1, 0), 2);model->setData(model->index(1, 1), "18:00");model->setData(model->index(1, 2), "true");/* 提交 */model->submit();
}/* 打印出闹钟数据库里的信息 */
for (int i = 0; i < model->rowCount(); i++) {for (int j = 0; j < 3; j++) {QModelIndex qindex = model->index(i, j);switch (j) {case 0:qDebug()<<"第"<< model->data(qindex).toInt()<<"行数据";break;case 1:listWidget->addItem(model->data(qindex).toString());qDebug()<<"闹钟时间为:"<< model->data(qindex).toString();break;case 2:qDebug()<<"闹钟状态为:" << model->data(qindex).toString()<<endl;if (model->data(qindex).toString() != "true")listWidget->item(i)->setTextColor(QColor(22, 22, 22, 60));elselistWidget->item(i)->setTextColor(QColor(22, 22, 22, 225));break;default:break;}}
}/* 获取数据库里的闹钟开关状态 */
QModelIndex qindex = model->index(i, 2);
bool sw = model->data(qindex).toBool()/*设置数据库里的闹钟开关状态 */
QModelIndex qindex = model->index(i, 2);
model->setData(qindex, "true");
■ CSV
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),
■ JSON
QJsonValue
void remove(const QString &key);
QJsonValue take(const QString &key);
bool contains(const QString &key) const;
void remove(QStringView key);
void remove(QLatin1String key);
QJsonValue take(QStringView key);
QJsonValue take(QLatin1String key);
bool contains(QStringView key) const;
bool contains(QLatin1String key) const;QJsonArray
删除数组 i;
void removeAt(int i); //jArray.removeAt(0); //ok //删除第0项
QJsonValue takeAt(int i); //qDebug() << jArray.takeAt(0).toInt() << endl; //删除第0项并返回值
替换:
QJsonArray jArray= configJson->RootObj().value("IP").toArray();
jArray.insert(3,jArray); //ok
jArray.replace(3,jArray); //ok
jArray[4]= 12; //无效 数组越界无效
jArray[0]= 54; //ok
(*configJson->RootObjPointer())["IP"]=jArray; //获取指针方式修改“IP”
configJson->savejsonfile();
QJsonObject
是否包含
是否包含Student
QJsonObject obj=doc.object();
if(obj.contains("Student"))
{
}/*创建对象并转换成QByteArray*/
QJsonObject rootobj;
rootobj["sn"] = 20001;
rootobj["type"] = "hub";
QJsonDocument jsonDoc(rootobj);
QByteArray byte=jsonDoc.toJson(); //按照json风格生成字符串,自动缩进,有空格和\n \t ; 数据量大
QByteArray byte=jsonDoc.toJson(QJsonDocument::Compact);//传入参数获取压缩后的序列化结果,紧凑格式,直接生成一堆字符串,但是占用控件小/*QByteArray转换成QJsonDocument,并得到数据*/
QJsonDocument jsonDoc1 = QJsonDocument::fromJson(byte); //QByteArray转换成文档对象
QJsonObject obj1 = jsonDoc1.object();
qDebug() << "obj1=" << obj1["sn"].toInt() << obj1["type"].toString() << endl;插入
jsonObject.insert("name", QString::number(i+1));
jsonObject.insert("age", i+18);
jsonObject.insert("time", QDateTime::currentDateTime().toString());json说明
/*【】是用来填充数据使用 */
(*configJson->RootObjPointer())["IP"]=jArray;
/*.value 这种方式是用来获取数据*/
(*configJson->RootObjPointer()).value("IP")=jArray;json注意事项:
数组中不能是00 "NightMode": [18, 00, 0, 6, 0, 0] //解析不出来
数组中是int类型的数据 不要用QString 去替换,会不成功。
修改json类型要修改他的指针,重新填充数据要重新赋值给上层的父类,保存才能达到效果,不能获取的只是临时变量。(如下例子)QJsonArray jArray= configJson->RootObj().value("IP").toArray();
jArray[4]= 12; //无效 (数组越界 )
jArray.insert(3,jArray); //ok (可以插入任意类型 )
jArray.replace(3,jArray); //ok (可以替换任意类型 )
jArray[0]= 54; //ok (数组不越界 )
(*configJson->RootObjPointer())["IP"]=jArray; //Ok (通过指针来获取“IP”,并赋值)
configJson->savejsonfile();案例1:
QString fileName = QCoreApplication::applicationDirPath();
fileName+="/pdoctor.json";
doctorjson = new Json(fileName);
QJsonArray doctor = doctorjson->Obj()["data"].toArray();
int row = doctor.count();
for (int i=0;i<row;i++)
{
}
doctor.at(i).toObject()["advice"].toObject()["adviceSeq"].toInt();
doctor.at(i).toObject()["advice"].toObject()["drugName"].toString();
doctor.at(i).toObject()["advice"].toObject()["adviceType"].toInt();
doctor.at(i).toObject()["advice"].toObject()["freq"].toString();
doctor.at(i).toObject()["advice"].toObject()["drugvolume"].toDouble();
doctor.at(i).toObject()["advice"].toObject()["drugDensity"].toDouble();案例2:
案例3:
/*****************************************************************************************/
QByteArray byte;
QFile file(file_path);
if(file.exists()){file.open(QIODevice::ReadOnly|QIODevice::Text);byte=file.readAll();file.close();
}
else
{cout<<"openFileError"<<endl;;
}
QJsonParseError json_error;
QJsonDocument jsonDoc(QJsondocument::fromJson(byte,&json_error));
if(json_error.err!=QJsonParseError::NoError)
{cout<<" json error "<<endl;
}
QJsonObject rootobj=jsonDoc.object();
//一般需要使用 rootobj.contains(xxx) 判断一下是否存在 这里我们就默认是存在的 。QJsonObject A_obj=rootobj.value("A").toObject();
A_obj["AA"]=33;QJsonArray B_array=rootobj.value("B").toArray();
QJsonObject B_Subobj=B_array[0].toObject();
QJsonArray b_array=B_Subobj.value("BB").toArray();
b_array.replace(0,"BBB");
B_Subobj["BB"]=b_array;
B_array.replace(0,B_Subobj);QJsonObject C_obj=rootobj.value("C").toObject();
QJsonArray c_array=C_obj.value("CC").toArray();
c_array.replace(0,"CCC");
C_obj["CC"]=c_array;rootobj["A"]=A_obj;
rootobj["B"]=B_array;
rootobj["C"]=C_obj;QFile file(file_path);
if(file.exists()){file.open(QIODevice::WriteOnly|QIODevice::Text);jsonDoc.setObject(rootobj);file.seek(0);file.write(jsonDoc.toJson());file.flush();file.close();
}dock案例:
#include "json.h"
Json::Json(QString fileName)
{jsonName=fileName;openjsonfile(jsonName);
}Json::~Json()
{savejsonfile();
}void Json::openjsonfile(QString name)
{if(QFile::exists(name)){QByteArray byte;QJsonDocument jsonDoc;QFile file;file.setFileName(name);file.open(QFile::ReadOnly|QIODevice::Text);byte= file.readAll();jsonDoc = QJsonDocument::fromJson(byte);//转换成文档对象if(jsonDoc.isObject()){ //判断文档对象中存储的数据是不是json对象isfile = true;rootobj = jsonDoc.object();//得到rootJson对象file.close();}}else{isfile = false;}
}
void Json::savejsonfile()
{QFile file;QJsonDocument jsonDoc(rootobj); //将Json对象,转换成Json文档
// jsonDoc.setObject(rootobj);file.setFileName(jsonName);file.open(QFile::WriteOnly|QIODevice::Text);file.seek(0);file.write(jsonDoc.toJson());file.flush();file.close();
}int Json::getKeyIntVal(QString key)
{return rootobj[key].toInt();
}QString Json::getKeyStringVal(QString key)
{return rootobj[key].toString();
}bool Json::getKeyBoolVal(QString key)
{return rootobj[key].toBool();
}//读取空值(因其没有对应的to类型函数,可使用下方类型接收或isNull()函数判断)
QVariant Json::getKeyVarialVal(QString key)
{return rootobj[key].toVariant();
}QJsonObject Json::getKeyQJsonObject(QString key)
{return rootobj[key].toObject();
}QJsonArray Json::getKeyQJsonArray(QString key)
{return rootobj[key].toArray();
}int Json::getArrayIndexIntVal(QString key, int index)
{return rootobj[key].toArray().at(index).toInt();
}QJsonObject Json::RootObj()
{return rootobj;
}QJsonObject* Json::RootObjPointer()
{return &rootobj;
}bool Json::getisfile()
{return isfile;
}void Json::insertKeyIntVal(QString key, int valu)
{rootobj[key]=valu;
}/*
*
*netjson->insertKeyBoolVal("NightMode",true); ok
*/
void Json::insertKeyBoolVal(QString key, bool valu)
{rootobj[key]=valu;
}/*
*netjson->insertKeyStringVal("NightMode","opopopo"); Ok
*/
void Json::insertKeyStringVal(QString key, QString valu)
{rootobj[key]=valu;
}/*
* QJsonArray c_JsArr;
* c_JsArr.append(12);
* c_JsArr.append(32);
* netjson->insertKeyArrayVal("NightMode",c_JsArr); //Ok
*/
void Json::insertKeyArrayVal(QString key, QJsonArray array)
{rootobj[key]= array;
}/*
* QJsonObject jsobject;jsobject["opo"] = "qqqqqq";jsobject["op1"] = 12;jsobject["op2"] = true;jsobject["op3"] = "rrrrrr";netjson->insertKeyObjectVal("NightMode",jsobject);
*
*/
void Json::insertKeyObjectVal(QString key, QJsonObject jsobject)
{rootobj[key]=jsobject;
}/*
* netjson->replaceKeyArrayIndexVal("NightMode",5,10); //ok
**/
void Json::replaceKeyArrayIndexVal(QString key, int index, int valu) //valu 为 QString 不能替换
{QJsonArray c_JsArr = rootobj.value(key).toArray();c_JsArr.replace(index,valu);rootobj[key]=c_JsArr;
}/* 数组里面添加QJsonArray
* QJsonArray c_JsArr;
* c_JsArr.append(12);
* c_JsArr.append(32);
* c_JsArr.replace(0,24); //替换
* netjson->insertArrayKeyAddArrayVal("NightMode",0,c_JsArr);
*/void Json::insertArrayKeyAddArrayVal(QString key, int index, QJsonArray valu)
{QJsonArray c_JsArr = rootobj.value(key).toArray();c_JsArr[index] = valu;rootobj[key]=c_JsArr;
}/*
* 数组里面添加QJsonObject
* QJsonObject jsobject;
* jsobject["opo"] = "qqqqqq";
* jsobject["op1"] = 12;
* jsobject["op2"] = true;
* jsobject["op3"] = "rrrrrr";
* netjson->insertArrayKeyAddObjectVal("NightMode",0,jsobject);
*/
void Json::insertArrayKeyAddObjectVal(QString key, int index, QJsonObject jsobject)
{QJsonArray c_JsArr = rootobj.value(key).toArray();c_JsArr[index] = jsobject;rootobj[key]=c_JsArr;
}#ifndef JSON_H
#define JSON_H#include <QtWidgets/QWidget>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonValue>
#include <QDebug>
#include <QString>
#include <QByteArray>
#include <QFile>class Json
{
public:Json(QString file);~Json();void openjsonfile(QString name);void savejsonfile();int getKeyIntVal(QString key);QString getKeyStringVal(QString key);bool getKeyBoolVal(QString key);QVariant getKeyVarialVal(QString key);QJsonArray getKeyQJsonArray(QString key);QJsonObject getKeyQJsonObject(QString key);int getArrayIndexIntVal(QString key, int index);QJsonObject RootObj();QJsonObject* RootObjPointer();bool getisfile();//将键值对添加到Json对象中void insertKeyIntVal(QString key,int valu);void insertKeyBoolVal(QString key,bool valu);void insertKeyStringVal(QString key,QString valu);void insertKeyArrayVal(QString key,QJsonArray array);void insertKeyObjectVal(QString key, QJsonObject jsobject);void replaceKeyArrayIndexVal(QString key, int index, int valu);void insertArrayKeyAddArrayVal(QString key, int index, QJsonArray valu);void insertArrayKeyAddObjectVal(QString key, int index, QJsonObject jsobject);
private:QString jsonName;QJsonObject rootobj;bool isfile ;
};#endif // JSON_H