1、qt中使用halcon:
(1)halcon配置:
首先要安装好halcon
,然后找到halcon
的安装目录,直接右击halcon
打开文件夹位置,我的目录是C:\Program Files\MVTec\HALCON-19.05-Progress
。
把halcon
目录下的include
文件夹和lib
文件夹复制到qt
项目路径:
然后在.pro
文件中配置include
和lib
路径:
#--------------halcon--------------
INCLUDEPATH += $$PWD/include
INCLUDEPATH += $$PWD/include/halconcpp
LIBS += $$PWD/lib/x64-win64/halcon.lib
LIBS += $$PWD/lib/x64-win64/halconc.lib
LIBS += $$PWD/lib/x64-win64/halconcpp.lib
LIBS += $$PWD/lib/x64-win64/halconcppxl.lib
LIBS += $$PWD/lib/x64-win64/halconcxl.lib
LIBS += $$PWD/lib/x64-win64/halconxl.lib
LIBS += $$PWD/lib/x64-win64/hdevenginecpp.lib
LIBS += $$PWD/lib/x64-win64/hdevenginecppxl.lib
LIBS += $$PWD/lib/x64-win64/libiomp5md.lib
#----------------------------------
注意上面的lib
文件要根据自己lib
文件夹中的文件来,不同版本halcon
lib
文件夹中的文件是不同的。
在halcon
文件夹的bin
文件夹中的halcon.dll
和halconcpp.dll
文件复制到项目生成的debug
文件夹中。关于这点,我不是很清楚,之前使用的时候,没有复制dll
会报错提示缺少这两个链接库,但是后来用的时候即使没有复制这两个dll
也没报错,不知道是不是跟某些函数有关,也可能是我添加了halcon
环境变量,我没复制过去也能根据环境变量找到这两个dll
吧。最好还是复制一下吧。
(2)测试:
在mianwindow.h
中头部添加:
#include "HalconCpp.h"
#include "HDevThread.h"
using namespace HalconCpp;
在mainwindow.h
中添加:
public:
HObject ho_Image, ho_Region, ho_ConnectedRegions;
HObject ho_SelectedRegions;
HTuple hv_Width, hv_Height, hv_WindowID;
//除此之外,还要添加一个按钮来触发
public slots:
void on_pushButton_clicked();
在mainwindow.cpp
中添加按钮槽函数:
(代码参考自:http://blog.sina.com.cn/s/blog_13153455f0102uwb5.html)
//halcon测试
void MainWindow::on_pushButton_clicked(){
ReadImage(&ho_Image, "C:/Users/Administrator/Pictures/qtback/1.jpg"); //图片路径修改一下
GetImageSize(ho_Image, &hv_Width, &hv_Height);
SetWindowAttr("background_color","black");
OpenWindow(0,0,hv_Width/2,hv_Height/2,0,"","",&hv_WindowID);
HDevWindowStack::Push(hv_WindowID);
if (HDevWindowStack::IsOpen())
DispObj(ho_Image, HDevWindowStack::GetActive());
Threshold(ho_Image, &ho_Region, 0, 128);
Connection(ho_Region, &ho_ConnectedRegions);
SelectShape(ho_ConnectedRegions, &ho_SelectedRegions, "area", "and", 5000, 9000);
if (HDevWindowStack::IsOpen())
DispObj(ho_SelectedRegions, HDevWindowStack::GetActive());
}
运行程序,点击按钮:
发现程序成功运行了。
之前我在qt
中使用halcon
时,一调用halcon
的函数就报错abort() has been called
,现在也没搞懂当时是什么原因。当时我弄的环境也比较复杂,qt
是5.6.3
的32
位的,halcon
是12.0
的。后来我是怎么解决的呢,因为当时我用的halcon
的dll
是直接安装完的halcon
中的文件,没有p j,后来替换成了p j的dll
,然后又乱七八糟改了一堆东西,然后程序又莫名其妙可以运行了,实在不解。
(3)halcon窗口结合qt控件使用:
在mainwindow.cpp
中创建HTuple
对象:
HTuple hv_WindowID;
绑定窗口和控件的winId
,我这里使用的是QGraphView
,其他控件一样使用:
SetWindowAttr("background_color","black");
OpenWindow(0,0,ui->graphicsView_4->width(),ui->graphicsView_4->height(),
(Hlong)ui->graphicsView_4->winId(),"","",&hv_WindowID);
只打开一个就够了,按照上面的设置,窗口会显示黑色。
需要让控件显示halcon对象时,就可以通过访问hv_WindowID
就可以了:
HObject hImage;
DispObj(hImage, hv_WindowID);
运行结果:
由于我这里我是结合海康相机的回调来显示的,相机拍到一团黑色,不要见怪。
2、新版本qt中使用mysql:
参考自:https://blog.csdn.net/qq_39311335/article/details/105874438
旧版本的qt
能直接使用mysql
,但是新版本qt
中不再自带mysql
驱动了,所以要自己来生成一下才能用,用了一段时间了,记录一下,免得以后忘了怎么弄的。
使用qtcreater
中打开:E:\qt\5.14.1\Src\qtbase\src\plugins\sqldrivers\mysql\mysql.pro
(注意这不是我自己的项目),如果qt
中没有Src
文件夹,要么在别的文件夹,要么没装。
在mysql.pro
中修改成下面的代码:
TARGET = qsqlmysql
HEADERS += $$PWD/qsql_mysql_p.h
SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp
#QMAKE_USE += mysql #这里注释掉
OTHER_FILES += mysql.json
PLUGIN_CLASS_NAME = QMYSQLDriverPlugin
include(../qsqldriverbase.pri)
# ---添加---------------------
# 这里根据自己安装mysql的目录来
INCLUDEPATH += "E:/1/mysql-8.0.24-winx64/include"
DEPENDPATH += "E:/1/mysql-8.0.24-winx64/include"
LIBS += "E:/1/mysql-8.0.24-winx64/lib/libmysql.lib"
# ---添加---------------------
点击小锤子或重新构建,构建完成后,安装mysql
的盘中会出现一个plugins
文件夹,里面包含了生成的mysql
驱动:
把这四个文件放到自己使用的msvc
或mingw
运行库的sql
驱动中,如我这里的目录:E:\qt\5.14.1\msvc2015_64\plugins\sqldrivers
。
然后就是类似sqlite
的配置了,在.pro
中添加:
QT += sql
mainwindow.h
中:
#include <QSqlDatabase>
在mainwindow.cpp
中添加:
//输出支持的sql驱动
qDebug()<<"available drivers:";
QStringList drivers = QSqlDatabase::drivers();
foreach(QString driver, drivers)
qDebug()<<driver;
QSqlDatabase data_base2 = QSqlDatabase::addDatabase("QMYSQL");
就不会提示无法加载mysql
了。
连接本地的mysql
时,通过ip
+ 端口
+ 数据库名
来连接:
database = QSqlDatabase::addDatabase("QMYSQL"); //用户名:root //密码:root
database.setHostName("localhost"); //设置主机地址
database.setPort(3306); //设置端口 默认3306
database.setDatabaseName("mydatabase"); //设置数据库名称
database.setUserName("root"); //对应数据库的用户名
database.setPassword("root");//对应数据库的密码
if(!database.open())
emit sendLog(u8"数据库未能连接"),
qDebug()<<u8"数据库未能连接";
else
qDebug()<<u8"成功连接";
mysql
在qt
中的使用方法和sqlite
差不多,也是通过QSqlQuery
来执行语句的,如:
QSqlQuery sql_query;
//插入数据
if(!sql_query.exec( QString("insert into serialNumber values('%1', '%2','%3','%4','%5')").arg(str1).arg(str2).arg(str3).arg(str4).arg(str5)))
{
qDebug() << sql_query.lastError();
}
else
{
qDebug() << "inserted serialNumber!";
}
有一点要注意的是,在使用时我发现mysql
打开的比sqlite
要慢的。之前使用sqlite
时,我习惯是打开数据库,查询/插入,然后再关闭数据库。但是在mysql
中使用这一流程时遇到了问题,每次点击按钮打开数据库,然后查询,然后再关闭数据库,这一过程能用到1秒钟左右,也就是我点击按钮,到显示数据中间要卡顿个1秒左右才显示,所以在后来的使用中,我基本都是在初始化的时候打开数据库,在析构函数中关闭数据库。