编写软件第一个插件(Hello World)

11 篇文章 6 订阅
7 篇文章 0 订阅

1、插件环境搭建可以看前面一篇博客

2、注册命令

2.1、添加函数

1、在rastertestcmd.h添加初始化函数以及功能函数的声明

/* @接口 程序初始化
 * @邮箱 575814050@qq.com
 * @时间 2020年10月12日
 */
bool initApplication();

/* @接口 测试命令
 * @邮箱 575814050@qq.com
 * @时间 2020年10月12日
 */
void rasterTestCmd();

2、在rastertestcmd.cpp中添加实现

void rasterTestCmd()
{
	dox::Object<dox::IDoxCmdLine> iDoxCmdLine(NIL);
	iDoxCmdLine->print("Hello World");
}

bool initApplication()
{
	dox::Object<dox::IDoxCommand> iDoxCommand(NIL);
	iDoxCommand->registerCommand("rastertest", "rastertestcmd", rasterTestCmd);
	return true;
}

rasterTestCmd函数中,我们用了iDoxCmdLine中的print接口打印输出的信息在软件的命令行中。
initApplication函数中,调用了IDoxCommand中的registerCommand接口来进行命令注册。其中第一个参数是表示命令组的命令,第二参数是命令名称,第三个参数就是注册功能函数

2.2、调用程序初始化函数

在seed_rastertest.cpp文件的attachDoxygen函数中调用初始化函数

OUTCAPI bool attachDoxygen(void *)
{
	return initApplication();
}

3、到这里注册命令结束。编译完成之后,将seed_rastertest.dll放到plugins文件夹下然后运行软件,在命令行中执行刚才注册的命令名称(rastertestcmd),结果如下图所示:
在这里插入图片描述

3、注册类

3.1、添加接口类文件

1、接口类文件中定义的都是纯虚函数,注册类的好处是可以在其他模块中调用注册类的接口。比如我在A模块中声明了一个接口类interface_a,然后我再B模块中想调用的话,如果不用注册类的方法,那么我只能将接口类的实现在B模块中重写一遍,但是使用注册类的机制,那么我就可以在B模块中直接调用A模块注册的接口类。
2、接口类都是继承dox::IObject,并且都要添加REGISTER_INTERFACE(IRasterTestClass, dox::IObject)IRasterTestClass是抽象类,也是实现类的基类,dox::IObject是注册类的基类。

#ifndef IRASTERTESTCLASS_H
#define IRASTERTESTCLASS_H

#include "core/iobject.h"

class IRasterTestClass
	: public dox::IObject
{
	REGISTER_INTERFACE(IRasterTestClass, dox::IObject)

public:

	/* @接口 测试接口
	 * @类名 [IRasterTestClass]
	 * @邮箱 575814050@qq.com
	 * @时间 2020年10月12日
	 */
	virtual void testInterface() = 0;

};
#endif /*IRASTERTESTCLASS_H*/    

3.2、添加类实现文件

实现类必须继承刚才定义的抽象类,并且把抽象类的纯虚接口都实现。并且在实现类的中必须要添加REGISTER_ACTUALIZE(RasterTestClass, IRasterTestClass) 这一句,RasterTestClass是实现类类名,IRasterTestClass是抽象类,也就是基类。

3.2.1、实现类头文件

#ifndef RASTERTESTCLASS_H
#define RASTERTESTCLASS_H

#include "irastertestclass.h"

class RasterTestClass
	: public IRasterTestClass
{
	REGISTER_ACTUALIZE(RasterTestClass, IRasterTestClass)

public:

	/* @接口 默认构造函数
	 * @类名 [RasterTestClass]
	 * @邮箱 575814050@qq.com
	 * @时间 2020年3月14号
	 */
	RasterTestClass();

	/* @接口 默认构造函数
	 * @类名 [RasterTestClass]
	 * @邮箱 575814050@qq.com
	 * @时间 2020年3月14号
	 */
	~RasterTestClass();

	/* @接口
	 * @类名 [IRasterTestClass]
	 * @邮箱 575814050@qq.com
	 * @时间 2020年10月12日
	 */
	virtual void testInterface();

};

