衡水提供网站设计公司哪家专业,广东建设资格注册中心网站,嘉兴港区建设局网站,制作网页动画的软件在之前的文章中,有介绍通过QProcess的方式启动QWidget应用,然后将其窗口嵌入到其他的qt应用中,作为子窗口使用.这篇文章主要介绍qt插件的方式将QWidget应用的窗口封装为插件,然后作为其他Qt应用中的子窗口使用.
插件优点:
与主程序为同一个进程,免去了进程间繁琐的通信方式,…在之前的文章中,有介绍通过QProcess的方式启动QWidget应用,然后将其窗口嵌入到其他的qt应用中,作为子窗口使用.这篇文章主要介绍qt插件的方式将QWidget应用的窗口封装为插件,然后作为其他Qt应用中的子窗口使用.
插件优点:
与主程序为同一个进程,免去了进程间繁琐的通信方式,在不同进程间通信时,需要有一套协议来保证数据的及时性及稳定性.比较繁琐,而插件的方式,通过插件接口文件来进行通信,在接口文件中定义API,
接口文件(定义为纯虚类)(主程序通过接口文件来访问该插件,插件通过继承该接口,重写所有纯虚函数)
#pragma once#include QtPluginQT_BEGIN_NAMESPACE
class QString;
class QWidget;
QT_END_NAMESPACE//定义视觉检测接口
class InterfaceVisionMeasure
{
public:virtual ~InterfaceVisionMeasure() default;/// summary/// 创建视觉窗口对象指针/// /summary/// param nameiLanguage0为英文,1为中文/param/// param nameparent父对象/param/// returns窗口指针/returnsvirtual void* CreatWindow(int iLanguage, QWidget* parent nullptr) 0;/// summary/// 获取对应序号轴编码器坐标/// /summary/// param nameGetAxisEncVal回调对象/paramvirtual void RegisterGetAxisEncVal(const std::functionvoid(int, double) GetAxisEncVal) 0;/// summary/// 获取对应序号轴规划位置坐标/// /summary/// param nameGetAxisPrfVal回调对象/paramvirtual void RegisterGetAxisPrfVal(const std::functionvoid(int, double) GetAxisPrfVal) 0;/// summary/// 获取内部变量的值/// /summary/// param nameGetVariableInVal回调对象/paramvirtual void RegisterGetVariableInVal(const std::functionvoid(int, double) GetVariableInVal) 0;/// summary/// 设置内部变量的值/// /summary/// param nameSetVariableInVal回调对象/paramvirtual void RegisterSetVariableInVal(const std::functionvoid(int, const double) SetVariableInVal) 0;/// summary/// 设置当前测量文件路径(测量文件)/// /summary/// param namedir测量文件路径/paramvirtual void SetCurrentMeaureFile(const QString dir) 0;/// summary/// 开启测量/// /summary/// param nameindexMain工序号/param/// param nameIndexSub工序号中的子序号/paramvirtual void StartMeasureProcess(int indexMain, int IndexSub) 0;/// summary/// 测量结果返回到主程序/// /summary/// param nameMeasureResult回调对象/paramvirtual void RegisterMeasureResult(const std::functionvoid(const int, const QStringList, const QVectordouble) MeasureResult) 0;/// summary/// 创建测量文件(编辑文件)/// /summary/// param namedir创建路径/param/// returns0为正常,非0为失败/returnsvirtual int NewMeasureFile(const QString dir)0;/// summary/// 打开测量文件(编辑文件)/// /summary/// param namedir打开路径/param/// returns0为正常,非0为失败/returnsvirtual int OpenMeasureFile(const QString dir) 0;/// summary/// 另存为测量文件(编辑文件)/// /summary/// param namesrcDir源文件路径/param/// param namedesDir目标文件路径/param/// returns0为正常,非0为失败/returnsvirtual int SaveAsMeasureFile(const QString srcDir, const QString desDir) 0;/// summary/// 设置当前显示页/// /summary/// param nameindexMain对应工序页, -10为找中心,-11为对焦/param/// param nameindexSub对应工序页中的第几页/param/// returns0为成功, /returnsvirtual int SetShowMeasurePage(int indexMain, int indexSub)0;/// summary/// 获取当前测量工程工序列表(测量文件)/// /summary/// param namelistType工序列表/param/// returns0为成功/returnsvirtual int GetCurMeasureProgram(QVectorint listType)0;
};QT_BEGIN_NAMESPACE
#define Interface_VisionMeasure_IID Demina.Nc.VisionMeasureInterface/1.0
Q_DECLARE_INTERFACE(InterfaceVisionMeasure, Interface_VisionMeasure_IID)
QT_END_NAMESPACE
重写接口类: h文件
#pragma once#include QObject
#include InterfacesVisionMeasure.hclass qcDllVisionMeasure : public QObject, public InterfaceVisionMeasure
{Q_OBJECTQ_INTERFACES(InterfaceVisionMeasure)Q_PLUGIN_METADATA(IID Interface_VisionMeasure_IID FILE DllVisionMeasure.json)
public:qcDllVisionMeasure(QObject* parent nullptr);~qcDllVisionMeasure() override;/// summary/// 创建视觉窗口对象指针/// /summary/// param nameparent父对象/param/// returns窗口指针/returnsvoid* CreatWindow(int iLanguage, QWidget* parent nullptr) override;/// summary/// 获取对应序号轴编码器坐标/// /summary/// param nameGetAxisEncVal回调对象/paramvoid RegisterGetAxisEncVal(const std::functionvoid(int, double) GetAxisEncVal) override;/// summary/// 获取对应序号轴规划位置坐标/// /summary/// param nameGetAxisPrfVal回调对象/paramvoid RegisterGetAxisPrfVal(const std::functionvoid(int, double) GetAxisPrfVal) override;/// summary/// 获取内部变量的值/// /summary/// param nameGetVariableInVal回调对象/paramvoid RegisterGetVariableInVal(const std::functionvoid(int, double) GetVariableInVal) override;//设置内部变量的值void RegisterSetVariableInVal(const std::functionvoid(int, const double) SetVariableInVal) override;/// summary/// 设置当前测量文件路径/// /summary/// param namedir测量文件路径/paramvoid SetCurrentMeaureFile(const QString dir) override;/// summary/// 开启测量/// /summary/// param nameindexMain工序号/param/// param nameIndexSub工序号中的子序号/paramvoid StartMeasureProcess(int indexMain, int IndexSub) override;/// summary/// 测量结果返回到主程序/// /summary/// param nameMeasureResult回调对象/paramvoid RegisterMeasureResult(const std::functionvoid(const int, const QStringList, const QVectordouble) MeasureResult) override;/// summary
/// 创建测量文件
/// /summary
/// param namedir创建路径/param
/// returns0为正常,非0为失败/returnsint NewMeasureFile(const QString dir) override;/// summary/// 打开测量文件/// /summary/// param namedir打开路径/param/// returns0为正常,非0为失败/returnsint OpenMeasureFile(const QString dir) override;/// summary/// 另存为测量文件/// /summary/// param namesrcDir源文件路径/param/// param namedesDir目标文件路径/param/// returns0为正常,非0为失败/returnsint SaveAsMeasureFile(const QString srcDir, const QString desDir) override;/// summary/// 设置当前显示页/// /summary/// param nameindexMain对应工序页, -10为找中心,-11为对焦/param/// param nameindexSub对应工序页中的第几页/param/// returns0为成功, /returnsint SetShowMeasurePage(int indexMain, int indexSub) override;/// summary/// 获取当前测量工程工序列表/// /summary/// param namelistType工序列表/param/// returns0为成功/returnsint GetCurMeasureProgram(QVectorint listType) override;
private://视觉界面对象指针void* m_pMainWnd{};
};在实现cpp中,封装QWidget窗口,创建其实例
#include stdafx.h
#include qcDllVisionMeasure.h
#include qwaMeasureToolsVM.hqcDllVisionMeasure::qcDllVisionMeasure(QObject *parent)
:QObject(parent)
{}qcDllVisionMeasure::~qcDllVisionMeasure()
{}void* qcDllVisionMeasure::CreatWindow(int iLanguage, QWidget* parent)
{qwaMeasureToolsVM* widget new qwaMeasureToolsVM(iLanguage,true,parent);m_pMainWnd (void*) widget;return m_pMainWnd;
}//采用回调的方式实现,插件通过回调函数来获取,设置参数
//获取对应序号轴编码器坐标
void qcDllVisionMeasure::RegisterGetAxisEncVal(const std::functionvoid(int, double) GetAxisEncVal)
{if (m_pMainWnd){((qwaMeasureToolsVM*)m_pMainWnd)-RegisterGetAxisEncVal(GetAxisEncVal);}
}//获取对应序号轴规划位置坐标
void qcDllVisionMeasure::RegisterGetAxisPrfVal(const std::functionvoid(int, double) GetAxisPrfVal)
{}//获取内部变量的值
void qcDllVisionMeasure::RegisterGetVariableInVal(const std::functionvoid(int, double) GetVariableInVal)
{if (m_pMainWnd){((qwaMeasureToolsVM*)m_pMainWnd)-RegisterGetVariableInVal(GetVariableInVal);}
}//设置内部变量的值
void qcDllVisionMeasure::RegisterSetVariableInVal(const std::functionvoid(int, const double) SetVariableInVal)
{if (m_pMainWnd){((qwaMeasureToolsVM*)m_pMainWnd)-RegisterSetVariableInVal(SetVariableInVal);}
}/// summary/// 设置当前测量文件路径/// /summary/// param namedir测量文件路径/param
void qcDllVisionMeasure::SetCurrentMeaureFile(const QString dir)
{if (m_pMainWnd){((qwaMeasureToolsVM*)m_pMainWnd)-SetCurrentMeaureFileByMainApp(dir);}
}/// summary
/// 开启测量
/// /summary
/// param nameindexMain工序号/param
/// param nameIndexSub工序号中的子序号/param
void qcDllVisionMeasure::StartMeasureProcess(int indexMain, int IndexSub)
{if (m_pMainWnd){((qwaMeasureToolsVM*)m_pMainWnd)-StartMeasureProcessByMainApp(indexMain, IndexSub);}
}/// summary
/// 测量结果返回到主程序
/// /summary
/// param nameMeasureResult回调对象/param
void qcDllVisionMeasure::RegisterMeasureResult(const std::functionvoid(const int, const QStringList, const QVectordouble) MeasureResult)
{if (m_pMainWnd){((qwaMeasureToolsVM*)m_pMainWnd)-RegisterMeasureResult(MeasureResult);}
}/// summary
/// 创建测量文件
/// /summary
/// param namedir创建路径/param
/// returns0为正常,非0为失败/returns
int qcDllVisionMeasure::NewMeasureFile(const QString dir)
{if (m_pMainWnd){return ((qwaMeasureToolsVM*)m_pMainWnd)-NewMeasureFile(dir);}return -1;
}/// summary
/// 打开测量文件
/// /summary
/// param namedir打开路径/param
/// returns0为正常,非0为失败/returns
int qcDllVisionMeasure::OpenMeasureFile(const QString dir)
{if (m_pMainWnd){return ((qwaMeasureToolsVM*)m_pMainWnd)-OpenMeasureFile(dir);}return -1;
}/// summary
/// 另存为测量文件
/// /summary
/// param namesrcDir源文件路径/param
/// param namedesDir目标文件路径/param
/// returns0为正常,非0为失败/returns
int qcDllVisionMeasure::SaveAsMeasureFile(const QString srcDir, const QString desDir)
{ if (m_pMainWnd){return ((qwaMeasureToolsVM*)m_pMainWnd)-SaveAsMeasureFile(srcDir, desDir);}return -1;
}/// summary
/// 设置当前显示页
/// /summary
/// param nameindexMain对应工序页, -10为找中心,-11为对焦/param
/// param nameindexSub对应工序页中的第几页/param
/// returns0为成功, /returns
int qcDllVisionMeasure::SetShowMeasurePage(int indexMain, int indexSub)
{ if (m_pMainWnd){return ((qwaMeasureToolsVM*)m_pMainWnd)-SetShowMeasurePage(indexMain, indexSub);}return -1;
}/// summary
/// 获取当前测量工程工序列表
/// /summary
/// param namelistType工序列表/param
/// returns0为成功/returns
int qcDllVisionMeasure::GetCurMeasureProgram(QVectorint listType)
{ if (m_pMainWnd){return ((qwaMeasureToolsVM*)m_pMainWnd)-GetCurMeasureProgram(listType);}return -1;
} json接口描述json文件,放在头文件同目录
{Type: [BT150D],Name: VisionMeasure,Description: this is vision measure tools.,Version: 1.0.0,Vendor: demina
}
设置工程生成为从exe改为dll 将qt插件功能启动 至此重新封装QWdiget结束, 等待生成的dll,将其复制到主程序的exe文件路径下即可. 在主程序中要做的工作,即通过接口文件 声明一个接口实例指针.
bool NcCoreQt::InitPluginVisionMeasure()
{QString dir qApp-applicationDirPath();dir /VisionMeasure.dll;//视觉插件的dllm_pPluginLoaderVM new QPluginLoader(dir, this);QObject* plugin m_pPluginLoaderVM-instance();//qDebug() pluginLoader.metaData();if (plugin) {m_pInterfaceVM qobject_castInterfaceVisionMeasure*(plugin);if (m_pInterfaceVM){ qInfo() tr(Load vision measure interface successful);return true;}}else{qDebug() m_pPluginLoaderVM-errorString();}return false;
}