最近整了一个访客系统。利用普天身份证阅读器的二次开发包,读取身份证信息。把获取到的信息存入数据库中,接着从数据库中读数据到tableview上,最后导出数据到excel表格。现在将涉及到的知识点记录下来,以便下次查阅。

软件界面:上面5个功能按钮用的是QToolButton,姓名之类的显示都是QLabel,摄像头显示用的是QHBoxLayout,每个功能按钮点下去都是用QStackedWidget显示的。

涉及的知识:

一、第三方库的调用

第三方库的使用可以是隐性调用,也可以是显性调用。隐形调用就是在pro文件里面设置好include,LIBS。不清楚的可以自行百度。而在这个小项目中我使用的是QLibrary类。另外普天提供了cardapi.h,cardapi3.dll,cardapi3.lib等等文件,我们只需要使用cardapi.h,cardapi3.dll文件即可。

第一步:声明函数指针,声明的类型参数要和头文件中提供的一样。

第二步:使用QLibrary载入动态链接库(也就是dll文件),并且调用里面的方法,使用的类型就是第一步所声明的类型。

完成这两步,我们应该就可以使用第三方库了。我这只是就代码论代码,如果想具体了解的,请查阅Qt帮助文档。

二、程序在无边框时,按住拖动的解决方案(这里我参考了刘大师的做法)

三、摄像头的使用

主要使用QCamera类来打开设备和显示图像,以及QCameraImageCapture截图 ,在使用QCamera,QCameraImageCapture等类时,需要在pro文件中添加 QT+=multimedia multimediawidgets

第一步:打开摄像头,并在界面上面显示

第二步:截图并将图片读取到内存中

这里使用新的信号槽的写法,QCameraImageCapture有保存路径的信号,我们只需要实现槽函数来获得这个路径就好。

四、sqlite数据库的使用

在使用数据库时,需要在pro文件中加上QT+=sql

五、简单多线程的使用

由于数据库的读写可能会花费大量时间,所以我们使用多线程来操作数据库的读写。有两种方法可以实现多线程。一种是重新实现QThread类中的run()方法,然后用start()来调用run()。在我们的小项目中使用是的moveToThread,将操作移动到线程。而我们需要做的是就是实现一个类,集成QObject,最后再主线程中使用moveToThread。

类的定义。

如何在主线程中操作这个类呢?我们来看这个代码

thread是由QThread定义的。将自定义类通过moveToThread方法移入到线程中,用thread来开启线程。这样一个简单的多线程的使用就成功。

六、view、model、Delegate的使用。

一、如何获取数据库的里面的信息

继承QSqlQueryModel类

通过构造函数传递了一条sql语句,使用setQuery(sql)来执行,这个样子就能获得数据。setHeaderData()用来设置标题头,要写在setQuery(sql)后面,不然的话会被覆盖掉。

二、如何获取到图片

想要图片在tableview中显示,思路是 model获得二进制信息,然后转为QPixmap类型,在代理中再把QPixmap给话出来

想要获得在model中获得数据,就得重写data()方法

item用来控制操作的列数,loadFromData是把二进制转为pixmap类型,第二个参数必须得加,上传前是什么格式,这边就是什么格式,如果格式写错,不会有图片出来,如果不加第二个参数,图片也能出来,但是会有内存泄露的提示。

现在已经把格式转变成pixmap了,那么就应该使用代理了。其实很简单,自定义一个类,继承代理类,然后重写paint方法。这样就就可以画出图形在view上面了。

这边需要注意的一点就是 如何QVariant转QPixmap=======>>>>QPixmap pixmap = index.model()->data(index).value<QPixmap>();当然也可以转其他需要的类型。

三、在tableview中显示数据

自适应列宽resizeColumnsToContents
设置行高verticalHeader()->setDefaultSectionSize(120)

这样我们就能把数据库中图片放到tableview中显示了。

七、Qt对excel的操作

我们对excel的操作利用了QAxObject,对于里面的参数,其实是操作了vba手册里面的方法

