zoukankan      html  css  js  c++  java
  • 关于QGIS的插件开发(C++)

    关于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

  • 相关阅读:
    springboot 的国际化路径出现问题
    算法思想_常见四种
    数据结构_6种简单概述_java
    火狐同步和账号的区别
    java_泛型解析
    购书打折最优方案
    团队小组开发NABC分析
    环状二维数组最大子数组求和
    返回一个整数数组中最大子数组的和之测试
    首尾相连的一位数组最大子数组和
  • 原文地址:https://www.cnblogs.com/m-zhang-yang/p/15128650.html
Copyright © 2011-2022 走看看