【Qt-数据库】

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/580100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cesium问题汇总

引入图片报错&#xff0c;Error loading image for billboard: [object Event] 解决方法&#xff1a;可以import或require引入一下再应用

C# WPF上位机开发(扩展上位机之外的技能)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 如果把c# wpf只是看成是一个做界面的框架&#xff0c;那确实有点狭隘了。单独的上位机软件&#xff0c;如果不需要上下游的支持&#xff0c;没有与…

hive中struct相关函数总结

目录 hive官方函数解释示例实战 hive官方函数解释 hive官网函数大全地址&#xff1a;添加链接描述 Return TypeNameDescriptionstructstruct(val1, val2, val3, …)Creates a struct with the given field values. Struct field names will be col1, col2, …structnamed_str…

linux中top参数详解

top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器 top参数详解 第一行&#xff0c;任务队列信息&#xff0c;同 uptime 命令的执行结果 系统时间&#xff1a;07:27:05 运行时间&#xff1a;up …

Oracle查询重复数据取第二行,好用来删除重复数据

Oracle查询重复数据取第二行&#xff0c;好用来删除重复数据 SELECT * FROM ( SELECT e.* , ROW_NUMBER() over(PARTITION BY product_category_id,model_size_id ORDER BY product_category_id,model_size_id) rn FROM equ_check_rules e ) s WHERE rn 2;

微信小程序的bindtap和catchtap的区别

一. 事件 1.事件是视图层到逻辑层的通讯方式。 2. 事件可以将用户的行为反馈到逻辑层进行处理。 3. 事件可以绑定在组件上&#xff0c;当达到触发事件&#xff0c;就会执行逻辑层中对应的事件处理函数。 二. 如何使用事件 1. 简单来说就是将事件绑定到组件上面&#xff0c;bi…

Plantuml之序列图语法介绍(十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

阿里云服务器华北3(张家口)暂时无法办理经营性ICP许可证

阿里云服务器的华北 3&#xff08;张家口&#xff09;地域暂时无法办理经营性ICP许可证&#xff0c;如有经营性ICP业务请勿选择此地域。如果需要办理经营性ICP业务的用户&#xff0c;不需要选择华北3&#xff08;张家口&#xff09;地域&#xff0c;可以选择华北2&#xff08;北…

springboot对接WebSocket实现消息推送

1.修改pom文件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency> 2.增加配置WebSocketConfig.java import org.springframework.context.annotation.Bean…

实训4---硬件部分---点灯实验--按键控制灯实验--uart串口实验

目录 三、硬件部分 【1】点灯实验 【2】按键控制灯实验 【3】uart串口实验 核心代码&#xff1a; 实验视频 实现流水灯 uart串口实验 三、硬件部分 GPIO 【1】点灯实验 1.首先找到要点的灯&#xff0c;在板子上看到对应的白色丝印&#xff0c;比如绿灯D10.然后打开底板…

服务器数据恢复-raid6离线磁盘强制上线后分区打不开的数据恢复案例

服务器数据恢复环境&#xff1a; 服务器上有一组由12块硬盘组建的raid6磁盘阵列&#xff0c;raid6阵列上层有一个lun&#xff0c;映射到WINDOWS系统上使用&#xff0c;WINDOWS系统划分了一个GPT分区。 服务器故障&分析&#xff1a; 服务器在运行过程中突然无法访问。对服务…

【开题报告】基于SpringBoot的篮球社团管理系统设计与实现

1.研究背景 基于Spring Boot的篮球社团管理系统设计与实现的选题背景可以从以下几个方面展开&#xff1a; 社团管理需求&#xff1a; 在大学校园和社区中&#xff0c;篮球社团是一个非常活跃的组织形式&#xff0c;拥有众多会员和参与者。然而&#xff0c;传统的社团管理方式…

(二)MaterializedMySQL具体实施步骤举例

要将 MySQL 中的 test 数据库实时同步到位于同一台服务器&#xff08;IP 地址为 192.168.197.128&#xff09;上的 ClickHouse&#xff0c;您可以使用 MaterializedMySQL 引擎。以下是详细的步骤&#xff1a; 1. 准备工作 确保您的 MySQL 和 ClickHouse 服务都在运行&#xf…

四种NAT的网络结构

四种NAT的网络结构 引言1 完全圆锥型NAT2 IP限制圆锥型NAT3 Port限制圆锥型NAT4 对称型NAT5 总结 引言 NAT是将内网地址映射转换为外网地址的一种地址转换方式&#xff0c;这节省了有限的IP地址资源。一般来讲&#xff0c;分为对称型NAT和圆锥形NAT&#xff0c;其中圆锥形NAT又…

企业微信服务商代开发模式获取授权企业的客户信息

服务商代开发素材&#xff1a; 服务商可信ip 企业微信认证 测试时不用再次创建一个企业微信&#xff0c;可以用当前的企业微信作为授权企业使用一、创建代开发应用模板 1&#xff0c;代开发模板回调URL配置 参考 注意&#xff1a;保存代开发应用模板时的corpId是服务商的企业…

什么是EMC工程师?

摘要: 今天来介绍一下什么是EMC工程师。一 EMC工程师起源要了解什么是EMC工程师&#xff0c;我们首先要了解什么是EMC。 今天来介绍一下什么是EMC工程师。 一 EMC工程师起源 要了解什么是EMC工程师&#xff0c;我们首先要了解什么是EMC。 工程师这个职业相信大家都耳熟能详…

八股文打卡day11——计算机网络(11)

面试题&#xff1a;HTTP多个TCP连接怎么实现&#xff1f; 我的回答&#xff1a; 1.HTTP1.0的时候&#xff0c;一个TCP连接只能进行一次请求响应。可以建立多个连接到服务器&#xff0c;这样就可以同时进行多个请求响应&#xff0c;提高传输效率。 2.HTTP1.1推出了持久连接&am…

latexshop 使用bug:xxx has a comma at the end

20231226 “has a comma at the end” 应该是latexshop某次更新之后出现该问题&#xff1a; https://tex.stackexchange.com/questions/156377/when-running-bibtex-with-a-statement-that-has-a-comma-at-the-end-this-is-obscur 解决方案也很匪夷所思&#xff0c;只要在作者…

1.决策树

目录 1. 什么是决策树? 2. 决策树的原理 2.1 如何构建决策树&#xff1f; 2.2 构建决策树的数据算法 2.2.1 信息熵 2.2.2 ID3算法 2.2.2.1 信息的定义 2.2.2.2 信息增益 2.2.2.3 ID3算法举例 2.2.2.4 ID3算法优缺点 2.2.3 C4.5算法 2.2.3.1 C4.5算法举例 2.2.4 CART算法 2.2.4…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十六:统计报表模块相关功能实现

一、本章内容 本章使用Echarts及DataV实现常用图表、特殊图表、地图及综合图表等图表展示功能。 1. 详细课程地址: https://edu.csdn.net/course/detail/38183 2. 源码下载地址: 点击下载 二、界面预览 三、开发视频 3.1 B站视频地址: 基于VUE3+Layui从