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