0
点赞
收藏
分享

微信扫一扫

VS2019+QGIS+cmake二次开发环境搭建

非衣所思 2022-03-30 阅读 73
qt

VS2019+QGIS+cmake二次开发环境搭建

总共分为以下步骤:

  • 下载qgis和二次开发库

  • VS2019搭建开发环境

    -  配置VS2019中的cmake
    - 配置环境变量
    
  • 编写测试代码

  • 运行测试代码

    • 拷贝运行程序需要用的动态库文件

参考文档:
QGis 二次开发搭建(windows)
QGis QgsVectorLayer 图层加载(shp file矢量图层)

1. 开发环境

  • Win10 ×64
  • VS2019
  • OSGeo4W

2. 下载qgis二次开发SDK
打开osgeo4w-setup-x86_64.exe后
1.选择advanced installenter image description hereenter image description here
2.选择install from Internetenter image description hereenter image description here
3.选择自己的安装路径
4.选择一个下载网站enter image description hereenter image description here
5.选择需要的开发库
enter image description hereenter image description here
首先在上面的搜索栏输入qgis-ltr(qgis长期支持版),搜索结果出来后点击ALL旁边的Default,变成Install。
enter image description hereenter image description here
enter image description hereenter image description here
完成这一步后清除搜索框的内容,再搜索qgis-dev-deps,重复刚才的步骤,将All点击成Install状态。
enter image description hereenter image description here
然后可以一路点击下一步直到安装完成。

3. VS2019搭建开发环境

安装自带cmake插件
创建bat文件设置临时环境变量拉起VS,注意set PATH后的路径应写在同一行。

@echo off
::把开发环境设置到当前cmd的环境(仅对cmd生效)
set PATH=%PATH%;D:\OSGeo4W64\bin;D:\OSGeo4W64\apps\qgis-ltr\bin;D:\OSGeo4W64\apps\qgis-ltr-dev\bin;D:\OSGeo4W64\apps\Qt5\bin;D:\OSGeo4W64\apps\grass\grass78\bin;D:\OSGeo4W64\apps\gdal-dev\bin;D:\OSGeo4W64\apps\proj-dev\bin;D:\OSGeo4W64\apps\Qt5\plugins\platforms;D:\OSGeo4W64\apps\Qt5\plugins;
 
::设置坐标系相关文件
set GDAL_DATA=D:\OSGeo4W64\share\gdal
 
echo "set env path end:"
echo ******************************************************************************************
echo %PATH%
echo ******************************************************************************************
echo "Start visoual studio 2019"
::设置vs启动(路径为:右键打开所在的文件夹直到找到exe执行程序)
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\devenv.exe"
 
::pause>nul

4. 编写测试代码

