自制扫码枪,功能:
- 实时扫码:调用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