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

44 篇文章 8 订阅

1、使用sqlite:

首先,打开.pro文件,在开头添加一句:
QT += sql
sqlite多打了个l,不要在意。。。)
在这里插入图片描述

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

(1)创建数据库连接:

mainwindow.h中添加库文件:

#include <QSqlDatabase>
#include <QSqlError>

mainwindow.cpp中数据库连接:

 //连接数据库
    QSqlDatabase database;
    database = QSqlDatabase::addDatabase("QSQLITE");
    database.setHostName("localhost");//设置你本地服务器的IP
    database.setDatabaseName("MyDataBase.db");   //这里的db文件是临时的,可以指定为本地的db文件
    database.setUserName("root");  //用户名
    database.setPassword("123");  //密码</span>
    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 <QSqlQuery>

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()<<QString("id:%1    name:%2    age:%3").arg(id).arg(name).arg(age);
           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,否则会报错数据库未打开。

输出结果:
在这里插入图片描述
关于sqlite可以结合SQLite Administrator来使用,可以直接打开db文件和执行sql语句:
在这里插入图片描述

在这里插入图片描述

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);       //设置表格行数
    }

程序运行结果:

在这里插入图片描述

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

3、打包生成exe文件:

点击左下角的小电脑,选择想要生成的项目,构建选择Release:
在这里插入图片描述
点击运行程序。
执行完以后,打开项目地址生成的release文件夹:
在这里插入图片描述

接着,打开Release文件夹,将生成的exe文件拷贝出来,放到一个单独的目录,比如:e://demo,由于程序中还有用到的一些依赖,所以还需要把依赖的 dll文件拷贝过来,怎么拷贝看下面。
在这里插入图片描述

点击搜索框,搜索QT:
在这里插入图片描述
有可能会像我一样,出现多个编译器,这里选择 Qt5.14.1(MSVC)
打开进入到e://demo,并执行 windeployqt+程序名.exe:
在这里插入图片描述
执行完以后,dll文件就拷贝好了:
在这里插入图片描述

4、日常报错:

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

在这里插入图片描述
如上图所示,搜索qt的时候出现了三个编译器,因为我安装qt时选择了好几个版本。。。重新选择编译器为qt5.14.1(MSVC),删掉原有的dll,重新运行编译器复制dll就可以了。

在这里插入图片描述

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,确保你已经安装了 .NET Framework 4.7.2 版本。然后,按照以下步骤来创建 SQLite 数据库和表,并将数据库文件路径指定为 Debug 文件夹: 1. 打开 Visual Studio 并创建一个新的控制台应用程序项目。 2. 在解决方案资源管理器,右键单击项目并选择“管理 NuGet 程序包”。 3. 在 NuGet 程序包管理器,搜索并安装“System.Data.SQLite.Core”包。 4. 打开 Program.cs 文件,并添加以下代码: ```csharp using System.Data.Entity; using System.Data.SQLite; namespace SQLiteDemo { class Program { static void Main(string[] args) { // 设置数据库文件路径为 Debug 文件夹 string dbPath = @"Data Source=.\Debug\mydatabase.sqlite;Version=3;"; // 创建 SQLite 数据库连接 SQLiteConnection connection = new SQLiteConnection(dbPath); // 创建 DbContext 实例 MyDbContext dbContext = new MyDbContext(connection); // 创建数据表 dbContext.Database.ExecuteSqlCommand("CREATE TABLE IF NOT EXISTS Customers (Id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT)"); // 添加数据 dbContext.Customers.Add(new Customer { Name = "John" }); dbContext.Customers.Add(new Customer { Name = "Mary" }); dbContext.SaveChanges(); // 查询数据 var customers = dbContext.Customers.ToList(); foreach (var customer in customers) { Console.WriteLine(customer.Name); } Console.ReadLine(); } } // 定义实体类 public class Customer { public int Id { get; set; } public string Name { get; set; } } // 定义 DbContext public class MyDbContext : DbContext { public MyDbContext(DbConnection connection) : base(connection, true) { } public DbSet<Customer> Customers { get; set; } } } ``` 5. 运行程序,你应该可以看到控制台输出以下内容: ``` John Mary ``` 6. 在 Debug 文件夹,你应该可以看到一个名为 mydatabase.sqlite 的文件。这就是你的 SQLite 数据库文件。 请注意,如果你在运行程序之前已经创建了 mydatabase.sqlite 文件,那么程序使用该文件而不是创建一个新的文件。如果你想创建一个新的数据库文件,只需删除该文件即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值