当前位置: 代码迷 >> 综合 >> QT+Halcon+SQLite 实战系列(1)数据库数据显示
  详细解决方案

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

热度:45   发布时间:2023-12-14 20:35:35.0

自制扫码枪,功能:

  • 实时扫码:调用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();elseqDebug()<<"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";
elseqDebug()<<"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.csdn.net/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.csdn.net/phenixyf/article/details/70598244

  • not positioned on a valid record:https://blog.csdn.net/llx523113241/article/details/41855203

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

  • 数字转字符串string:https://blog.csdn.net/qq598535550/article/details/60966378
    QString("%1").arg(int)或者使用QString::number(int)

       

四、参考资料

  • MVC模式:https://blog.csdn.net/u012521552/article/details/51771318

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

  • QTableView:https://blog.csdn.net/qq769651718/article/details/79357938
  •  QString的arg方法:https://www.cnblogs.com/lomper/p/4135387.html

五、项目源码

https://download.csdn.net/download/qwertyuiop_123abc/10827446

  相关解决方案