在C++中,与接口等价的是具有纯虚函数的类。因此需要一个包含了期望在插件中出现所有函数的接口
1.接口
接口是一个基本上不需要做什么的类,但是它列出了应用程序需要的所有插件的草图。在实际项目中都是从一开始就将所有必须的函数都包含在接口中,后期不修改接口中的内容。
打开Qt Creator
选择headfile之后
进入下一步输入插件名称 这里是cvplugininterface 下一步一直到进入编辑模式 修改代码如下图
附上代码
#ifndef CVPLUGININTERFACE_H #define CVPLUGININTERFACE_H #endif // CVPLUGININTERFACE_H #include<QObject> #include<QString> #include<opencv2/opencv.hpp> class CvPluginInterface{ public: virtual ~CvPluginInterface(){} virtual QString description()=0; virtual void processImage(const cv::Mat &inputImage,cv::Mat &outputImage)=0; }; #define CVPLUGININTERFACE_IID "com.amin.cvplugininterface" Q_DECLARE_INTERFACE(CvPluginInterface,CVPLUGININTERFACE_IID) #endif
ifndef CVPLUGININTERFACE_H
define CVPLUGININTERFACE_H
endif
这部分代码对每个头文件只进行一次的包含和处理,C++中有很多方法可以实现此目标,但是这种方法最为广泛的使用,尤其是利用Qt和Opencv进行高程度夸平台支持
前面的代码基本上包含了Qt中插件接口所需的所有内容。在市里接口中只有两种简答类型的函数需要插件支持
前面接口的第一个公有成员函数是虚析构函数,它是最重要的方法之一,但是往往被很多人忽视,
基本上,任何一个虚拟方法以及打算使用多形态方法的C++基类,都必须包含一个虚析构函数。这有助于确保当利用基类的指针访问子类时,可以调用子类的析构函数。可是出现这种常见的C++编程错误时,大多数C++编译器并没有警示信息。
因此我们的插件接口包含了一个名为descprintion()的函数,他的目的是返回所有插件描述及相关有用的信息,插件接口还包含了一个名为processImage的函数,该函数以OpenCV Mat类作为输入,返回“1”作为输出,很明显,在这个函数中,我们每个插件都可以执行某种图像处理、过滤等操作,并返回处理结果。
在此之后,使用Q_DECLARE_INTERFACE宏将类定义为接口。如果不包含这个宏,Qt将无法把这个类作为插件接口来使用 CVPLUGININTERFACE_IID 是与包名格式类似的唯一字符串,但是可以根据自己的喜好来更改。
下一步创建插件
现在将使用CvPluginInterface 接口类,创建名为median_filter_plugin的插件。首先
一定要将类型选为Shared Library 然后输入media——filter_plugin 作为名称并单击next,然后选取工具箱类作为桌面,并单击 forward 在select required modeules 页面中,确保只选中了QtCore 并单击next ,不需要修改任何选项,直到最终进入了QtCreator的代码编辑页面