上一篇文章写了二次开发环境的构建,这一章我们从零开始构建插件工程,并理解下QIGIS 如何识别插件程序的。
1、创建QGIS 工程
新建项目,选择下面的空工程
工程创建成功后,是下面的样子,没有任何文件
2、配置QGIS工程
因为创建的是空程序,改下配置类型,改成动态库和QGIS的调用命令
QGIS的调用命令改成其所在目录。
引用头文件和链接库。主要配置OSGwo4w下面的目录
C++ 常规 附加包含目录
C++ 连接器 附加库目录
连接器->输入
添加一些静态文件,用于后面插件的图片,新建resource,导入一些图片
3、创建类
我可以随便找个QGIS的插件源码,或者读QIS源码去理解插件原理。
创建类,基类可以先不选,后面在添加。
Point .h 改成如下:
#pragma once
#include <QtMath>
#include <QObject>
#include <qgisplugin.h>
#include <qgisinterface.h>
class Point:public QObject, public QgisPlugin //这里是必须继承的两个QGIS的类
{
Q_OBJECT
public:
Point(QgisInterface* interface,
QString const& name = "",
QString const& description = "",
QString const& category = "",
QString const& version = "",
PluginType type = MapLayer);
virtual ~Point();
public:
void initGui() override; //Qigs 开始加载的时候会首先调用这个类
void unload() override;
public slots:
void initFinished();
private:
QgisInterface* interface { nullptr };
QAction* action{ nullptr };
};
Point.cpp 改成如下:
#include "Point.h"
#include <QAction>
#include <QToolBar>
#include <QVector>
#include <qmessagebox.h>
#include "qgsmessagebar.h"
Point::Point(QgisInterface* interface,
QString const& name,
QString const& description,
QString const& category,
QString const& version,
PluginType type)
:QgisPlugin(name, description, category, version, type)
, interface(interface)
{
connect(interface, SIGNAL(initializationCompleted()), this, SLOT(initFinished()));
}
Point::~Point()
{
}
void Point::initFinished()
{
//QMessageBox::information(nullptr, "Title", "Hello world");
}
void Point::initGui()
{
QMessageBox::information(nullptr, "Title", "Hello world");
}
void Point::unload()
{
if (action) {
delete action;
}
}
用QGIS 扩展创建插件,创建pluginfactory.cpp。源码如下
#include <QtMath>
#include<QString>
#include<qgisinterface.h>
#include <qgisplugin.h>
#include "point.h"
static QString sName = "SVGIS Editor";
static QString sDescription = "SVGIS Editor";
static QString sCategory = "Layers";
static QString sPluginVersion = "Version 1.0";
static int sPluginType = QgisPlugin::UI;
static QString sPluginIcon = ":/Images/earth.png";
//插件创建
QGISEXTERN QgisPlugin* classFactory(QgisInterface* theQgisInterfacePointer)
{
return new Point(theQgisInterfacePointer, sName, sDescription, sCategory, sPluginVersion, QgisPlugin::UI);
}
QGISEXTERN QString* name()
{
return &sName;
}
QGISEXTERN QString* description()
{
return &sDescription;
}
QGISEXTERN QString* category()
{
return &sCategory;
}
QGISEXTERN int type()
{
return sPluginType;
}
QGISEXTERN QString* version()
{
return &sPluginVersion;
}
QGISEXTERN QString* icon()
{
return &sPluginIcon;
}
QGISEXTERN void unload(QgisPlugin* thePluginPointer)
{
delete thePluginPointer;
}
编译运行。启动Qgis 后选择 Plugins ,选择我们插件,弹出信息框。
4、总结
本文通过新建插件工程构建QGIS 插件类,只要按照QGIS的继承关系写好类并放在QGIS 的插件目录下面。QGIS 会自动去读取插件。具体的实现逻辑会在源码解读中介绍。