下面就直接上代码,代码上面都有基本的注释

void ExcelFunction::run()
{CoInitializeEx(NULL, COINIT_MULTITHREADED);QAxObject *excel = new QAxObject();excel->setControl("Excel.Application");excel->dynamicCall("SetVisible (bool Visible)","false");//不显示窗体excel->setProperty("DisplayAlerts", false);//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示QAxObject *workbooks = excel->querySubObject("WorkBooks");//获取工作簿集合workbooks->dynamicCall("Add");//新建一个工作簿QAxObject *workbook = excel->querySubObject("ActiveWorkBook");//获取当前工作簿QAxObject *worksheets = workbook->querySubObject("Sheets");//获取工作表集合QAxObject *worksheet = worksheets->querySubObject("Item(int)",1);//获取工作表集合的工作表1,即sheet1QAxObject *shapes = worksheet->querySubObject("Shapes");QAxObject *cellA,*cellB,*cellC,*cellD,*cellE,*cellF,*cellG,*cellH,*cellL;int cellrow=1;QString A="A"+QString::number(cellrow);//设置要操作的单元格,如A1QString B="B"+QString::number(cellrow);QString C="C"+QString::number(cellrow);QString D="D"+QString::number(cellrow);QString E="E"+QString::number(cellrow);QString F="F"+QString::number(cellrow);QString G="G"+QString::number(cellrow);QString H="H"+QString::number(cellrow);QString L="L"+QString::number(cellrow);cellA = worksheet->querySubObject("Range(QVariant, QVariant)",A);//获取单元格cellB = worksheet->querySubObject("Range(QVariant, QVariant)",B);cellC = worksheet->querySubObject("Range(QVariant, QVariant)",C);cellD = worksheet->querySubObject("Range(QVariant, QVariant)",D);cellE = worksheet->querySubObject("Range(QVariant, QVariant)",E);//获取单元格cellF = worksheet->querySubObject("Range(QVariant, QVariant)",F);cellG = worksheet->querySubObject("Range(QVariant, QVariant)",G);cellH = worksheet->querySubObject("Range(QVariant, QVariant)",H);cellL = worksheet->querySubObject("Range(QVariant, QVariant)",L);cellA->dynamicCall("SetValue(const QVariant&)",QVariant("姓名"));//设置单元格的值cellB->dynamicCall("SetValue(const QVariant&)",QVariant("性别"));cellC->dynamicCall("SetValue(const QVariant&)",QVariant("出生"));cellD->dynamicCall("SetValue(const QVariant&)",QVariant("住址"));cellE->dynamicCall("SetValue(const QVariant&)",QVariant("身份证"));cellF->dynamicCall("SetValue(const QVariant&)",QVariant("民族"));cellG->dynamicCall("SetValue(const QVariant&)",QVariant("签发机关"));cellH->dynamicCall("SetValue(const QVariant&)",QVariant("记录时间"));cellL->dynamicCall("SetValue(const QVariant&)",QVariant("有效期"));int jiange = 4;//间隔的初始值是4,后面每条记录的间隔是5int picX = 510;// 图片的初始X值是int picY = 14;// 图片的初始Y值是int rows =  SelectTableView->model()->rowCount();for(int i =0;i<rows;i++,jiange=jiange+5,picY=picY+68){cellA = worksheet->querySubObject("Range(QVariant, QVariant)","A"+QString::number(jiange));//获取单元格cellB = worksheet->querySubObject("Range(QVariant, QVariant)","B"+QString::number(jiange));cellC=worksheet->querySubObject("Range(QVariant, QVariant)","C"+QString::number(jiange));cellD=worksheet->querySubObject("Range(QVariant, QVariant)","D"+QString::number(jiange));cellE = worksheet->querySubObject("Range(QVariant, QVariant)","E"+QString::number(jiange));//获取单元格cellE->setProperty("NumberFormatLocal","@");//设置单元格格式为文本cellF = worksheet->querySubObject("Range(QVariant, QVariant)","F"+QString::number(jiange));cellG=worksheet->querySubObject("Range(QVariant, QVariant)","G"+QString::number(jiange));cellH=worksheet->querySubObject("Range(QVariant, QVariant)","H"+QString::number(jiange));cellL=worksheet->querySubObject("Range(QVariant, QVariant)","L"+QString::number(jiange));cellH->setProperty("NumberFormatLocal","@");cellA->dynamicCall("SetValue(const QVariant&)",QVariant(((QSqlQueryModel*)SelectTableView->model())->record(i).value(0)));//设置单元格的值cellB->dynamicCall("SetValue(const QVariant&)",QVariant(((QSqlQueryModel*)SelectTableView->model())->record(i).value(1)));cellC->dynamicCall("SetValue(const QVariant&)",QVariant(((QSqlQueryModel*)SelectTableView->model())->record(i).value(2)));cellD->dynamicCall("SetValue(const QVariant&)",QVariant(((QSqlQueryModel*)SelectTableView->model())->record(i).value(3)));cellE->dynamicCall("SetValue(const QVariant&)",QVariant(((QSqlQueryModel*)SelectTableView->model())->record(i).value(4)));cellF->dynamicCall("SetValue(const QVariant&)",QVariant(((QSqlQueryModel*)SelectTableView->model())->record(i).value(5)));cellG->dynamicCall("SetValue(const QVariant&)",QVariant(((QSqlQueryModel*)SelectTableView->model())->record(i).value(6)));cellH->dynamicCall("SetValue(const QVariant&)",QVariant(((QSqlQueryModel*)SelectTableView->model())->record(i).value(7)));cellL->dynamicCall("SetValue(const QVariant&)",QVariant(((QSqlQueryModel*)SelectTableView->model())->record(i).value(9)));QVariant imgvar=((QSqlQueryModel*)SelectTableView->model())->record(i).value(8);QPixmap pixmap = imgvar.value<QPixmap>();//将QVariant转为QPixmappixmap.save("a.jpg");//保存临时图片QFile *file =new QFile("a.jpg");QFileInfo  *info = new QFileInfo(*file);shapes->dynamicCall("AddPicture( QString&, bool, bool, double, double, double, double)",QDir::toNativeSeparators(info->absoluteFilePath()),true,true,picX,picY,60,60);file->close();file->remove();delete info;delete file;}workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(AppDirPath+"/"+"Info.xlsx"));//保存至filepath,注意一定要用QDir::toNativeSeparators将路径中的"/"转换为"\",不然一定保存不了。workbook->dynamicCall("Close()");//关闭工作簿excel->dynamicCall("Quit()");//关闭exceldelete excel;qDebug()<<"载入成功";emit signal_ExcelSuccess();
}

因为把数据导入到excel中比较费时,所以我们把操作放到了线程中,直接重写了run方法。但是需要在run的开头写上 CoInitializeEx(NULL, COINIT_MULTITHREADED);
不然会报错。

以上就是一个练手的小项目的一个总结,上面的代码肯定有许多需要改进的地方,也许等我工作了,亦或是能力再次提升了。对于代码应该还会有更多的体会。

项目之Qt实现访客系统相关推荐

  1. 曾经做过的2个项目:图书销售管理系统和访客系统

    第三波书店 项目简介: 第三波书店项目为网上图书销售管理系统,包括前台图书的展示.图书购买下单.订单审核.付款等一套完善的电子商务管理系统.使用第三波书店项目,可以实现对注册用户,图书上架,图书分类的 ...

  2. 基于人脸识别技术实战开发人证比对访客系统

    2019独角兽企业重金招聘Python工程师标准>>> 最近有个小区用到了虹软的人脸识别,效果还不错.又有一个项目要用人证访客对比,分享一下项目,希望可以帮到有需要的. 码字前先上项 ...

  3. 基于人脸识别技术的人证比对访客系统

    最近有个小区用到了虹软的人脸识别,效果还不错.又有一个项目要用人证访客对比,分享一下项目,希望可以帮到有需要的. 码字前先上项目地址:https://gitee.com/panmingzhi/IdCa ...

  4. 基于手工登记的被动访客系统

    假设应用场所已经使用了通道.梯控.门禁出入管理系统.来访者到达入口或前台,告知安保人员将要访问的公司或人员以及访问原因,安保人员致电被访公司确认是否允许,如果允许访问,访问者在登记簿上填写身份信息,安 ...

  5. 人脸识别访客系统融合UWB,实现法院安全防范可视化

    作为国家的法定审判机关,法院由于其特殊的角色职能,往往因为社会矛盾集中而易出现突发事件.为了保障法院审判工作能够顺利进行,智慧法院建设从3.0版进入到4.0版,EHIGH恒高利用UWB定位系统于视频监 ...

  6. 小技巧绕过Sina Visitor System(新浪访客系统)

    0x00 前言 一直以来,爬虫与反爬虫技术都时刻进行着博弈,而新浪微博作为一个数据大户更是在反爬虫上不遗余力.常规手段如验证码.封IP等等相信很多人都见识过-- 当然确实有需要的话可以通过新浪开放平台 ...

  7. android 人脸检测 facedec,智能访客系统中的人脸检测及方向判别算法.pdf

    智能访客系统中的人脸检测及方向判别算法,人脸识别算法,人脸检测算法,opencv人脸识别算法,人脸识别算法有哪些,人脸识别pca算法,人脸比对算法,android人脸识别算法,adaboost人脸检测 ...

  8. 平安城市下的智能访客系统

    什么是"平安城市"?这是近段时间人们最为关注的热点话题,如何让我们生活的场所更加安全,如何构建一个强大的安防网络来保证整个城市的安全,运用科学.先进的技防手段是最为行之有效的,在此 ...

  9. 倾情力荐,智能访客系统的正确打开方式

    任何科学的进步,都是以人为本的.无论时代怎么变迁,生活的脚步不停向前.世界的每一个角落,每天都在上演着不同的故事.人多人少,每一处既是别人眼中的风景,也是自己的轨迹.在人口流量多的地方,总是聚集着不同 ...

