QT读写JSON文件保存Mysql连接字符串密码并加密解密字符串密码
注意:解密需要重复运行加密代码两次即可解密。
Json文件写入时,不可以用资源文件里的文件,因为QT不容许写入资源文件,但是可以读取。
void HelpDeskClientDialog::on_pushButton_Settings_Save_clicked()
{
QString filepath = QCoreApplication::applicationDirPath();
QFile settingFile2(filepath + "/setting/setting.json");
QFileInfo info(settingFile2);
if(settingFile2.open(QIODevice::WriteOnly|QIODevice::Text))
{
QJsonObject jsonObject;//构建json对象json
QString encyPassword = EncryptionStr (ui->lineEdit_Password->text ());
jsonObject.insert("dataBaseHostName", ui->lineEdit_IP->text ());
jsonObject.insert("dataBasePort", ui->lineEdit_Port->text ());
jsonObject.insert("dataBaseUserName", ui->lineEdit_LoginName->text ());//ui->lineEdit_LoginName->text ());
jsonObject.insert ("dataBasePassWord", encyPassword); //写入json数据到本地文件,
QJsonDocument document;
document.setObject(jsonObject);
QString jsonStr(document.toJson(QJsonDocument::Indented));
settingFile2.write(jsonStr.toUtf8 ());
settingFile2.flush();
QMessageBox::information (this, "Success", "Your configuration were saved successful!");
}
else
{
QMessageBox::warning (this, "Error", "Sorry, your configuration were saved failure, pls double check!");
}
settingFile2.close();
}
void HelpDeskClientDialog::loadSetting()
{
QFile settingFile;
settingFile.setFileName(":/setting/setting.json");
if(settingFile.open(QFile::ReadOnly))
{
// 读取json文件的内容,当前读取的内容可能是错误的,因为json文件不能有注释,而我在json中添加了注释,所以需要把注释内容去掉
QByteArray setting = settingFile.readAll().trimmed();
// 循环删除掉注释内容
while (setting.contains("/*") && setting.contains("*/"))
{
int start = setting.indexOf("/*"); // 注释左索引(这里会返回左斜杠所在索引值)
int end = setting.indexOf("*/") + 1; // 注释右索引(这里会返回*所在索引值,所以我们需要+1,将索引值切换到左斜杠位置)
setting = setting.remove(start, (end - start) + 1); // 移除 /* xxxx */ 这一块的注释内容,(结束索引-开始索引+1)是整个注释内容的长度
}
QJsonParseError jsonError;
QJsonDocument jsonDoc(QJsonDocument::fromJson(setting, &jsonError));
if(jsonError.error == QJsonParseError::NoError)
{
QJsonObject rootObj = jsonDoc.object();
dataBaseHostName = rootObj.value("dataBaseHostName").toString (); // 读取配置文件中数据库连接ip地址
dataBasePort = rootObj.value("dataBasePort").toInt(); // 读取配置文件中数据库连接端口
dataBaseUserName = rootObj.value("dataBaseUserName").toString(); // 读取配置文件中数据库连接用户名
dataBasePassWord = EncryptionStr(rootObj.value("dataBasePassWord").toString()); // 读取配置文件中数据库连接密码
dataBasePassWord = EncryptionStr(dataBasePassWord); // 读取配置文件中数据库连接密码 /运行两次解密后还原密码
}
else
{
qDebug() << "Configure json file error!" << jsonError.errorString();
}
settingFile.close ();
}
}
QString HelpDeskClientDialog::EncryptionStr(QString str) //加密字符串,运行两次即可解密
{
std::wstring wString = str.toStdWString();
static QByteArray key = "86868686m$M&NOS";
for (int i = 0; i < wString.size(); i++)
{
wString[i] = wString[i] ^ key[i % key.size()];
}
return QString::fromStdWString(wString).toUtf8();
}