关于C++插件的开发材料较少,根据网上的指导,我采用了早期版本的插件模板生成的方法来创建QGIS的插件,其方法是从以前版本(2.18.25)里面拷贝插件模板的方法进行,具体的执行步骤为

1、拷贝文件

将以前源码src/plugins下面的plugin_builder.py文件 和 plugin_template 文件夹内容拷贝到新的版本(3.16.6)源码里面,。

2、修改文件

1)plugin_builder.py

主要是修改语法错误,因为新的代码需要适应python3的语法,主要修改两个问题

① print "string" 修改为 print("string")

② raw_input()  修改为  input()

2)plugin.cpp 中

static const QgisPlugin::PLUGINTYPE sPluginType = QgisPlugin::UI;

替换为

static const QgisPlugin::PluginType sPluginType = QgisPlugin::UI;

3) CMakeLists.txt

将其中的 QT4_WARP_UI ,QT4_WARP_CPP, QT4_ADD_RESOURCES 修改为 QT5_WARP_UI ,QT5_WARP_CPP, QT5_ADD_RESOURCES

3、终端执行命令python plugin_builder.py,生成自己的插件文件夹

输入插件相关的关键参数就完成该步骤,查看python文件代码,其主要过程就是创建关键参数,并将替换关键参数后的模板文件夹下的文件拷贝到自己的项目中去。

4、使用QGIS的cmake项目构建生成VS工程

该步骤与QGIS工程构建一致。

5、编译该工程

编译过程中有一些语法错误、include包含错误等等,逐一解决后,即生成原始插件,后续功能在该vs工程内开发即可。

思考:观察其生成的文件,主要有两个类构成一个Dialog,一个QgisPlugin,应该新建这两个类就可以生成一个插件,需要进一步研究分析。

插件建成后,经过研究代码,我发现并不用那么麻烦的使用python脚本来生成插件的工程,直接模仿offline_editing_plugin里面的内容,继承QgisPlugin类建一个新的插件类,实现initgui,unload等接口即可,附一些关键的函数实现。

//定义插件关键词
static const QString sName = QObject::tr( "OfflineEditing" );
static const QString sDescription = QObject::tr( "Allow offline editing and synchronizing with database" );
static const QString sCategory = QObject::tr( "Database" );
static const QString sPluginVersion = QObject::tr( "Version 0.1" );
static const QgisPlugin::PluginType sPluginType = QgisPlugin::UI;
static const QString sPluginIcon = QStringLiteral( ":/offline_editing/offline_editing_copy.png" );
//初始化gui
void QgsOfflineEditingPlugin::initGui()
{
delete mActionConvertProject; // Create the action for tool
mActionConvertProject = new QAction( QIcon( ":/offline_editing/offline_editing_copy.png" ), tr( "Convert to Offline Project…" ), this );
// Add the icon to the toolbar
mQGisIface->addDatabaseToolBarIcon( mActionConvertProject );
mQGisIface->addPluginToDatabaseMenu( tr( "&Offline Editing" ), mActionConvertProject );
}
//卸载
void QgsOfflineEditingPlugin::unload()
{
delete mActionConvertProject;
}
//一些外部函数
QGISEXTERN QgisPlugin *classFactory( QgisInterface *qgisInterfacePointer )
{
return new QgsOfflineEditingPlugin( qgisInterfacePointer );
} // Return the name of the plugin - note that we do not user class members as
// the class may not yet be insantiated when this method is called.
QGISEXTERN QString name()
{
return sName;
} // Return the description
QGISEXTERN QString description()
{
return sDescription;
} // Return the category
QGISEXTERN QString category()
{
return sCategory;
} // Return the type (either UI or MapLayer plugin)
QGISEXTERN int type()
{
return sPluginType;
} // Return the version number for the plugin
QGISEXTERN QString version()
{
return sPluginVersion;
} QGISEXTERN QString icon()
{
return sPluginIcon;
} // Delete ourself
QGISEXTERN void unload( QgisPlugin *pluginPointer )
{
delete pluginPointer;
}

 

参考文章:https://blog.csdn.net/qq_39506222/article/details/83579888

最新文章

  1. (转)EasyUI-datagrid-自动合并单元格
  2. C++ 一个例子彻底搞清楚拷贝构造函数和赋值运算符重载的区别
  3. (转)为什么安装win10后其他软件不能上网
  4. eclipse(STS,myeclipse)老是报ThreadPoolExecutor$Worker.run()
  5. 【win8技巧】win8快速切换后台应用
  6. 深入了解absolute
  7. muduo网络库学习笔记(10):定时器的实现
  8. [BZOJ 1081] [SCOI2005] 超级格雷码 【找规律】
  9. Angular1.0
  10. Shader Forge 植物摆动
  11. win7 重启 IIS.
  12. (转) Name visibility
  13. HttpRequestMessage
  14. Java:List集合内的对象进行排序
  15. (N叉树 递归) leetcode589. N-ary Tree Preorder Traversal
  16. 初识C语言(五)
  17. Confluence 6 手动备份
  18. SQL SERVER 2016研究一
  19. JSP知识点
  20. 几个方便的nodejs 任务调度框架

热门文章

  1. mybatis和hibernate区别
  2. centos7修改服务器时区
  3. Vue3的新特性及相关的Composition API使用
  4. Node.js躬行记(10)——接口日志查询
  5. Docker入门系列之二:Docker术语
  6. 使用metaweblog API实现通用博客发布 之 本地图片自动上传以及替换路径
  7. 目标检测之pycocotools安装
  8. javascript traverse object attributes 遍历对象属性
  9. requests接口自动化-assert断言
  10. P4780-Phi的反函数【dfs】