#endif /*RASTERTESTCLASS_H*/

3.2.2、实现类源文件

#include "rastertestclass.h"
#include "core/idoxcommand.h"
#include "seed_widget/idoxcmdline.h"

RasterTestClass::RasterTestClass()
	: IRasterTestClass()
{

}

RasterTestClass::~RasterTestClass()
{

}

void RasterTestClass::testInterface()
{
	dox::Object<dox::IDoxCmdLine> iDoxCmdLine(NIL);
	iDoxCmdLine->print("Hello World");
}

3.3、注册类

添加完实现类之后,直接编译,如果通过,那么说明前面的步骤都没有问题,如果出现如下错误:
error C2039: “InterList”: 不是“dox::NormalObject”的成员
note: 参见“dox::NormalObject”的声明
error C3861: “InterList”: 找不到标识符
说明在实现类的头文件中没有添加REGISTER_ACTUALIZE(RasterTestClass, IRasterTestClass)
添加完之后,就可以编译通过,接下来再回到seed_rastertest. cpp文件中进行对类的注册。

#include "core/modulemacro.h"
#include "rastertestclass.h"

BEGIN_DOX_NAMESPACE
BEGIN_DEFINE_DOX_MODULE("rastertest")
	XDEFINE_CLASSMAP_ENTRY_NORMAL(RasterTestClass)
FINISH_DEFINE_DOX_MODULE()
END_DOX_NAMESPACE

3.3.1、普通类注册

#include "core/modulemacro.h"
#include "rastertestcmd.h"
#include "rastertestclass.h"

BEGIN_DOX_NAMESPACE
BEGIN_DEFINE_DOX_MODULE("rastertest")
	XDEFINE_CLASSMAP_ENTRY_NORMAL(RasterTestClass)
FINISH_DEFINE_DOX_MODULE()
END_DOX_NAMESPACE

3.3.2、单例类注册

BEGIN_DOX_NAMESPACE
BEGIN_DEFINE_DOX_MODULE("rastertest")
	XDEFINE_CLASSMAP_ENTRY_SINGLE(注册类1)
	XDEFINE_CLASSMAP_ENTRY_SINGLE(注册类2)
	XDEFINE_CLASSMAP_ENTRY_SINGLE(注册类3)
	。。。
	XDEFINE_CLASSMAP_ENTRY_SINGLE(注册类n)
FINISH_DEFINE_DOX_MODULE()
END_DOX_NAMESPACE

3.3.2、多个类注册

BEGIN_DOX_NAMESPACE
BEGIN_DEFINE_DOX_MODULE("rastertest")
	XDEFINE_CLASSMAP_ENTRY_NORMAL(普通类1)
	XDEFINE_CLASSMAP_ENTRY_NORMAL(普通类2)
	XDEFINE_CLASSMAP_ENTRY_NORMAL(普通类3)
	...
	XDEFINE_CLASSMAP_ENTRY_NORMAL(普通类n)
	XDEFINE_CLASSMAP_ENTRY_SINGLE(单例类1)
	XDEFINE_CLASSMAP_ENTRY_SINGLE(单例类2)
	XDEFINE_CLASSMAP_ENTRY_SINGLE(单例类3)
	...
	XDEFINE_CLASSMAP_ENTRY_SINGLE(单例类n)
FINISH_DEFINE_DOX_MODULE()
END_DOX_NAMESPACE

4、将命令添加到工具箱

4.1、打开自定义工具箱

在这里插入图片描述

4.2、选择要添加的命令

在这里插入图片描述

4.3、点击自定义命令

在这里插入图片描述

4.4、工具箱中查看

在这里插入图片描述

5、测试插件

将生成的插件复制到plugins文件夹中,然后启动软件,在命令行中执行rasterTestClass命令,就会出现如下图所示的结果,到此表示注册成功。
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值