最新文章

  1. Android学习日记(1)
  2. SQLAlchemy简单操作
  3. 奶源向左配方向右,飞鹤、澳优、贝因美们要如何重振国产奶粉?
  4. list乘法复制带来的坑
  5. 语法制导的翻译是如何实现的_全球化企业应该如何选择机器翻译解决方案?
  6. 安卓PopupWindow
  7. 语言nomogram校准曲线图_医学统计与R语言:Meta 回归作图(Meta regression Plot)
  8. 把地图中的道路以线条提取出来_自动驾驶中基于车道线的高清制图方法回顾
  9. nodejs 复制、移动文件
  10. 我眼中的“SSD” ..update
  11. Folx Pro苹果BT磁力多线程下载工具
  12. c++primer5 3.17
  13. mysql 序系列化_J2SE中的序默认序列化_MySQL
  14. 2022.8.22 小W的玻璃弹珠 题解
  15. 调整report_timing输出格式
  16. Flutter入门环境搭建
  17. 今日头条开通,分享我爱的数码科技
  18. urllib中urlparse使用技巧以及iter_content图片边下边存到硬盘使用
  19. sql优化和索引常见的面试题(面试总结)
  20. 安装RedHat Linux 7.4

热门文章

  1. 建立二叉树并实现层序遍历
  2. 个人的中小型项目前端架构浅谈
  3. 如何给插画上色?怎么上色才好看?
  4. matlab演奏《卡农》代码
  5. Dev-C++5.11游戏创作之飞机大战
  6. MuMu模拟器提取离线安装包
  7. 传苹果正在生产5英寸视网膜屏幕iPhone或iPad
  8. 现代CMake高级教程 - 第 1 章:添加源文件
  9. 邵阳一中2021高考成绩查询,湖南邵阳最好的4所高中,谁排第一有争议?2020年高考成绩说话...
  10. openstack的逻辑概念_精通openstack学习笔记(一)