Halcon联合C++(QT)编程
一、环境配置
1.1 Qt和VS20105的环境配置
在VS2015中新建Qt工程,点击工程属性,配置好包含目录和库目录
1.2 配置Halcon和C++的环境
点击工程属性,配置附加包含目录。
配置附加库目录
配置附加依赖项(后期在编程过程中可能还会添加其他lib文件名)
将下图中的.dll文件复制到程序的源码文件夹
在头文件中添加如下代码,就可以使用联合Halcon编程了。
PS:其实我们可以参考Halcon安装目录下的例子进行编程,关于每一种语言的例子都包含了。
二、Halcon导成C++代码联合编程
三、直接用Halcon的C++方法联合编程
参考Halcon联合C#编程,两者类似。
四、只用Halcon的引擎联合C++编程
新建项目,将下图中的文件复制到项目的源码文件夹下。
在HalconUnionaAdd.h文件中添加如下代码:
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_HalconUnionaAdd.h"
#include "HalconCpp.h"
#include "HDevEngineCpp.h"
#include "my_error_output.h"//Halcon安装目录下例子文件
#include "my_hdevoperatorimpl.h"//Halcon安装目录下例子文件
#include "my_thread_impl.h"//Halcon安装目录下例子文件
using namespace HalconCpp;
using namespace HDevEngineCpp;
class HalconUnionaAdd : public QMainWindow
{
Q_OBJECT
public:
HalconUnionaAdd(QWidget *parent = Q_NULLPTR);
~HalconUnionaAdd();
private:
Ui::HalconUnionaAddClass ui;
HTuple windHandle;
HDevEngine myEngine;
MyHDevOperatorImpl *myOperatorImpl;
HDevProgram program;
private slots:
void SelectPro();
void SelectFunc();
void RunSinglePro();
};
在HalconUnionaAdd.cpp文件中添加如下代码:
#include "HalconUnionaAdd.h"
#include "qfiledialog.h"
HalconUnionaAdd::HalconUnionaAdd(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
myOperatorImpl = new MyHDevOperatorImpl();
Hlong windId = (Hlong)ui.gphView_PicShow->winId();
myEngine.SetHDevOperatorImpl(myOperatorImpl);
connect(ui.btn_SelectPro, &QPushButton::clicked, this, &HalconUnionaAdd::SelectPro);
connect(ui.btn_SelectFunc, &QPushButton::clicked, this, &HalconUnionaAdd::SelectFunc);
connect(ui.btn_RunSinglePro, &QPushButton::clicked, this, &HalconUnionaAdd::RunSinglePro);
}
HalconUnionaAdd::~HalconUnionaAdd()
{
delete myOperatorImpl;
myOperatorImpl = nullptr;
}
void HalconUnionaAdd::SelectPro()
{
QString path = QFileDialog::getOpenFileName();
ui.txt_SelectPro->setText(path);
std::string proPath = path.toStdString();
program.LoadProgram(proPath.c_str());
HDevProgramCall programCall = program.Execute();
//HTuple result = programCall.GetCtrlVarTuple("FinArea");
//ui.labl_Result->setText(QString::number(result[0].D()));
}
void HalconUnionaAdd::SelectFunc()
{
QString path= QFileDialog::getExistingDirectory();
ui.txt_SelectFunc->setText(path);
QByteArray bytePath = path.toLocal8Bit();
const char * funcPath = bytePath.constData();
myEngine.SetProcedurePath(funcPath);
}
void HalconUnionaAdd::RunSinglePro()
{
QString path = QFileDialog::getOpenFileName();
ui.txt_SingleProPath->setText(path);
QByteArray byteSinglePath = path.toLocal8Bit();
const char * singleProPath = byteSinglePath.constData();
HDevProgram singleProgram;
singleProgram.LoadProgram(singleProPath);
HDevProgramCall singleProgramCall = singleProgram.Execute();
}
点击运行
单独运行一个程序
通过外部函数(.hdvp)和程序(.hdev)运行程序
只是目前还没有办法将运行的窗口绑定到窗体的窗口内,