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/

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

3.QT5下载

Qt 官网有一个专门的资源下载网站,所有的开发环境和相关工具都可以从这里下载,具体地址是:https://download.qt.io/official_releases/qt/

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


在安装Qt时可以根据需要选择模块,如果用vs进行开发就选择mscv以及对应的VS版本,如果用Qt开发就只选MinGW就可以了。

4. VS2019安装QT插件

打开VS2019,选择 扩展->管理扩展->搜索框中输入“qt”

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


然后选择 Qt visual studio Tools 进行安装,安装时要关闭VS2019.

安装完成后,打开VS2019->扩展->Qt VS Tools ->Options -> Versions ->将下载的Qt的编译器添加进来,如果用VS开发,就选择mscv2019_64,这一步骤完成。

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

5.QGIS下载及安装

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

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

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

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


下载好后,双击安装包进行安装

(1)选择Andvance Install

VS2019+QT5.15.2+QGIS二次开发环境搭建_官网_06


(2)选择install from Internet

VS2019+QT5.15.2+QGIS二次开发环境搭建_官网_07


(3)选择安装路径,可以自己更改

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

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


(4)选择Direct Connection

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


(5)选择第一个网址

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


(6)搜索qgis,点击Libs后面,选择为install,人然后点下一步,直到安装完成。

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


至此QGIS就安装完成了。

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

启动VS后,新建项目,搜索Qt,找到QtWidgetsApplication后进行创建新项目,我这里直接用默认名称QtWidgetsApplication1。

注意,在导入模块的时候要把XML勾选上,否则运行的时候会报错。如果这里不勾选,也可以创建好后,在VS中的扩展->QT VS Tools -> QT project settings ->Qt Modules中进行添加(下图)。

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

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


创建好后,将版本改为release ×64

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

7. 配置项目属性

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

C:\path\to\OSGeo4W64\include
C:\path\to\OSGeo4W64\apps\qgis\include
  • 1
  • 2

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

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

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

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<span >;</span>    <span >//创建一个窗体,类似于Qt</span>
w<span >.</span><span >show</span><span >(</span><span >)</span><span >;</span>
<span >return</span> a<span >.</span><span >exec</span><span >(</span><span >)</span><span >;</span>

}


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_OBJECTpublic:
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);

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

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

mapCanvas<span >-></span><span >setCanvasColor</span><span >(</span><span >QColor</span><span >(</span><span >255</span><span >,</span> <span >255</span><span >,</span> <span >255</span><span >)</span><span >)</span><span >;</span>
mapCanvas<span >-></span><span >setVisible</span><span >(</span><span >true</span><span >)</span><span >;</span>
mapCanvas<span >-></span><span >enableAntiAliasing</span><span >(</span><span >true</span><span >)</span><span >;</span>
}
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”);
<span >if</span> <span >(</span><span >!</span>vecLayer<span >-></span><span >isValid</span><span >(</span><span >)</span><span >)</span>
<span >{<!-- --></span>
<span >QMessageBox</span><span >::</span><span >critical</span><span >(</span><span >this</span><span >,</span> <span >"error"</span><span >,</span> <span >QString</span><span >(</span><span >"layer is invalid: \n"</span><span >)</span> <span >+</span> fileName<span >)</span><span >;</span>
<span >return</span><span >;</span>
<span >}</span>
mapCanvas<span >-></span><span >setExtent</span><span >(</span>vecLayer<span >-></span><span >extent</span><span >(</span><span >)</span><span >)</span><span >;</span>
layers<span >.</span><span >append</span><span >(</span>vecLayer<span >)</span><span >;</span>
mapCanvas<span >-></span><span >setLayers</span><span >(</span>layers<span >)</span><span >;</span>
mapCanvas<span >-></span><span >refresh</span><span >(</span><span >)</span><span >;</span>

运行后可以打开*.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:

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



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/

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

3.QT5下载

Qt 官网有一个专门的资源下载网站,所有的开发环境和相关工具都可以从这里下载,具体地址是:https://download.qt.io/official_releases/qt/

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


在安装Qt时可以根据需要选择模块,如果用vs进行开发就选择mscv以及对应的VS版本,如果用Qt开发就只选MinGW就可以了。

4. VS2019安装QT插件

打开VS2019,选择 扩展->管理扩展->搜索框中输入“qt”

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


然后选择 Qt visual studio Tools 进行安装,安装时要关闭VS2019.

安装完成后,打开VS2019->扩展->Qt VS Tools ->Options -> Versions ->将下载的Qt的编译器添加进来,如果用VS开发,就选择mscv2019_64,这一步骤完成。

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

5.QGIS下载及安装

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

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

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

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


下载好后,双击安装包进行安装

(1)选择Andvance Install

VS2019+QT5.15.2+QGIS二次开发环境搭建_官网_06


(2)选择install from Internet

VS2019+QT5.15.2+QGIS二次开发环境搭建_官网_07


(3)选择安装路径,可以自己更改

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

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


(4)选择Direct Connection

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


(5)选择第一个网址

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


(6)搜索qgis,点击Libs后面,选择为install,人然后点下一步,直到安装完成。

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


至此QGIS就安装完成了。

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

启动VS后,新建项目,搜索Qt,找到QtWidgetsApplication后进行创建新项目,我这里直接用默认名称QtWidgetsApplication1。

注意,在导入模块的时候要把XML勾选上,否则运行的时候会报错。如果这里不勾选,也可以创建好后,在VS中的扩展->QT VS Tools -> QT project settings ->Qt Modules中进行添加(下图)。

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

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


创建好后,将版本改为release ×64

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

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>