關於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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM