C++ Qt5学习笔记 2020.9.11(使用sqlite数据库,在table widget中显示从数据库中条件查询的数据,打包成exe程序,日常报错)

1、使用sqlite:

首先,打开.pro文件,在开头添加一句:
QT += sql
sqlite多打了个l,不要在意。。。)
C++ Qt5学习笔记 2020.9.11(使用sqlite数据库,在table widget中显示从数据库中条件查询的数据,打包成exe程序,日常报错)_第1张图片

打开mainwindow.cppmain.cpp,添加数据库创建和操作代码。

(1)创建数据库连接:

mainwindow.h中添加库文件:

#include 
#include 

mainwindow.cpp中数据库连接:

 //连接数据库
    QSqlDatabase database;
    database = QSqlDatabase::addDatabase("QSQLITE");
    database.setHostName("localhost");//设置你本地服务器的IP
    database.setDatabaseName("MyDataBase.db");   //这里的db文件是临时的,可以指定为本地的db文件
    database.setUserName("root");  //用户名
    database.setPassword("123");  //密码
    if (!database.open())
     {
       qDebug() << "Error: Failed to connect database." << database.lastError();
       }
    else
     {
       qDebug() << "Succeed to connect database." ;
       }

    database.close();

上面代码中db数据库文件是临时的,可以有如下指定:

database.setDatabaseName("E:/1/MyDataBase.db"); 

那么当这个db文件存在时,就会访问这个db文件,不存在时,上面的代码会创建这个db文件。

(2)数据库操作:

mainwindow.h中引入QSqlQuery

#include 

mainwindow.cpp中添加代码:

    database.open();
    //数据库操作对象
    QSqlQuery sql_query;
    //创建表格
    if(!sql_query.exec("create table add1(date date primary key, time text, rollnm int,coordinate text,x float,y float,classify int,level int,Graydifference float,area float,lengthofwidth float)"))
      {
        qDebug() << "Error: Fail to create table."<< sql_query.lastError();
        }
    else
      {
        qDebug() << "Table created!";
        }

    //插入数据
    if(!sql_query.exec("INSERT INTO add1 VALUES('2017-12-28', time('now'),3,'(21,2)',21,41,1,3,23,11,23)"))
     {
        qDebug() << sql_query.lastError();
       }
    else
     {
        qDebug() << "inserted add1!";
       }

    //查询
    sql_query.exec("select * from add1");
    if(!sql_query.exec())
     {
       qDebug()<<sql_query.lastError();
       }
    else
     {
       while(sql_query.next())
         {
           QString  date= sql_query.value(0).toString();
           QString  time= sql_query.value(1).toString();
           int rollnm = sql_query.value(2).toInt();
           QString  coordinate= sql_query.value(3).toString();
           float x=sql_query.value(4).toFloat();
           float y=sql_query.value(5).toFloat();
           int classify=sql_query.value(6).toInt();
           int level=sql_query.value(7).toInt();
           float Graydifference=sql_query.value(8).toFloat();
           float area=sql_query.value(9).toFloat();
           float lengthofwidth=sql_query.value(10).toFloat();
           //qDebug()<
           qDebug()<<QString("%1    %2    %3    %4    %5    %6    %7    %8    %9    %10    %11").arg(date).arg(time).arg(rollnm).arg(coordinate).arg(x).arg(y).arg(classify).arg(level).arg(Graydifference).arg(area).arg(lengthofwidth);
         }
     }
     database.close();

代码参考自:https://blog.csdn.net/weixin_41656968/article/details/80473137

注意,exec执行sql时,运行的代码放在database.open()database.close()中间, 每段exec执行的sql前面都需要添加一个QSqlQuery sql_query,否则会报错数据库未打开。

输出结果:
C++ Qt5学习笔记 2020.9.11(使用sqlite数据库,在table widget中显示从数据库中条件查询的数据,打包成exe程序,日常报错)_第2张图片
关于sqlite可以结合SQLite Administrator来使用,可以直接打开db文件和执行sql语句:
C++ Qt5学习笔记 2020.9.11(使用sqlite数据库,在table widget中显示从数据库中条件查询的数据,打包成exe程序,日常报错)_第3张图片

C++ Qt5学习笔记 2020.9.11(使用sqlite数据库,在table widget中显示从数据库中条件查询的数据,打包成exe程序,日常报错)_第4张图片

2、在Table Widget表格中显示从数据库查询的数据:

结合昨天的,来把数据库中查询出来的数据插入到tabel widget的表格中。
插入好以后,先把插入数据的代码注释掉。接着修改数据库查询的代码:

