QT日志系统创建,读取,修复

2023-10-29

一. 内容简介

构建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);

五. 参考

Qt生成log日志文件

Qt学习之基本文件读写QFile

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT日志系统创建,读取,修复 的相关文章

  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob

随机推荐

  • Umi.js-配置式路由(学习笔记)

    配置式路由 当使用了路由配置后 约定式路由全部失效 两种方式书写umi配置 使用根目录下的文件 umirc js 使用根目录下的文件config config js 进行路由配置时 每个配置就是一个匹配规则 并且 每个配置是一个对象 对象中
  • Java处理Excel表格的读取和写入

    文章目录 一 处理xlsx文件 二 处理csv文件 由于工作需要处理以下excel表格 所以学习了以下关于excel的两个库 这里记录下简单的读取和写入方法 处理xlsx文件使用的是java poi 处理csv文件使用的是opencsv 一
  • HTML Input 属性

    一 value 属性 value 属性规定输入字段的初始值 二 readonly 属性 readonly 属性规定输入字段为只读 不能修改 readonly 属性不需要值 它等同于 readonly readonly 三 disabled
  • JMeter,linux环境下,执行jmeter报错:java.net.BindException: Address already in use: connect-已解决

    一 问题描述 通过jmeter进行性能测试 报错 address already in use connect 二 原因分析 1 系统的端口被耗尽了 Windows默认端口范围 1024 5000 2 操作系统要 2 4分钟才会重新释放这些
  • python echarts mysql_利用ECharts可视化mysql数据库中的数据

    这是工程所有文件的一个目录 工程文件目录 我做了一个柱状图 一个饼状图 一个折线图 配置过程很恶心 出了好多错 所以在这里记录一下 如果想直接看 echarts 的部分 可以跳过下面数据库的建立 数据库的建立与获取数据 首先是建立数据库 数
  • 科技查新-委托书

    查新检索委托书要怎么填 什么时候需要填写查新检索委托书 委托查新机构做科技查新时 根据参考项目的专业特点 委托人需选择具备相应资质的查新机构 委托可以通过网上或现场提交委托书 并按照要求填写查新检索委托书 查新检索委托书需要填写哪些内容 在
  • 产品经理使用工具-----产品演示 Demo-builder

    Demo Builder 提供了一种简单的方法来创建显示软件和系统是如何工作的教程 演示或示范 Demo Builder 的易用性使您能够创建令人惊叹 但实际与专业教学视频的功能 Demo Builder 用于生成你需要教育 市场 或出售该
  • 编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言的区别

    编译型和解释型 我们先看看编译型 其实它和汇编语言是一样的 也是有一个负责翻译的程序来对我们的源代码进行转换 生成相对应的可执行代码 这个过程说得专业一点 就称为编译 Compile 而负责编译的程序自然就称为编译器 Compiler 如果
  • Python day04 作业

    数学方面 五角星 一个五角星被定义为n 3n 1 2 def getPentagalNumber n c n 3 n 1 2 if n 10 0 print c end else print for i in range 1 101 get
  • Ubuntu在安装snappy时出现CMake Error at CMakeLists.txt:300 (set_property): set_property could not find TA

    在Ubuntu安装snappy过程中 出现了如下问题提示 这个要怎么解决 求各位大神解答 CMake Error at CMakeLists txt 294 add subdirectory The source directory hom
  • 华为OD机试 - 计算礼品发放的最小分组数目(Java)

    题目描述 又到了一年的末尾 项目组让小明负责新年晚会的小礼品发放工作 为使得参加晚会的同事所获得的小礼品价值相对平衡 需要把小礼品根据价格进行分组 但每组最多只能包括两件小礼品 并且每个分组的价格总和不能超过一个价格上限 为了保证发放小礼品
  • 小试牛刀1:使用Python-OpenCV 实现一副图片的高斯模糊处理

    实验步骤 1 环境 安装好python3 x opencv3 3 window下 2 高斯模糊 概念 高斯模糊本质上是低通滤波器 输出图像的每个像素点是原图像上对应像素点与周围像素点的加权和 使用cv2做高斯模糊 只要一行代码调用Gauss
  • 微信小程序页面栈_小程序页面栈详解

    在做小程序项目的时候不难发现 使用navigateTo进行页面跳转后 点击左上角或使用navigateBack返回 总是会按照之前的页面进入倒序来展示页面 那么问题来了 它们的跳转规则是什么样的呢 结合到实际业务中如何灵活运用呢 什么是页面
  • No SOURCES given to target: xxx

    文章目录 一 问题描述 二 解决办法 一 问题描述 CMake Error at CMakeLists txt add executable Cannot find source file src rs capture cpp Tried
  • 关于搭建简易广域网私人通信程序(python)一步到位!

    原料 python3 腾讯云服务器 用到的库 socket sys threading time pyinstaller 除pyinstaller外均不需单独安装 首先 默认已经买好云服务器 且安装好了python3 此处使用腾讯云服务器
  • csv文件的读与写

    csv文件的读取与写入 1 csv文件的读取 import pandas as pd csv path dataA1 csv df pd read csv csv path 可以通过csv文件的表头读取出某一列 表头见下图 print it
  • 理解inode

    inode是一个重要概念 是理解Unix Linux文件系统和硬盘储存的基础 我觉得 理解inode 不仅有助于提高系统操作水平 还有助于体会Unix设计哲学 即如何把底层的复杂性抽象成一个简单概念 从而大大简化用户接口 下面就是我的ino
  • 华为OD机试真题-基站维护最短距离 【2023.Q1】

    参考代码 小王是一名基站维护工程师 负责某区域的基站维护 某地方有n个基站 1
  • Android中的签名和签名文件的生成过程

    一 概述 二 还是从Key Store和keytool说起吧 三 数字签名和数字证书 四 apk的签名过程 五 签名中 MANIFEST MF CERT SF和 CERT RSA是怎么生成的 1 MANIFEST MF 2 CERT SF
  • QT日志系统创建,读取,修复

    一 内容简介 构建QT日志系统 遇到的问题以及结局办法 读取日志文件 用于检查程序运行情况 并且修复异常数据 二 软件环境 2 1 QT 5 14 1 新版QT6 4 6 5在线安装经常失败 而5 9版本又无法编译64位程序 所以就采用5