QGIS 开发之旅二《构建插件工程》

上一篇文章写了二次开发环境的构建,这一章我们从零开始构建插件工程,并理解下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 会自动去读取插件。具体的实现逻辑会在源码解读中介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/453921.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker私有仓库-harbor的搭建

docker 官方提供的私有仓库 registry&#xff0c;用起来虽然简单 &#xff0c;但在管理的功能上存在不足。 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器&#xff0c;harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。harbor在docker di…

基于Java (spring-boot)的人才招聘系统

一、项目介绍 公司&#xff1a; IT公司的注册与管理 招聘要求的发布与维护 站内私信 求职者&#xff1a; 招聘需求浏览 招聘需求筛选&#xff08;按岗位、薪酬、城市、地区等&#xff09; 简历编辑&#xff0c;建立投递等 站内私信 管理员&#xff1a; 用户信息维护 岗…

vue学习笔记24-组件事件配合v-model使用

搜索时v-model绑定的search数据时时发生变化 watch侦听器时时监察变化&#xff0c;一旦数据发生变化 &#xff0c;就实时发送数据给父组件 子组件的完整代码&#xff1a; <template>搜索&#xff1a;<input type"text" v-model"search"> <…

数学建模【时间序列】

一、时间序列简介 时间序列也称动态序列&#xff0c;是指将某种现象的指标数值按照时间顺序排列而成的数值序列。时间序列分析大致可分成三大部分&#xff0c;分别是描述过去、分析规律和预测未来&#xff0c;本篇将主要介绍时间序列分析中常用的三种模型&#xff1a;季节分解…

通过对话式人工智能实现个性化用户体验

智能交流新时代&#xff1a;如何选择对话式人工智能产品 在快速发展的数字环境中&#xff0c;对话式人工智能正在彻底改变企业与客户互动的方式。 通过集成机器学习、自然语言处理和语音识别等先进技术&#xff0c;对话式人工智能可提供个性化、无缝的用户体验。 了解对话式人…

数字工厂环境中3D开发工具HOOPS的应用及其价值

随着新一代工业技术的推进&#xff0c;数字工厂的理念逐渐被企业所接受和推广。其中&#xff0c;HOOPS技术平台在数字工厂的设定和运营中扮演了重要的角色&#xff0c;其应用带来了诸多优势。 HOOPS技术平台包含HOOPS Visualize, HOOPS Exchange和HOOPS Communicator等强大工具…

代码随想录day19(2)二叉树:二叉树的最大深度(leetcode104)

题目要求&#xff1a;求出二叉树的最大深度 思路&#xff1a;首先要区分二叉树的高度与深度。二叉树的高度是任一结点到叶子结点的距离&#xff0c;而二叉树的深度指的是任一节点到根节点的距离&#xff08;从1开始&#xff09;。所以求高度使用后序遍历&#xff08;从下往上&…

自动化测试系列-Selenium三种等待详解

第一种也是最简单粗暴的一种办法就是强制等待sleep(time)&#xff0c;强制让程序等time秒时间&#xff0c;不管程序能不能跟上速度&#xff0c;还是已经提前到了&#xff0c;都必须等time时长。 如下代码案例所示: from selenium import webdriverfrom time import sleepdriv…

软件测试Pytest实现接口自动化应该如何在用例执行后打印日志到日志目录生成日志文件?

Pytest可以使用内置的logging模块来实现接口自动化测试用例执行后打印日志到日志目录以生成日志文件。以下是实现步骤&#xff1a; 1、在pytest配置文件&#xff08;conftest.py&#xff09;中&#xff0c;定义一个日志输出路径&#xff0c;并设置logging模块。 import loggi…

【PLC】现场总线和工业以太网汇总

1、 现场总线 1.1 什么是现场总线 1&#xff09;非专业描述&#xff1a; 如下图&#xff1a;“人机界面”一般通过以太网连接“控制器(PLC)”&#xff0c;“控制器(PLC)”通过 “现场总线”和现场设备连接。 2&#xff09;专业描述&#xff08;维基百科&#xff09; 现场总线…

「建议收藏」常用adb操作命令详解

1、查看当前运行的所有设备 adb devices 返回当前设备列表 这个命令是查看当前连接的设备, 连接到计算机的android设备或者模拟器将会列出显示 2、安装软件 adb install 验证是否成功。需要到设备的 data/app路径下查看是否有该包名 这个命令将指定的apk文件安装到设备上 …

案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-先导篇)

专栏系列文章&#xff1a; 2024高级系统架构设计师备考资料&#xff08;高频考点&真题&经验&#xff09;https://blog.csdn.net/seeker1994/category_12593400.html 案例分析篇01&#xff1a;软件架构设计考点架构风格及质量属性 案例分析篇11&#xff1a;UML设计考…

Windows系统安装OpenSSH结合VS Code远程ssh连接Ubuntu【内网穿透】

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-mEkKUraSFHLKkzIj {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

MySQL 数据库 下载地址 国内阿里云站点

https://mirrors.aliyun.com/mysql/ 以 MySQL 5.7 为例 https://mirrors.aliyun.com/mysql/MySQL-5.7/ 各个版本很齐全&#xff0c;在这里下载要比去 MySQL 官网下载快很多&#xff0c;安逸得很 那我们下期见&#xff0c;拜拜&#xff01;

什么洗地机值得推荐?旗舰洗地机希亦、追觅、西屋、海尔实际表现如何?

洗地机这个产品相信大家已经不陌生了&#xff0c;它集合吸尘器和电动扫地拖把的功能&#xff0c;轻轻推拉便可以解决地面上的赃物&#xff0c;且不用我们手动清洗滚刷&#xff0c;深得家务人的喜爱&#xff0c;可是&#xff0c;当我们真正要去选购的时候&#xff0c;还是很纠结…

linux统计一个文件有多少行

第一种方法 cat -n anaconda-ks.cfg&#xff08;文件&#xff09; 第二种 wc 文件名 wc是 words count之意

Linux系统安全②SNAT与DNAT

一.SNAT 1.定义 利用SNAT技术实现2台私网地址都可以访问公网 2.实验环境准备 &#xff08;1&#xff09;三台服务器&#xff1a;PC1客户端、PC2网关、PC3服务端。 &#xff08;2&#xff09;硬件要求&#xff1a;PC1和PC3均只需一块网卡、PC2需要2块网卡 &#xff08;3&a…

[linux][调度] linux 下如何观察线程调度延时 ?

1 什么是调度延时 在实际业务中&#xff0c;大多数情况下&#xff0c;线程都不是一直占着 cpu 在运行的。在读写文件&#xff0c;收发网络数据时&#xff0c;可能会阻塞&#xff0c;阻塞就会进入睡眠&#xff0c;触发调度&#xff1b;在线程等待锁的时候&#xff0c;也可能会触…

ELK 安装部署

文章目录 1.日志收集规划2.Elasticsearch部署2.1.Elasticsearch安装2.2.Elasticsearch-head安装2.3.Elasticsearch设置分片数2.4.elasticsearch健康检查 3.Kibana部署4.Logstash部署5.Filebeat部署 开源中间件 # Elastic Stackhttps://iothub.org.cn/docs/middleware/ https:/…

【Shiro反序列化漏洞】shiro550流程分析

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…