一. 内容简介
构建QT日志系统。遇到的问题以及结局办法,读取日志文件,用于检查程序运行情况,并且修复异常数据。
二. 软件环境
2.1 QT 5.14.1
新版QT6.4,,6.5在线安装经常失败,而5.9版本又无法编译64位程序,所以就采用5.14.1这个用的比较多也比较稳定的一个版本。
QT编译器采用的是MSVC2017 64bit。
链接:https://pan.baidu.com/s/1ER98DPAkTUPlIyCC6osNNQ?pwd=1234
2.3 Visual studio 2017
Visual stdio采用2017主要是因为QT5.14.1最高到MSVC2017 64bit。
三. 主要流程
3.1 介绍用到的东西
3.2 读取日志文件,用于检查程序运行情况
3.3 检查并修复异常数据
四. 具体步骤
4.1 介绍用到的东西
日志系统的作用,记录运行情况,方便自己调试,也可以看到程序运行时间。根据日志可以看到程序上次是否正常运行,如果是异常退出,可以根据日志对异常操作做一些处理,就比如往数据库中存数据,没存完程序退出,这时候就可以根据日志删除错误数据了。主要的技术就是读写文件。
下面代码引用别人的,这块代码主要用于日志输出格式设置,这个博主写的很好,我拿了其中一段。
// 设置输出信息格式
QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ");
QString current_date = QString("(%1)").arg(current_date_time);
QString message = QString("%1 %2").arg(current_date).arg(msg);
// 输出信息至文件中(读写、追加形式)
QFile file("log.txt");
file.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream text_stream(&file);
text_stream << message << "\r\n";
file.flush();
file.close();
博主给封装函数了,而且博主建议将这个日志用的东西都封装为一个模块,下面我封装了一部分
头文件
#ifndef MLOG_H
#define MLOG_H
#include <QObject>
#include <QApplication>
#include <QtDebug>
#include <QFile>
#include <QTextStream>
#include <QDebug>
#include <QDateTime>
#include <QMutex>
#include <QString>
#include <qapplication.h>
#include <QMessageBox>
class Mlog : public QObject
{
Q_OBJECT
public:
QFile file;
explicit Mlog(QObject *parent = nullptr);
void Debug(QString msg);
void Warning(QString msg);
void Critical(QString msg);
void Operation(QString msg);
void fileClose();
void fileRead();
QString fileWrite(QString msg,QString model);
private:
signals:
};
#endif // MLOG_H
cpp
#include "mlog.h"
Mlog::Mlog(QObject *parent) : QObject(parent)
{
file.setFileName("./log.txt");
file.open(QIODevice::Append);
file.close();
}
void Mlog::fileRead()
{
file.open(QIODevice::ReadOnly);
if(!file.isOpen())
{
}
file.close();
QFile f("./log.txt");
f.open(QIODevice::Truncate);
if(!f.isOpen())
{
}
f.close();
}
void Mlog::Debug(QString msg)
{
fileWrite(msg,"Debug");
}
void Mlog::Warning(QString msg)
{
fileWrite(msg,"Warning");
}
void Mlog::Critical(QString msg)
{
fileWrite(msg,"Critical");
}
void Mlog::Operation(QString msg)
{
fileWrite(msg,"Operation");
}
void Mlog::fileClose()
{
file.close();
}
QString Mlog::fileWrite(QString msg,QString model)
{
file.open(QIODevice::WriteOnly | QIODevice::Append);
if(!file.isOpen())
{
return "日志读取失败";
}
// 设置输出信息格式
QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ");
QString current_date = QString("(%1)").arg(current_date_time);
QString message = QString("%1 %2: %3").arg(current_date).arg(model).arg(msg);
// 输出信息至文件中(读写、追加形式)
QTextStream text_stream(&file);
text_stream << message << "\r\n";
file.flush();
}
封装好了以后去用的时候,问题就来了许多,
1. 在mainwindow.h中实例一下对象的时候,就一直显示报错,这种情况
解决办法:因为mianwindow.h中包含了mlog.h,而在mlog.h中包含了mianwindow.h,就报错了,删mlog.h中包含的mianwindow.h就好了。
2. 构造函数作用是创建文件(假如没有的话,有的话就没影响),然后我想先读取上一次的运行情况,然后清空文件(用只写方式打开就可以清空),但是我的就一直报错。这些只写打开一直报错,然后后边只读也开始报错,没法用
void Mlog::fileRead()
{
file.open(QIODevice::ReadOnly);
if(!file.isOpen())
{
}
file.close();
QFile f("./log.txt");
f.open(QIODevice::Truncate);
if(!f.isOpen())
{
}
f.close();
}
解决办法:
清空文件我发现我怎么写都报错,具体原因我也不知道,我就试着往里面加了点动作,他就不报错了,玄学。
file.open(QIODevice::WriteOnly | QIODevice::Truncate);
if(file.isOpen())
{
QByteArray array;
while( !file.atEnd())//判断是否读到文件尾
{
array = file.readLine(); //按行读,追加
}
file.close();
}
3. 在使用日志时候,在这个里面写的话,写多少个都没事,程序没问题,但是我在按键事件里面写超过一个就报错,我想可能是内存满了,我按键事件计算的东西很多。
解决办法:
我就没用这个类,也没用函数,而是直接在里面写了,就不报错了,奇奇怪怪,代码一个就下边写的
QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ");
QString current_date = QString("(%1)").arg(current_date_time);
QFile f("./log.txt");
f.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream text_stream(&f);
text_stream << QString("%1 %2: %3").arg(current_date).arg("Operation").arg("Prepare calculation;") << "\r\n";
f.flush();
f.close();
在之后,我索性就没用上边封好的类,而是在类里面又写了几个函数,但是输出语句就单独写了,写的函数只是用来处理数据
// 定义
QFile file;
void Debug(QString msg);
void Warning(QString msg);
void Critical(QString msg);
void Operation(QString msg);
void fileCreate();
void fileRead1();
void fileRead2();
void fileClear();
void fileOpen();
QString fileWrite(QString msg,QString model);
void fileClose();
// cpp
void MainWindow::Debug(QString msg)
{
fileWrite(msg,"Debug");
}
void MainWindow::Warning(QString msg)
{
fileWrite(msg,"Warning");
}
void MainWindow::Critical(QString msg)
{
fileWrite(msg,"Critical");
}
void MainWindow::Operation(QString msg)
{
fileWrite(msg,"Operation");
}
void MainWindow::fileClose()
{
file.close();
}
void MainWindow::fileRead1()
{
int n = 0;
QString sss[100];
file.open(QIODevice::ReadOnly);
QString b[100][18];
if(file.isOpen())
{
QByteArray array;
while( !file.atEnd())//判断是否读到文件尾
{
array = file.readLine(); //按行读,追加
if(array.length()>300){
sss[n] = array;
n++;
}
}
file.close();
}
QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ");
QString current_date = QString("(%1)").arg(current_date_time);
QFile f("./log.txt");
f.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream text_stream(&f);
text_stream << QString("%1 %2: %3").arg(current_date).arg("Debug").arg("------------") << "\r\n";
f.flush();
int h = 0;
int ll = 0;
int qqq[18][2];
for(int i = 0;i<n;i++){
ll = 0;
h = 0;
for(int q=0;q<sss[i].length();q++){
// R
if(sss[i][q] == "R"&&sss[i][q+1]==" "){
qqq[ll][0] = q + 4;
qqq[ll][1] = q + 15;
if(sss[i][q+1]!=" "){
qqq[ll][0]++;
qqq[ll][1]++;
}
for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
b[i][ll][h] = sss[i][j];
h++;
}
h = 0;
ll++;
}
// L
if(sss[i][q] == "L"&&sss[i][q+1]==" "){
qqq[ll][0] = q + 4;
qqq[ll][1] = q + 15;
if(sss[i][q+1]!=" "){
qqq[ll][0]++;
qqq[ll][1]++;
}
for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
b[i][ll][h] = sss[i][j];
h++;
}
h = 0;
ll++;
}
// Rb
if(sss[i][q] == "R"&&sss[i][q+1]=="b"){
qqq[ll][0] = q + 4;
qqq[ll][1] = q + 15;
if(sss[i][q+1]!=" "){
qqq[ll][0]++;
qqq[ll][1]++;
}
for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
b[i][ll][h] = sss[i][j];
h++;
}
h = 0;
ll++;
}
// C
if(sss[i][q] == "C"&&sss[i][q+1]==" "){
qqq[ll][0] = q + 4;
qqq[ll][1] = q + 15;
if(sss[i][q+1]!=" "){
qqq[ll][0]++;
qqq[ll][1]++;
}
for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
b[i][ll][h] = sss[i][j];
h++;
}
h = 0;
ll++;
}
// s
if(sss[i][q] == "s"&&sss[i][q+1]==" "){
qqq[ll][0] = q + 4;
qqq[ll][1] = q + 15;
if(sss[i][q+1]!=" "){
qqq[ll][0]++;
qqq[ll][1]++;
}
for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
b[i][ll][h] = sss[i][j];
h++;
}
h = 0;
ll++;
}
// Rf
if(sss[i][q] == "R"&&sss[i][q+1]=="f"){
qqq[ll][0] = q + 4;
qqq[ll][1] = q + 15;
if(sss[i][q+1]!=" "){
qqq[ll][0]++;
qqq[ll][1]++;
}
for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
b[i][ll][h] = sss[i][j];
h++;
}
h = 0;
ll++;
}
// tb
if(sss[i][q] == "t"&&sss[i][q+1]=="b"){
qqq[ll][0] = q + 4;
qqq[ll][1] = q + 15;
if(sss[i][q+1]!=" "){
qqq[ll][0]++;
qqq[ll][1]++;
}
for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
b[i][ll][h] = sss[i][j];
h++;
}
h = 0;
ll++;
}
// R0
if(sss[i][q] == "R"&&sss[i][q+1]=="0"){
qqq[ll][0] = q + 4;
qqq[ll][1] = q + 15;
if(sss[i][q+1]!=" "){
qqq[ll][0]++;
qqq[ll][1]++;
}
for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
b[i][ll][h] = sss[i][j];
h++;
}
h = 0;
ll++;
}
// M
if(sss[i][q] == "M"&&sss[i][q+1]==" "){
qqq[ll][0] = q + 4;
qqq[ll][1] = q + 15;
if(sss[i][q+1]!=" "){
qqq[ll][0]++;
qqq[ll][1]++;
}
for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
b[i][ll][h] = sss[i][j];
h++;
}
h = 0;
ll++;
}
// Ks
}
}
ui->bottom_console->appendPlainText(QString("%1").arg(b[5][0]));
ui->bottom_console->appendPlainText(QString("%1").arg(b[5][1]));
ui->bottom_console->appendPlainText(QString("%1").arg(b[5][2]));
ui->bottom_console->appendPlainText(QString("%1").arg(b[5][3]));
ui->bottom_console->appendPlainText(QString("%1").arg(b[5][4]));
ui->bottom_console->appendPlainText(QString("%1").arg(b[5][5]));
ui->bottom_console->appendPlainText(QString("%1").arg(b[5][6]));
ui->bottom_console->appendPlainText(QString("%1").arg(b[5][7]));
ui->bottom_console->appendPlainText(QString("%1").arg(b[5][8]));
}
void MainWindow::fileCreate()
{
file.setFileName("./log.txt");
file.open(QIODevice::WriteOnly | QIODevice::Append);
file.close();
}
void MainWindow::fileRead2()
{
int n = 0;
QString sss[100];
file.open(QIODevice::ReadOnly);
QString b[100][18];
if(file.isOpen())
{
QByteArray array;
while( !file.atEnd())//判断是否读到文件尾
{
array = file.readLine(); //按行读,追加
if(array.length()>300){
sss[n] = array;
n++;
}
}
file.close();
}
int h = 0;
int ll = 0;
int qqq[18][2];
for(int i = 0;i<n;i++){
ll = 9;
for(int q=0;q<sss[i].length();q++){
// Ks
if(sss[i][q] == "K"&&sss[i][q+1]=="s"){
qqq[ll][0] = q + 4;
qqq[ll][1] = q + 15;
if(sss[i][q+1]!=" "){
qqq[ll][0]++;
qqq[ll][1]++;
}
for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
b[i][ll][h] = sss[i][j];
h++;
}
h = 0;
ll++;
}
// n0
if(sss[i][q] == "n"&&sss[i][q+1]=="0"){
qqq[ll][0] = q + 4;
qqq[ll][1] = q + 15;
if(sss[i][q+1]!=" "){
qqq[ll][0]++;
qqq[ll][1]++;
}
for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
b[i][ll][h] = sss[i][j];
h++;
}
h = 0;
ll++;
}
// Ta
if(sss[i][q] == "T"&&sss[i][q+1]=="a"){
qqq[ll][0] = q + 4;
qqq[ll][1] = q + 15;
if(sss[i][q+1]!=" "){
qqq[ll][0]++;
qqq[ll][1]++;
}
for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
b[i][ll][h] = sss[i][j];
h++;
}
h = 0;
ll++;
}
// E
if(sss[i][q] == "E"&&sss[i][q+1]==" "){
qqq[ll][0] = q + 4;
qqq[ll][1] = q + 15;
if(sss[i][q+1]!=" "){
qqq[ll][0]++;
qqq[ll][1]++;
}
for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
b[i][ll][h] = sss[i][j];
h++;
}
h = 0;
ll++;
}
// Pa
if(sss[i][q] == "P"&&sss[i][q+1]=="a"){
qqq[ll][0] = q + 4;
qqq[ll][1] = q + 15;
if(sss[i][q+1]!=" "){
qqq[ll][0]++;
qqq[ll][1]++;
}
for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
b[i][ll][h] = sss[i][j];
h++;
}
h = 0;
ll++;
}
// P1
if(sss[i][q] == "P"&&sss[i][q+1]=="1"){
qqq[ll][0] = q + 4;
qqq[ll][1] = q + 15;
if(sss[i][q+1]!=" "){
qqq[ll][0]++;
qqq[ll][1]++;
}
for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
b[i][ll][h] = sss[i][j];
h++;
}
h = 0;
ll++;
}
// u
if(sss[i][q] == "u"&&sss[i][q+1]==" "){
qqq[ll][0] = q + 4;
qqq[ll][1] = q + 15;
if(sss[i][q+1]!=" "){
qqq[ll][0]++;
qqq[ll][1]++;
}
for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
b[i][ll][h] = sss[i][j];
h++;
}
h = 0;
ll++;
}
// N
if(sss[i][q] == "N"&&sss[i][q+1]==" "){
qqq[ll][0] = q + 4;
qqq[ll][1] = q + 15;
if(sss[i][q+1]!=" "){
qqq[ll][0]++;
qqq[ll][1]++;
}
for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
b[i][ll][h] = sss[i][j];
h++;
}
h = 0;
ll++;
}
// model
if(sss[i][q] == "m"&&sss[i][q+1]=="o"){
qqq[ll][0] = q + 4 + 4;
b[i][ll][h] = sss[i][qqq[ll][0]];
h++;
h = 0;
ll++;
}
}
}
ui->bottom_console->appendPlainText(QString("%1").arg(b[5][9]));
ui->bottom_console->appendPlainText(QString("%1").arg(b[5][10]));
ui->bottom_console->appendPlainText(QString("%1").arg(b[5][11]));
ui->bottom_console->appendPlainText(QString("%1").arg(b[5][12]));
ui->bottom_console->appendPlainText(QString("%1").arg(b[5][13]));
ui->bottom_console->appendPlainText(QString("%1").arg(b[5][14]));
ui->bottom_console->appendPlainText(QString("%1").arg(b[5][15]));
ui->bottom_console->appendPlainText(QString("%1").arg(b[5][16]));
ui->bottom_console->appendPlainText(QString("%1").arg(b[5][17]));
}
void MainWindow::fileClear()
{
file.open(QIODevice::WriteOnly | QIODevice::Truncate);
if(file.isOpen())
{
QByteArray array;
while( !file.atEnd())//判断是否读到文件尾
{
array = file.readLine(); //按行读,追加
}
file.close();
}
}
QString MainWindow::fileWrite(QString msg, QString model)
{
file.open(QIODevice::WriteOnly | QIODevice::Append);
if(!file.isOpen())
{
return "日志读取失败";
}
// 设置输出信息格式
// QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);
QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ");
QString current_date = QString("(%1)").arg(current_date_time);
// QString message = QString("%1 %2 %3 %4").arg(text).arg(context_info).arg(msg).arg(current_date);
QString message = QString("%1 %2: %3").arg(current_date).arg(model).arg(msg);
// 输出信息至文件中(读写、追加形式)
QTextStream text_stream(&file);
text_stream << message << "\r\n";
file.flush();
file.close();
}
4.2 读取日志文件,用于检查程序运行情况
这是我运行一次的日志
(2023-03-16 20:46:55 ) Operation: Program startup;
(2023-03-16 20:47:23 ) Operation: Prepare calculation;
(2023-03-16 20:47:23 ) Operation: Calculation-parameters: R = 0.0300000000 L = 0.0480000000 Rb = 0.0303000000 C = 0.0001000000 s = 0.0000000000 Rf = 0.0000000000 tb = 0.0000000000 R0 = 0.0000000000 M = 0.0000000000 Ks = 0.0000000000 n0 = 40000.0000000000 Ta = 298.0000000000 E = 0.4000000000 Pa = 101300.0000000000 P1 = 1.0000000000 u = 0.0000193200 N = 72.0000000000 model = 4.0000000000 ;
(2023-03-16 20:47:23 ) Operation: There is data in the database, no calculation is required;
我现在要读取那些参数,我写了两个函数fileRead1(),fileRead2(),至于为什么写两个函数,因为写一个里面会无法运行,会报错,应该是内存不够了,读取一个参数代码就是下边的,读取出数据,就可以去数据库查数据是否正确了
int n = 0;
QString sss[100];
file.open(QIODevice::ReadOnly);
QString b[100][18];
if(file.isOpen())
{
QByteArray array;
while( !file.atEnd())//判断是否读到文件尾
{
array = file.readLine(); //按行读,追加
if(array.length()==397){
sss[n] = array;
n++;
}
}
file.close();
}
QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ");
QString current_date = QString("(%1)").arg(current_date_time);
QFile f("./log.txt");
f.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream text_stream(&f);
text_stream << QString("%1 %2: %3").arg(current_date).arg("Debug").arg("------------") << "\r\n";
f.flush();
int h = 0;
int ll = 0;
int qqq[18][2];
for(int i = 0;i<n;i++){
ll = 0;
h = 0;
for(int q=0;q<sss[i].length();q++){
if(sss[i][q] == "R"&&sss[i][q+1]==" "){
qqq[ll][0] = q + 4;
qqq[ll][1] = q + 15;
if(sss[i][q+1]!=" "){
qqq[ll][0]++;
qqq[ll][1]++;
}
for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
b[i][ll][h] = sss[i][j];
h++;
}
h = 0;
ll++;
}
}
}
}
4.3 检查并修复异常数据
我这个391这个是开始计算得标志,57是结束计算的标志,通过比对文件中的开始和结束的个数,就可以查出上次是否正常存储,
void MainWindow::fileRead()
{
file.open(QIODevice::ReadOnly);
QString input;
// 离奇的很
if(file.isOpen())
{
QByteArray array;
while( !file.atEnd())//判断是否读到文件尾
{
array = file.readLine(); //按行读,追加
input = array;
if(array.length()==391){
startCal++;
}
if(array.length()==57){
endCal++;
}
}
file.close();
}
}
就根据开始和结束得记录来判端存储情况
fileRead();
fileRead1();
fileRead2();
try {
if(startCal==endCal){
filePrint("程序上次存储正常");
}
if((startCal-endCal)==1){
filePrint("程序上次存储异常,开始修删除错误数据");
deleteSet(b[startCal][0].toDouble(),b[startCal][1].toDouble(),b[startCal][2].toDouble(),b[startCal][3].toDouble(),b[startCal][4].toDouble(),b[startCal][5].toDouble(),b[startCal][6].toDouble(),b[startCal][7].toDouble(),b[startCal][8].toDouble(),b[startCal][9].toDouble(),b[startCal][10].toDouble(),b[startCal][11].toDouble(),b[startCal][12].toDouble(),b[startCal][13].toDouble(),b[startCal][14].toDouble(),b[startCal][15].toDouble(),b[startCal][16].toDouble(),b[startCal][17].toDouble());
deleteParam(aaa);
filePrint("删除完成");
}
} catch (int res) {
// ui->bottom_console->appendPlainText(QString("%1").arg("异常退出"));
}
这是里面删除用的函数,deleteSet函数是把数据放到InputParameters对象中,里面有一个数据库对象,不需要创建新的,这个多线程使用时可以加上去
void MainWindow::deleteParam(InputParameters &inputParameters)
{
QSqlQuery query;
int Id;
double R,L,Rb,C;
// 箔片参数
double s,Rf,tb,R0,M,Ks;
// 运行参数
double n0,Ta,E,Pa,P1,u;
// 网格参数
int N;
// 程序选择
int model;
R = inputParameters.R;
L = inputParameters.L;
Rb = inputParameters.Rb;
C = inputParameters.C;
s = inputParameters.s;
Rf = inputParameters.Rf;
tb = inputParameters.tb;
R0 = inputParameters.R0;
M = inputParameters.M;
Ks = inputParameters.Ks;
n0 = inputParameters.n0;
Ta = inputParameters.Ta;
E = inputParameters.E;
Pa = inputParameters.Pa;
P1 = inputParameters.P1;
u = inputParameters.u;
N = inputParameters.N;
model = inputParameters.model;
double out_p[74][74];
double out_h[74][74];
double out_hf[10][9];
double out_ff;
double out_theta;
query=QSqlQuery(db);
QString str_1 = QString("SELECT Id FROM inputparameters "
"WHERE R = %1 "
"AND L = %2 "
"AND Rb = %3 "
"AND C = %4 "
"AND s = %5 "
"AND Rf = %6 "
"AND tb = %7 "
"AND R0 = %8 "
"AND M = %9 "
"AND Ks = %10 "
"AND n0 = %11 "
"AND Ta = %12 "
"AND E = %13 "
"AND Pa = %14 "
"AND P1 = %15 "
"AND u = %16 "
"AND N = %17 "
"AND model = %18 ").arg(QString::number(R,'f',10)).arg(QString::number(L,'f',10)).arg(QString::number(Rb,'f',10)).arg(QString::number(C,'f',10))
.arg(QString::number(s,'f',10)).arg(QString::number(Rf,'f',10)).arg(QString::number(tb,'f',10)).arg(QString::number(R0,'f',10)).arg(QString::number(M,'f',10)).arg(QString::number(Ks,'f',10))
.arg(QString::number(n0,'f',10)).arg(QString::number(Ta,'f',10)).arg(QString::number(E,'f',10)).arg(QString::number(Pa,'f',10)).arg(QString::number(P1,'f',10)).arg(QString::number(u,'f',10))
.arg(QString::number(N,'f',10)).arg(QString::number(model,'f',10));
qDebug() << str_1;
if(query.exec(str_1)){
qDebug() << "查询成功";
query.next();
inputParameters.Id = query.value(0).toInt();
Id = inputParameters.Id;
qDebug() << Id;
}
// db = QSqlDatabase::addDatabase("QODBC",QString::number((quint64)QThread::currentThreadId()));
// db = QSqlDatabase::addDatabase("QMYSQL",QString::number((quint64)QThread::currentThreadId()));
// db.setHostName("127.0.0.1");
// db.setPort(3306);
// db.setDatabaseName("QT");// 不是Database,记得别填错
// db.setUserName("root");
// db.setPassword("1234");
// bool ok = db.open();
// if (ok){
// qDebug()<<"thread-successed";
// }
// else {
// qDebug()<<"thread-failed";
// }
QString sq_h,sq_p,sq_ff,sq_hf,sq_theta,sq_inputparameters;
// 中间是需要存储的数据
query=QSqlQuery(db);
for (int i=1;i<=10;i++) {
sq_h=QString("DELETE FROM outh_%1 WHERE Id=%2").arg(i).arg(Id);
query.exec(sq_h);
sq_p=QString("DELETE FROM outp_%1 WHERE Id=%2").arg(i).arg(Id);
query.exec(sq_p);
}
sq_inputparameters=QString("DELETE FROM inputparameters WHERE Id=%1").arg(Id);
query.exec(sq_inputparameters);
sq_ff=QString("DELETE FROM outff WHERE Id=%1").arg(Id);
query.exec(sq_ff);
sq_hf=QString("DELETE FROM outhf WHERE Id=%1").arg(Id);
query.exec(sq_hf);
sq_theta=QString("DELETE FROM outtheta WHERE Id=%1").arg(Id);
query.exec(sq_theta);
// // 给线程断开连接
// QString connection;
// connection = db.connectionName();
// db.close();
// db = QSqlDatabase();
// db.removeDatabase(connection);