//查询
    sql_query.exec("select * from add1");
    if(!sql_query.exec())
     {
       qDebug()<<sql_query.lastError();
       }
    else
     { int k=0;  //行标志
       while(sql_query.next())
         {
           QString  date= sql_query.value(0).toString();
           QString  time= sql_query.value(1).toString();
           QString rollnm = sql_query.value(2).toString();
           QString  coordinate= sql_query.value(3).toString();
           QString x=sql_query.value(4).toString();
           QString y=sql_query.value(5).toString();
           QString classify=sql_query.value(6).toString();
           QString level=sql_query.value(7).toString();
           QString Graydifference=sql_query.value(8).toString();
           QString area=sql_query.value(9).toString();  
           QString lengthofwidth=sql_query.value(10).toString();

           ui->tableWidget->setItem(k,0,new QTableWidgetItem(date));
           ui->tableWidget->item(k, 0)->setTextAlignment(Qt::AlignCenter);//居中显示
           ui->tableWidget->setItem(k,1,new QTableWidgetItem(time));
           ui->tableWidget->item(k, 1)->setTextAlignment(Qt::AlignCenter);//居中显示
           ui->tableWidget->setItem(k,2,new QTableWidgetItem(rollnm));
           ui->tableWidget->item(k, 2)->setTextAlignment(Qt::AlignCenter);//居中显示
           ui->tableWidget->setItem(k,3,new QTableWidgetItem(coordinate));
           ui->tableWidget->item(k, 3)->setTextAlignment(Qt::AlignCenter);//居中显示
           ui->tableWidget->setItem(k,4,new QTableWidgetItem(x));
           ui->tableWidget->item(k, 4)->setTextAlignment(Qt::AlignCenter);//居中显示
           ui->tableWidget->setItem(k,5,new QTableWidgetItem(y));
           ui->tableWidget->item(k, 5)->setTextAlignment(Qt::AlignCenter);//居中显示
           ui->tableWidget->setItem(k,6,new QTableWidgetItem(classify));
           ui->tableWidget->item(k, 6)->setTextAlignment(Qt::AlignCenter);//居中显示
           ui->tableWidget->setItem(k,7,new QTableWidgetItem(level));
           ui->tableWidget->item(k, 7)->setTextAlignment(Qt::AlignCenter);//居中显示
           ui->tableWidget->setItem(k,8,new QTableWidgetItem(Graydifference));
           ui->tableWidget->item(k, 8)->setTextAlignment(Qt::AlignCenter);//居中显示
           ui->tableWidget->setItem(k,9,new QTableWidgetItem(area));
           ui->tableWidget->item(k, 9)->setTextAlignment(Qt::AlignCenter);//居中显示
           ui->tableWidget->setItem(k,10,new QTableWidgetItem(lengthofwidth));
           ui->tableWidget->item(k, 10)->setTextAlignment(Qt::AlignCenter);//居中显示
           k+=1;
           }
     }

由于试了好几遍都没能把float()int()在表格中显示出来(单元格显示空),所以干脆把数据都转换成了字符串成功显示出来。
修改显示行数:

    sql_query.exec("select count(*)  from add1");
    if(sql_query.first())
    {
        int rownm=sql_query.value(0).toInt();
        ui->tableWidget->setRowCount(rownm);       //设置表格行数
    }

程序运行结果:

C++ Qt5学习笔记 2020.9.11(使用sqlite数据库,在table widget中显示从数据库中条件查询的数据,打包成exe程序,日常报错)_第5张图片

刚刚插入表格中的数据就显示在表格中了。之后开始研究边缘端插数据,本地端读数据。

3、打包生成exe文件:

点击左下角的小电脑,选择想要生成的项目,构建选择Release:
C++ Qt5学习笔记 2020.9.11(使用sqlite数据库,在table widget中显示从数据库中条件查询的数据,打包成exe程序,日常报错)_第6张图片
点击运行程序。
执行完以后,打开项目地址生成的release文件夹:
在这里插入图片描述

接着,打开Release文件夹,将生成的exe文件拷贝出来,放到一个单独的目录,比如:e://demo,由于程序中还有用到的一些依赖,所以还需要把依赖的 dll文件拷贝过来,怎么拷贝看下面。
C++ Qt5学习笔记 2020.9.11(使用sqlite数据库,在table widget中显示从数据库中条件查询的数据,打包成exe程序,日常报错)_第7张图片

点击搜索框,搜索QT:
C++ Qt5学习笔记 2020.9.11(使用sqlite数据库,在table widget中显示从数据库中条件查询的数据,打包成exe程序,日常报错)_第8张图片
有可能会像我一样,出现多个编译器,这里选择 Qt5.14.1(MSVC)
打开进入到e://demo,并执行 windeployqt+程序名.exe:
C++ Qt5学习笔记 2020.9.11(使用sqlite数据库,在table widget中显示从数据库中条件查询的数据,打包成exe程序,日常报错)_第9张图片
执行完以后,dll文件就拷贝好了:
C++ Qt5学习笔记 2020.9.11(使用sqlite数据库,在table widget中显示从数据库中条件查询的数据,打包成exe程序,日常报错)_第10张图片

4、日常报错:

点击运行程序,无法定位程序输入点于动态链接库:

C++ Qt5学习笔记 2020.9.11(使用sqlite数据库,在table widget中显示从数据库中条件查询的数据,打包成exe程序,日常报错)_第11张图片
如上图所示,搜索qt的时候出现了三个编译器,因为我安装qt时选择了好几个版本。。。重新选择编译器为qt5.14.1(MSVC),删掉原有的dll,重新运行编译器复制dll就可以了。

C++ Qt5学习笔记 2020.9.11(使用sqlite数据库,在table widget中显示从数据库中条件查询的数据,打包成exe程序,日常报错)_第12张图片

你可能感兴趣的:(C++,qt)