QT+Halcon+SQLite 实战系列(1)数据库数据显示

本文介绍如何自制扫码枪并将其与SQLite数据库集成,包括实时扫码、数据解码、存储与显示。详细讲解了使用Halcon进行图像处理,SQLite数据库的创建与操作,以及在QT环境下使用QTableView进行数据展示的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自制扫码枪,功能:

  • 实时扫码:调用Halcon实时获取图像
  • (QR码)解码:调用halcon函数解码
  • 数据存储:数据写入SQLite数据库,检测完成后在磁盘存储
  • 数据显示:使用QTableView+QStandardItemModel+QStandardItem显示由数据库提供的数据

一、数据库创建

   使用SQLite创建一个简单的数据库,内含2个表:Box与Bag,主码均为“编号”。

 

其中"所属Box"为外码。

使用QT中QSqlDatabase类与SQLite数据库对接:

  • 创建数据库
QSqlDatabase dataBase= QSqlDatabase::addDatabase("QSQLITE", "dataBase");
  •  设置数据库属性,打开/连接数据库
 dataBase.setDatabaseName("D:\\ScanCode.db");//设置数据库路径及名称
 if(!dataBase.open())   //打开数据库
        qDebug()<<"dataBase open error"<<dataBase.lastError();
 else
        qDebug()<<"dataBase open success";

 还可通过这些函数设置其他属性:databaseName(), setUserName(), setPassword(), setHostName(), setPort(), setConnectOptions()

二、图形界面+显示数据

  •  数据读取
//查询类初始化
QSqlQuery mySql=QSqlQuery(dataBase);
//执行SQL查询语句
bool status=mySql.exec("select 编号,所属Box,二维码 from Bag ");
if(true==status)
       qDebug()<<"browse success";
else
       qDebug()<<"browse error";

//读取、显示
while(mySql.next())
   QString num=mySql.value(0).toString();//查询结果转成QString
  •  数据显示
while(mySql.next()){
        QString num=mySql.value(0).toString();//查询获取使用value函数,并转成qstring格式
        itemModel->setItem(i,j,new QStandardItem(num));//不设置字符格式-》中文乱码
        num=mySql.value(1).toString();
        itemModel->setItem(i,j+1,new QStandardItem(num));
        num=mySql.value(2).toString();
        itemModel->setItem(i,j+2,new QStandardItem(num));//使用QStandardItem显示各个数据项
        i++;
    }
    dataShow->resizeColumnsToContents();

三、遇到的问题

  • 设置表头标题时中文字符乱码。

      fromLocal8Bit()函数可以设置编码。使用fromLocal8Bit()函数,实现了从本地字符集GB到Unicode的转换,用于处理汉语显示乱码等问题。 static inline QString fromLocal8Bit(const QByteArray &str);函数返回String类型对象
     在QT5上编译,使用fromLocal8Bit()仍然乱码,改用fromUtf8()解决。

 itemModel->setHeaderData(1,Qt::Horizontal,QString::fromUtf8("所属Box"));

     随便找的资料,真假自辩->QT文本编码说明:https://blog.youkuaiyun.com/imhikaru/article/details/5984201   

      留给空位,有时间再补充相关说明。  

  • SQLite插入数据卡顿,插入数据特别慢,测试插入300条数据界面无响应。

       原因:                           

       解决:启用用事务插入多条数据可减轻卡顿。

 QString value="201706280026800581450728";
    QString number;
    dataBase.transaction();//开启事务,减少卡顿
    for(int j=0;j<10;j++,num++){
         //从数据库查询得到的编号开始插入,避免重复-》插入失败

        mySql.addBindValue(num);
         number=QString::number(num);
         //number=QString("%1").arg(num);
         value="编号"+number+"数据 201706280026800581450728";
         mySql.addBindValue(value);

         bool status=mySql.exec();
         if(false==status)
             qDebug()<<"insert error";
    }
   dataBase.commit();//提交数据

    事务使用两种方式: https://blog.youkuaiyun.com/phenixyf/article/details/70598244

      在实现 query.value(0).toString()   语句前没有query.next()或者 query.first()  ,QSqlQuery返回的数据集,record是停在第一条记录之前的。所以,在获得数据集后,必须执行next()或first()到第一条记录,这时候record才是有效的。

       

四、参考资料

   MVC设计模式:起源于smalltalk的一种与用户界面设计相关的设计模式。 
   作用:有效的分离数据和用户界面。 
   组成:模型model(表示数据)、视图view(表示用户界面)、控制controller(定义用户在界面上的操作)。

五、项目源码

https://download.youkuaiyun.com/download/qwertyuiop_123abc/10827446

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值