VS2019+QT5.15.2+QGIS二次开发环境搭建

本文详细介绍了如何在Visual Studio 2019环境下搭建QT5.15.2和QGIS的开发环境,包括QT和QGIS的下载、安装,以及VS中Qt插件的配置。同时,文章提供了创建Qt工程的步骤,包括配置项目属性以避免常见的错误和警告,如缺少DLL、预处理器警告等。通过此指南,开发者可以成功建立一个能够打开和显示*.shp文件的QGIS应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VS2019+QT5.15.2+QGIS二次开发环境搭建

1.开发环境

VS2019+QT5.15.2+QGIS
注意,QT 平台的版本与qgis下载的版本有关,以前采用OSGeo4w64来下载qgis时会区分32和64位,但现在官网已经不再区分。
如果下载qgis-ltr(官网的长期支持版,qgis 2.18),那么建议qt采用5.0以下的版本;
如果下载qgis 是3.0版本以上,个人建议qt版本,下载高于qt5.9.2;
另外如果是使用VS2013,那么不能编译qgis3.0版本以上的,c++11个部分语法报错。

2.VS2019下载

visual Studio可以直接从官网下载:https://visualstudio.microsoft.com/zh-hans/vs/
在这里插入图片描述

3.QT5下载

Qt 官网有一个专门的资源下载网站,所有的开发环境和相关工具都可以从这里下载,具体地址是:https://download.qt.io/official_releases/qt/
在这里插入图片描述
在安装Qt时可以根据需要选择模块,如果用vs进行开发就选择mscv以及对应的VS版本,如果用Qt开发就只选MinGW就可以了。

4. VS2019安装QT插件

打开VS2019,选择 扩展->管理扩展->搜索框中输入“qt”
在这里插入图片描述
然后选择 Qt visual studio Tools 进行安装,安装时要关闭VS2019.
安装完成后,打开VS2019->扩展->Qt VS Tools ->Options -> Versions ->将下载的Qt的编译器添加进来,如果用VS开发,就选择mscv2019_64,这一步骤完成。
在这里插入图片描述

5.QGIS下载及安装

在安装QGIS的时候,会同时下载QT5,步骤3也可以省略,但为了之后进行开发方便,最好还是安装QT5。

QGIS官网网站: https://www.qgis.org/en/site/

下载OSGeo4w,安装时选择这个网址:https://www.qgis.org/en/site/forusers/download.html
点击下载:

在这里插入图片描述
下载好后,双击安装包进行安装
(1)选择Andvance Install 在这里插入图片描述
(2)选择install from Internet 在这里插入图片描述
(3)选择安装路径,可以自己更改
在这里插入图片描述在这里插入图片描述
(4)选择Direct Connection
在这里插入图片描述
(5)选择第一个网址 在这里插入图片描述
(6)搜索qgis,点击Libs后面,选择为install,人然后点下一步,直到安装完成。
在这里插入图片描述
至此QGIS就安装完成了。

6.启动VS,创建Qt工程。

启动VS后,新建项目,搜索Qt,找到QtWidgetsApplication后进行创建新项目,我这里直接用默认名称QtWidgetsApplication1。
注意,在导入模块的时候要把XML勾选上,否则运行的时候会报错。如果这里不勾选,也可以创建好后,在VS中的扩展->QT VS Tools -> QT project settings ->Qt Modules中进行添加(下图)。
在这里插入图片描述在这里插入图片描述
创建好后,将版本改为release ×64
在这里插入图片描述

7. 配置项目属性

C++ ->常规 -> 附加包含目录中添加以下项(具体路径需要做适当调整):

C:\path\to\OSGeo4W64\include
C:\path\to\OSGeo4W64\apps\qgis\include

链接器 ->常规 -> 附加库目录中添加以下项(具体路径需要做适当调整):

C:\path\to\OSGeo4W64\apps\qgis\lib;

在“链接器” ->”输入” -> “附加依赖项”中添加以下项:

qgis_app.lib
qgis_core.lib
qgis_gui.lib

接着修改项目文件:
main.cpp

#include "QtWidgetsApplication1.h"
#include <QtWidgets/QApplication>
#include <qgsapplication.h>

int main(int argc, char *argv[])
{
    QgsApplication a(argc, argv, true);
    QgsApplication::setPrefixPath("F:/OSGeo4WQGIS/apps/qgis", true);
    QgsApplication::initQgis();    //初始化QGIS应用

    QtWidgetsApplication1 w;    //创建一个窗体,类似于Qt
    w.show();
    return a.exec();
}

QtWidgetsApplication1.h

#pragma once
#include "ui_QtWidgetsApplication1.h"
#include <QtWidgets/QMainWindow>

#include <qmenu.h>
#include <qaction.h>
#include <qgsmapcanvas.h>

class QtWidgetsApplication1 : public QMainWindow
{
    Q_OBJECT

public:
    QtWidgetsApplication1(QWidget *parent = Q_NULLPTR);

private:
    Ui::QtWidgetsApplication1Class ui;
    // create the menus and then add the actions to them.
    QMenu* fileMenu;
    QAction* openFileAction;
    //map canvas
    QgsMapCanvas* mapCanvas;
    QList<QgsMapLayer*> layers;

public slots:
    void on_openFileAction_triggered();

public:
    void addVectorLayer();
};

QtWidgetsApplication1.cpp

#include "QtWidgetsApplication1.h"

#include <qmenubar.h>
#include <qmessagebox.h>
#include <qfiledialog.h>

#include <qgsvectorlayer.h>

QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent)
    : QMainWindow(parent)
{
    this->resize(600, 400);

    // create the menus and then add the actions to them.
    fileMenu = this->menuBar()->addMenu("File");
    openFileAction = new QAction("Open", this);
    this->connect(openFileAction, SIGNAL(triggered(bool)), this, SLOT(on_openFileAction_triggered()));
    fileMenu->addAction(openFileAction);

    // initialize the map canvas
    mapCanvas = new QgsMapCanvas();
    this->setCentralWidget(mapCanvas);

    mapCanvas->setCanvasColor(QColor(255, 255, 255));
    mapCanvas->setVisible(true);
    mapCanvas->enableAntiAliasing(true);
}

void QtWidgetsApplication1::on_openFileAction_triggered() 
{
    addVectorLayer();
}

void QtWidgetsApplication1::addVectorLayer()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open shape file"), "", "*.shp");
    QStringList temp = fileName.split('/');
    QString basename = temp.at(temp.size() - 1);
    QgsVectorLayer* vecLayer = new QgsVectorLayer(fileName, basename, "ogr");

    if (!vecLayer->isValid())
    {
        QMessageBox::critical(this, "error", QString("layer is invalid: \n") + fileName);
        return;
    }
    mapCanvas->setExtent(vecLayer->extent());
    layers.append(vecLayer);
    mapCanvas->setLayers(layers);
    mapCanvas->refresh();
}

运行后可以打开*.shp文件并进行显示。

注意:报错及解决办法

1.再次运行程序后会遇到缺少各种DLL的错误,这时候有两种方法:

将C:\path\to\OSGeo4W64\bin和C:\path\to\OSGeo4W64\app\qgis\bin添加到环境变量Path中
将C:\path\to\OSGeo4W64\bin和C:\path\to\OSGeo4W64\app\qgis\bin中的DLL全部拷贝到生成的exe的目录下。
这时再次运行程序,可能还是会缺少各种DLL,如果是以Qt5开头的,在C:\path\to\OSGeo4W64\app\Qt5中查找;如果是其他的DLL,可以在你的系统中查找,推荐使用everything软件进行。

2. warning C4003: “max”宏的实参不足

解决方案 -》 属性 -》 c/c++ -》预处理器 -》 预处理器定义,加上NOMINMAX即可

3.“QtGui/QApplication”: No such file or directory

QApplication已经从原来的<QtGui/QApplication>
移动到<QtWidgets/QApplication>了

4.警告 C4819
警告 C4819 该文件包含不能在当前代码页(936)中表示的字符。
请将该文件保存为 Unicode 格式以防止数据丢失

(1)找出警告的文件,然后在该文件的开始处加入下面的语句:# pragma warning (disable:4819)

(2)如果是 VS IDE,还可以:在Project -> Properties -> Configuration Properties -> C/C++
-> Advance 的 Disable Specific Warnings 中添加相应的警告编号:4819;

5.#if QT_HAS_INCLUDE() || defined(Q_QDOC) 这句子出错了

解决方法:工具-〉选项-〉文本编辑器-〉c/c+±>高级-〉禁用自动更新改为:TRUE

6.无法打开包括文件: “QDomNode”

项目——>”XXX属性"——>配置属性——>C/C++——>配置环境
E:\aaaQGIS\OSGeo4W64\OSGeo4W64\apps\Qt5\include\QtXml

7.error C2065: “M_PI”: 未声明的标识符

项目——>”XXX属性"——>配置属性——>C/C++——>预处理器——>预处理器定义,
将“_USE_MATH_DEFINES”添加进去

8.Q_OBJECT的类声明
由于 moc 只处理头文件中的标记了Q_OBJECT的类声明,不会处理 cpp 文件中的类似声明。
因此,如果我们的Newspaper和Reader类位于 main.cpp 中,是无法得到 moc 的处理的。
解决方法是,我们手动调用 moc 工具处理 main.cpp,
并且将 main.cpp 中的#include "newspaper.h"改为#include "moc_newspaper.h"就可以了

9.无法将静态函数作为内联函数online
右键项目属性,配置属性->常规,将C++语言标准和C语言标准改为C++17:
在这里插入图片描述

<think>好的,我现在要帮助用户寻找关于使用Qt进行QGIS二次开发的教程和相关资源。根据用户提供的引用内容,我需要整理出合适的教程步骤、示例以及可能的问题。首先,我需要确认用户提供的引用中有哪些有用的信息。 引用[1]提到了在Linux环境搭建QGIS二次开发环境,使用的是qgis-3.28.6和qt5.15,并给出了编译后的运行路径。这可能对用户的环境搭建有帮助,特别是Linux用户。 引用[2]是关于Python插件开发的,虽然用户主要关注Qt(C++)开发,但可能Python的某些步骤(如安装插件生成工具)也有参考价值,比如使用Plugin Builder3和Plugin Reloader。 引用[3]明确指出是C++ Qt5的范例开发,并提到QGis C++开发的小众性,用户需要安装QTQTCreator。这部分信息很重要,因为用户需要的是Qt的教程,这里提到了如何开始,可能包含环境配置的步骤。 引用[4]则是在Windows环境下配置QGIS插件开发,涉及PyQGISqt-creator和pycharm。虽然主要用Python,但使用qt-creator进行界面修改可能对用户有帮助,特别是界面设计部分。 接下来,我需要综合这些信息,整理出一个结构清晰的回答。用户需要教程、二次开发示例,所以应该分步骤说明环境搭建、开发流程,并提供示例代码。同时,用户可能需要知道如何获取更多资源,如官方文档、社区论坛等。 需要注意的是,用户可能混淆了Python和C++的开发,因为QGIS插件可以用两者开发。但用户特别提到Qt,因此重点应放在C++ Qt开发上。不过,引用中的一些步骤(如使用Plugin Builder)可能同时适用于两种语言,需要区分清楚。 另外,要确保回答中的代码示例正确,并符合用户给出的格式要求,比如独立公式用$$...$$,行内用$...$。不过这个问题可能更多涉及编程,数学公式较少,但如果有的话需要遵守。例如,在解释算法时可能需要公式,但用户的问题更多是开发教程,所以可能不涉及数学表达式,但需要检查。 然后,生成相关问题,需要基于用户的需求和回答内容,提出进一步可能的问题,比如环境配置问题、调试技巧、特定功能实现等。 最后,确保所有引用在回答中被正确标注,例如引用[3]提到C++开发的环境搭建,需要在相应位置添加引用标识。 现在需要组织这些信息,确保结构清晰,分步骤说明,并提供示例代码和资源链接。可能还需要指出不同操作系统下的配置差异,比如引用[1]是Linux,引用[4]是Windows,需要分别说明。</think>### Qt进行QGIS二次开发教程指南 #### 一、环境搭建 1. **基础组件安装** - **Qt Creator**:推荐使用5.15以上版本(与QGIS版本对应),安装时需勾选MSVC或MinGW编译器[^3] - **QGIS SDK**:需下载Qt兼容的QGIS源码(如3.28.6),编译时指定Qt路径[^1] 示例编译命令: ```bash cmake -DCMAKE_PREFIX_PATH=/opt/Qt5.15.2 .. ``` 2. **环境变量配置** Windows需添加`QGIS_PLUGIN_PATH`指向插件目录,Linux/MacOS通过`LD_LIBRARY_PATH`加载QGIS库[^4]。 #### 二、插件开发流程(C++) 1. **创建Qt项目** 在Qt Creator中新建**动态库项目**,修改`.pro`文件添加QGIS依赖: ```pro INCLUDEPATH += /path/to/qgis/include LIBS += -L/path/to/qgis/lib -lqgis_core ``` 2. **实现插件基类** 继承`QgsPlugin`并重写关键方法: ```cpp class MyPlugin : public QgsPlugin { void initGui() override { QAction* action = new QAction("工具", this); connect(action, &QAction::triggered, this, &MyPlugin::run); } void run() { QgsMessageLog::logMessage("插件已启动"); } }; ``` 3. **注册插件** 通过宏定义导出插件对象: ```cpp QGISEXTERN QgsPlugin* classFactory(QgisInterface* iface) { return new MyPlugin(iface); } ``` #### 三、界面开发示例 使用Qt Designer创建`.ui`文件,实现地图工具交互: ```xml <!-- 在UI文件中添加地图画布 --> <widget class="QgsMapCanvas" name="mapCanvas"> <property name="geometry"> <rect> <x>0</x><y>0</y><width>400</width><height>300</height> </rect> </property> </widget> ``` #### 四、调试与部署 1. **调试技巧** 在Linux下可通过`gdb`附加到QGIS进程: ```bash gdb --args qgis --noplugins ``` 2. **插件安装** 将生成的`.dll`/`.so`文件复制到`~/.local/share/QGIS/QGIS3/profiles/default/python/plugins/`[^2] #### 五、学习资源推荐 1. 官方示例库:[QGIS-CPP-Examples](https://github.com/qgis/QGIS-CPP-Examples) 2. 核心API文档:[QGIS Class Index](https://api.qgis.org/api/annotated.html) 3. 开发社区支持:[GIS StackExchange](https://gis.stackexchange.com/questions/tagged/qgis+c%2b%2b)
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GISerQ.

你的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值