很奇怪,3.4 LTR 没有API手册,而官网的API手册Doxygen生成的...。OK停止吐槽,解决问题
我下载了配套的源码,没有手册没关系。参照一篇博客做了相应的调整。百度QGIS全是2.x版本,3.x版本的版本更改的东西可以在这里找到 https://qgis.org/api/3.2/api_break.html
之前编译源码也是心塞塞。可能在linux下更好开发一些,一路yum和apt。所以3.4版本依赖python和一大堆依赖库的问题,我也是没门,在官方desktop版本上也是没有qgis的SDK的所以这个需要网络版本下载 相应的SDK。具体怎样安装 qgis SDK 可以参照 https://blog.csdn.net/qq_34357717/article/details/81305084
这是我参照的二次开发博客 https://blog.csdn.net/shineplusplus/article/details/78362098(这里特别感谢链接博主最后的对其流程进行了总结)
这里我提供一个图层库。帝都的road.shp,方便各位测试,传送门(https://download.csdn.net/download/qq_24423085/11664031)
废话不多说:
cmake_minimum_required(VERSION 3.8.0)
project(QGisSQLConnectDemo)
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 "In QGis SDK install path")
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(QGIS_INC "${qgis_path}/include")
set(QGIS_LIB "${qgis_path}/lib")
set(QGIS_BIN "${qgis_path}/bin")
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}")
include_directories(${QGIS_INC} F:/OSGeo4W64/apps/Qt5/include) #头文件的路径 SDK下QGIS目录和自带Qt5的头文件路径
link_directories(${GIS_LIB})
link_libraries(${ALL_LIBS})
add_definitions(-D_USE_MATH_DEFINES)
aux_source_directory(${CMAKE_SOURCE_DIR} SRC_ALL)
#add_executable(${PROJECT_NAME} WIN32 ${SRC_ALL}) #no console
add_executable(${PROJECT_NAME} ${SRC_ALL} ${ALL_UI}) # console
target_link_libraries(${PROJECT_NAME} Qt5::Widgets Qt5::Xml Qt5::Sql)
file(WRITE ${CMAKE_BUILD_RPATH}/pathCmd.cmd
"@echo off
set PATH=%PATH%;${QGIS_BIN};F:/OSGeo4W64/apps/Qt5/bin;F:/OSGeo4W64/bin;
${PROJECT_NAME}
echo application begin...
::pause>nul"
)#这里生成一个cmd脚本用于拉起exe。在VS开发下可能不太方便调试。
install(TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
install(DIRECTORY ${CMAKE_BUILD_RPATH} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin FILES_MATCHING PATTERN "*.cmd")
因为下载的包可能需要更改路径。你必须了解CMake工程,这里你可以加我的Q群 870836798,有什么问题也问,可以讨论一些新东西。上面我对需要更改的地方进行注释。里面cmake option 可能还需要你的配置。如下
#include
#include "MainWindow.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pluginsPath "F:\\OSGeo4W64\\apps\\qgis-dev\\plugins"
//using namespace QgsGuiUtils;
int main(int argc, char* argv[])
{
QgsApplication myApp(argc, argv, true);
myApp.setPrefixPath("F:\\OSGeo4W64\\apps\\qgis",true);
QgsProviderRegistry::instance("F:\\OSGeo4W64\\apps\\qgis\\plugins");
QString file("E:\\Beijing.osm.shp\\Beijing-shp\\shape\\roads.shp");
QList listVecLayer;
QgsVectorLayer Vectorlayer;
Vectorlayer.setProviderEncoding("GBK2312");
Vectorlayer.setMinimumScale(1.0);
Vectorlayer.setDataSource(file,QFileInfo(file).completeBaseName(),"ogr",true);
//QgsFeature feature();
//QgsFeatureList FeatureList;
//FeatureList.append();
//QgsVectorLayer usetLayer;
//usetLayer.addFeatures();
listVecLayer.append(&Vectorlayer);
qDebug()<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();
//QgsMapLayer* testlayer = new QgsMapLayer();
testlayer.show();
//QgsDataSourceUri GS_DATASURL;
// setConnection(const QString&aHost,const QString&aPort,const QString&aDatabase,const QString&aUsername,const QString&aPassword,SslMode sslmode = SslPrefer,const QString&authConfigId = QString())
//GS_DATASURL.setConnection("192.168.2.205","3306", "beijin_map", "root", "root", QgsDataSourceUri::SslMode::SslDisable);
//GS_DATASURL.setDriver("Mysql");
//qDebug() << "exit" << GS_DATASURL.table();
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("192.168.2.205");
db.setDatabaseName("beijing_map");
db.setUserName("root");
db.setPassword("root");
if (db.open())
{
QSqlQuery qsql = QSqlQuery(db);
if(qsql.exec("select COLUMN_NAME from information_schema.COLUMNS where table_name = 'testmap'"))
{
while (qsql.next()) {
qDebug() << qsql.value(0).toString();
}
}
}
else
qDebug() << db.lastError();
//MainWindow MW;
//MW.show();
//QgsMapLayoutConfigWidget QMLCW;
//QMLCW.show();
return myApp.exec();
}
这里终端打印了几个错误,我在cmd脚本中进行了更正,在你查看博客的时候,可能这个问题并不会存在。
Qt工程是QCoreApplication或者QApplication。我之前一直加载不成功,原因是插件路径的问题,代码中“org”相应代表需要org的插件就是这个东西
坑爹的整了大概一周。。。QGsApplication中大概是封装了一些插件机制。所以这里需要配置插件路径。(来自SDK 下载的apps//qgis//plugin)
顺带提一个cmake工程调试的问题,我个人喜好是cmake工程。为了融合一些源码归档。比如这个qgis的开发依赖的包挺多的。反正visual studio自带的lauch.json调试不太好用。
然后我对环境进行了一个cmd脚本的编写,其实在qt用msvc编译器的时候就采用了这种方式。为什么这么做呢,因为每一个cmd这种窗口对于环境都是单独分离的,关闭cmd窗口失效。临时用户的环境。不必牵扯环境变量更改。如果有问题可以参照我的上一篇博客 QGIS 二次开发搭建(windows)
我是选择的cmake的工程所以,遇到任何cmake 的问题都可以加群Q 870836798 CMake技术交流