• 基于QGIS进行二次开发的正确姿势


    前言

    最近一直在琢磨QGIS的二次开发,也踩过不少坑,好在最后的结果是好的。这里介绍一下我最喜欢的二次开发姿势。

    电脑环境

    VS2017 Community、QGIS3.18.3、QT5.11.2、Windows SDK版本 10.0.17763.0、VS2017的QT插件版本 2.8.1或者2.9.1

    前提条件

    1. 已经下载安装了VS2017 Community、OSGeo4W中的QGIS3.18.3以及附带安装的其他依赖环境。
    2. 已经完成了QGIS3.18.3的编译(可以参考我上一篇博客),首先说明,编译不是必须的,但是如果你想知道某个功能是使用的哪一段代码,还是编译一下最好。
    3. 把D:\OSGeo4W64\bin、D:\OSGeo4W64\apps\qgis\bin添加到系统环境变量的Path里面。
      在这里插入图片描述
    4. 系统环境变量,增加一个PROJ_LIB,值为D:\OSGeo4W64\share\proj,否则运行程序可能会出现找不到proj.db的问题。
      在这里插入图片描述

    VS配置QT插件

    • 下载并安装插件:https://download.qt.io/official_releases/vsaddin/
    • 我选择的是2.8.1版本,注意,这个版本的插件创建QT项目的时候没有“Ui Class Inclusion as”选项,默认是 UI 类将被直接嵌入到你的主类中作为一个值类型的成员。如果想要将UI 类作为指针成员嵌入到你的主类中,请安装2.9.1版本的插件。
      在这里插入图片描述
    • 解释如下:
      • Member(直接作为成员变量):这个选项意味着 UI 类将被直接嵌入到你的主类中作为一个值类型的成员。这样,你的主类会有一个非指针类型的 UI 成员。这消除了动态内存分配的需要,但可能增加了对象的整体大小。因为ui是成员变量,所以不需要在析构函数中delete ui。
      • Member Pointer(作为成员指针):UI 类会作为指针成员嵌入到你的主类中。这意味着 UI 对象会在堆上动态分配,并在类的析构函数中释放。因为ui是成员指针,所以需要在delete中delete ui。
      • Multiple Inheritance(多重继承):你的主类会直接从 UI 类继承,同时还会从另一个 Qt 类(如 QWidget, QDialog 或 QMainWindow)继承。这样,你可以直接访问 UI 元素,不需要通过任何成员或指针。因为没有成员ui,所以不需要在析构函数中delete ui。
      • 三种方式代码的区别:
    // Member 
    class MyClass : public QWidget {
        Q_OBJECT
    public:
        MyClass(QWidget* parent = nullptr);
        ~MyClass();
        // ...
    
    private:
        Ui::MyClass ui;
    };
    
    // Member Pointer
    class MyClass : public QWidget {
        Q_OBJECT
    public:
        MyClass(QWidget* parent = nullptr);
        ~MyClass();
        // ...
    
    private:
        Ui::MyClass* ui;
    };
    
    // Multiple Inheritance
    class MyClass : public QWidget, public Ui::MyClass {
        Q_OBJECT
    public:
        MyClass(QWidget* parent = nullptr);
        // ...
    };
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 启动VS2017,配置QT版本,选择OSGeo4W安装目录的apps/QT5/bin/qmake.exe
      在这里插入图片描述
      配置完成如下图所示,插件可以配置多个QT版本,选择自己想要使用的版本即可
      在这里插入图片描述

    创建Qt Widgets Application项目

    选择Release版本,先把常用的QT模块勾选上,例如Gui、Xml、Widgets、Core、Svg。后续需要哪个模块再添加即可。
    在这里插入图片描述

    配置项目属性

    • 配置调试环境

      • 在 调试----环境 中,设置QT_PLUGIN_PATH的值为OSGeo4W中QT5的plugin路径

      QT_PLUGIN_PATH=D:\OSGeo4W64\apps\Qt5\plugins

      • 其实这个环境变量也可以配置到电脑的环境变量里面,在系统的环境变量中,新建一个环境变量QT_PLUGIN_PATH,值填入D:\OSGeo4W64\apps\Qt5\plugins就行。但是这样会出现一个问题,如果你电脑上面安装的其他软件是用QT开发的,由于兼容性问题,可能会导致这些软件打不开。
        在这里插入图片描述
      • 所以还是建议在VS中设置这个调试环境。
    • 设置VC++ 目录

      • 在 VC++ 目录----包含目录 中,填入下面内容

      D:\OSGeo4W64\include
      D:\OSGeo4W64\apps\qgis\include

      • 在VC++ 目录----库目录中,填入下面内容

      D:\OSGeo4W64\lib
      D:\OSGeo4W64\apps\qgis\lib

    • 设置预处理器

      • 在 C/C++ ---- 预处理器----预处理器定义 中,填入

      _USE_MATH_DEFINES

    • 设置UTF8编码

    • 在C/C++ ---- 所有选项 ---- 附加选项 中,填入

      /utf-8

    • 设置附加依赖项

      • 在 链接器----输入----附加依赖项 中,填入

      qgis_app.lib
      qgis_core.lib
      qgis_gui.lib

      • 这三个是QGIS开发最基础的附加依赖项,如果需要用到其他的,再从下面的目录添加即可。

      在这里插入图片描述

    • 设置子系统

      • 在 链接器----子系统 中,设置为

      控制台 (/SUBSYSTEM:CONSOLE)

      • 这是为了方便程序调试,设置之后,就可以使用cout或者Debug()进行程序的调试。

    环境配置完毕

    可以愉快的写代码了。

  • 相关阅读:
    kibana 基础操作
    我们该如何看待AIGC(人工智能)
    01.高等数学基础
    基于springboot实现的摄影跟拍预定管理系统
    拉格朗日乘子法
    uvm_event和uvm_event_pool
    multiset 用法简说
    【数据聚类】第五章第一节:基于网格的聚类算法概述
    我是如何写一篇技术文的?
    微商话术分享
  • 原文地址:https://blog.csdn.net/KK_2018/article/details/133377671