文件结构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9EVEPdP3-1648548446609)(https://i.loli.net/2021/06/17/7OtVUCzkmJ6QPTA.png)]enter image description here

顶层CMakeLists.txt

cmake_minimum_required (VERSION 3.8)

add_subdirectory(RADAR_TRAIN_REALTIME_APP)

#add_subdirectory(RADAR_TRAIN_HISTORY_APP)

radar_train_realtime.cpp

#include <qgis.h>
#include "radar_train_realtime.h"
#include <QApplication>
#include <qgis_core.h>
#include <qgis_gui.h>
#include <qgsdatasourceuri.h>
#include <qgsproviderregistry.h>
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <qgssinglesymbolrenderer.h>
#include <qgsapplication.h>
#include <QGraphicsScene>

#include  <QGraphicsView>
#include <qgsproject.h>
#include <QFileDialog>
#include <qgsmapcanvas.h>
#include "qgssymbol.h" 
#include "qgsrenderer.h" 
#include <qgsapplication.h>
#include <qgsproviderregistry.h>

#include <qgsvectorlayer.h>
#include <qgsrasterlayer.h>
#include <qgsmapcanvas.h>
#include <qgssinglesymbolrenderer.h>


#include <QMessageBox>
#include< qgsmaplayerstore.h >
#include <qgsrasterlayer.h>
#include< qgsmaplayerstore.h >
#include <QDebug>

#include <qgsmapcanvas.h>

#include <qgsmapsettings.h>

#include <QgsRasterIdentifyResult.h>



RadarTrainRealtime::RadarTrainRealtime() {}

RadarTrainRealtime::~RadarTrainRealtime() {}


int main(int argc, char* argv[])
{
	QgsApplication myApp(argc, argv, true);
	myApp.setPrefixPath("D:\\OSGeo4W64\\apps\\qgis", true);     //配置prefix路径
	QgsProviderRegistry::instance("D:\\OSGeo4W64\\apps\\qgis\\plugins"); //驱动管理

	QString file("D:\\BOOKS\\shp\\City.shp");

	QList<QgsMapLayer*> listVecLayer;

	QgsVectorLayer Vectorlayer;						 //矢量图层

	Vectorlayer.setProviderEncoding("UTF-8");        //字符集
	Vectorlayer.setMinimumScale(1.0);				 //设置坐标轴的最小刻度值
	QString layer_name = QFileInfo(file).completeBaseName();
	Vectorlayer.setDataSource(file, layer_name, "ogr", true);

	listVecLayer.append(&Vectorlayer);

	qDebug() << Vectorlayer.featureCount();
	QgsProject::instance()->addMapLayers(listVecLayer);

	QgsMapCanvas QGSMC;
	QGSMC.setLayers(listVecLayer);
	QGSMC.setExtent(Vectorlayer.extent());
	QGSMC.enableAntiAliasing(true);         //抗锯齿处理
	QGSMC.freeze(false);
	QGSMC.setDragMode(QGraphicsView::RubberBandDrag);    //拖拽模式


	QGSMC.setVisible(true);
	QGSMC.zoomToFullExtent();
	QGSMC.refresh();
	QGSMC.show();

	return myApp.exec();

}

第二层CMakeLists.txt

cmake_minimum_required (VERSION 3.8)

project ("RTRAPP")


set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
 
SET(QT_USE_QTMAIN TRUE)
 
find_package(Qt5 COMPONENTS Core Widgets Xml Sql REQUIRED)


 
#set(qgis_path "NOT-FOUND" CACHE PATH D:/OSGeo4W64)
set(qgis_path D:/OSGeo4W64/apps/qgis-ltr)
set(osg_path D:/OSGeo4W64)

if(qgis_path STREQUAL "NOT-FOUND")
 message(FATAL_ERROR "need download qgis sdk from Run Geo4w.exe")
endif()
 message(STATUS "qgis_path >>${qgis_path}")
 
set(CMAKE_BUILD_RPATH D:/OSGeo4W64)            #设定cmake_build_path的目录
message(STATUS "CMAKE_BUILD_RPATH >>${CMAKE_BUILD_RPATH}")     #打印目录

set(OSG_INC "${osg_path}/include")
set(OSG_LIB "${osg_path}/lib")
set(OSG_BIN "${osg_path}/bin")

set(QGIS_INC "${qgis_path}/include")
set(QGIS_LIB "${qgis_path}/lib")
set(QGIS_BIN "${qgis_path}/bin")
 
message(STATUS "OSG_INC >> ${OSG_INC}")
message(STATUS "OSG_LIB >> ${OSG_LIB}")
message(STATUS "QGIS_INC >> ${QGIS_INC}")
message(STATUS "QGIS_LIB >> ${QGIS_LIB}")


file(GLOB ALL_LIBS ${QGIS_LIB}/*.lib)
message(STATUS "ALL_LIBS >>${ALL_LIBS}")


file(GLOB ALL_LIBS2 ${OSG_LIB}/*.lib)
message(STATUS "ALL_LIBS2 >>${ALL_LIBS2}")
 
include_directories(${QGIS_INC} D:/OSGeo4W64/apps/Qt5/include) #头文件的路径 SDK下QGIS目录和自带Qt5的头文件路径


link_directories(${GIS_LIB})
link_libraries(${ALL_LIBS})
link_libraries(${ALL_LIBS2})

add_definitions(-D_USE_MATH_DEFINES)
 
aux_source_directory(${CMAKE_SOURCE_DIR} SRC_ALL)
 
#add_subdirectory(view)

#add_executable(${PROJECT_NAME} WIN32 ${SRC_ALL}) #no console 
#add_executable(${PROJECT_NAME} ${SRC_ALL} ${ALL_UI} "radar_train_realtime.h"   ) # console 
add_executable(${PROJECT_NAME} radar_train_realtime.cpp ${ALL_UI} ) # console 
target_link_libraries(${PROJECT_NAME} Qt5::Widgets Qt5::Xml Qt5::Sql)
 
 
file(WRITE ${RTRAPP_SOURCE_DIR}/bin/pathCmd.cmd 
"@echo off
set PATH=%PATH%;${QGIS_BIN};D:/OSGeo4W64/apps/Qt5/bin;${OSG_BIN};
${PROJECT_NAME}.exe
echo application begin...
::pause>nul"
)#这里生成一个cmd脚本用于拉起exe。在VS开发下可能不太方便调试。


install(TARGETS ${PROJECT_NAME}
  RUNTIME DESTINATION ${RTRAPP_SOURCE_DIR}/bin
  ARCHIVE DESTINATION ${RTRAPP_SOURCE_DIR}/lib
  LIBRARY DESTINATION ${RTRAPP_SOURCE_DIR}/lib)
 
install(DIRECTORY ${CMAKE_BUILD_RPATH} DESTINATION ${RTRAPP_SOURCE_DIR}/bin FILES_MATCHING PATTERN "*.cmd")

使用release版本执行编译,即可生成”RTRAPP.exe”和pathCmd.cmd。

5. 运行测试代码
如果此时双击运行可执行文件,会报缺少很多dll文件的错误,因为需要将Qt5依赖的文件拷贝到项目文件目录下。将
D:\OSGeo4W\apps\qgis\bin
D:\OSGeo4W\bin
D:\OSGeo4W\apps\Qt5\bin
目录下dll文件拷贝到工程Release目录下
还是有可能会缺dll文件,就需要用到Qt5自带的“windeployqt.exe”程序,可以用如下方法添加:

  1. 把“D:\OSGeo4W64\apps\Qt5\bin”添加到系统的环境变量的path中。
  2. 打开VS 2019开发人员cmd窗口,输入命令windeployqt [exe文件的路径],比如我的是“windeployqt D:\BOOKS\VSProject\RADAR_TRAIN\RADAR_TRAIN_REALTIME_APP\bin\RTRAPP.exe”,按下回车就完成了资源拷贝。如图所示:
    enter image description here

完成拷贝后再运行测试程序就能正常运行。
enter image description here

举报

相关推荐

0 条评论