From fb0c899fbabc3033becd4c11a181cd26402ad024 Mon Sep 17 00:00:00 2001 From: Thomas Gratier Date: Thu, 8 Apr 2021 01:06:16 +0200 Subject: [PATCH] Update sample 1 to work with QGIS 3.x --- 1_hello_world_qgis_style/CMakeLists.txt | 28 ++- .../FindGDAL.cmake | 0 1_hello_world_qgis_style/cmake/FindGEOS.cmake | 187 ++++++++++++++++++ .../FindQGIS.cmake | 0 .../cmake/MacPlistMacros.cmake | 12 ++ .../cmake_find_rules/FindGEOS.cmake | 45 ----- 1_hello_world_qgis_style/main.cpp | 38 ++-- 7 files changed, 231 insertions(+), 79 deletions(-) rename 1_hello_world_qgis_style/{cmake_find_rules => cmake}/FindGDAL.cmake (100%) create mode 100644 1_hello_world_qgis_style/cmake/FindGEOS.cmake rename 1_hello_world_qgis_style/{cmake_find_rules => cmake}/FindQGIS.cmake (100%) create mode 100644 1_hello_world_qgis_style/cmake/MacPlistMacros.cmake delete mode 100644 1_hello_world_qgis_style/cmake_find_rules/FindGEOS.cmake diff --git a/1_hello_world_qgis_style/CMakeLists.txt b/1_hello_world_qgis_style/CMakeLists.txt index 0e09330..d1c861c 100644 --- a/1_hello_world_qgis_style/CMakeLists.txt +++ b/1_hello_world_qgis_style/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 2.6) PROJECT(timtut1) SET(CMAKE_COLOR_MAKEFILE ON) # set path to additional CMake modules -SET(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake_find_rules ${CMAKE_MODULE_PATH}) +SET(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH}) FIND_PACKAGE(QGIS REQUIRED) IF (NOT QGIS_FOUND) MESSAGE (SEND_ERROR "QGIS dependency was not found!") @@ -63,16 +63,17 @@ SET (QT_USE_QTSQL TRUE) SET (QT_USE_QTSVG TRUE) SET (QT_USE_QTXML TRUE) SET (QT_USE_QTNETWORK TRUE) -FIND_PACKAGE(Qt4 REQUIRED) -INCLUDE( ${QT_USE_FILE} ) +FIND_PACKAGE(Qt5 REQUIRED COMPONENTS Core Widgets Xml) + +# INCLUDE( ${QT_USE_FILE} ) ######################################################## # Build -QT4_WRAP_UI (timtut1_UIS_H ${timtut1_UIS}) +QT5_WRAP_UI (timtut1_UIS_H ${timtut1_UIS}) -QT4_WRAP_CPP (timtut1_MOC_SRCS ${timtut1_MOC_HDRS}) +QT5_WRAP_CPP (timtut1_MOC_SRCS ${timtut1_MOC_HDRS}) -QT4_ADD_RESOURCES(timtut1_RCC_SRCS ${timtut1_RCCS}) +QT5_ADD_RESOURCES(timtut1_RCC_SRCS ${timtut1_RCCS}) ADD_EXECUTABLE (timtut1 ${timtut1_SRCS} ${timtut1_MOC_SRCS} ${timtut1_RCC_SRCS} ${timtut1_UIS_H}) @@ -85,17 +86,14 @@ INCLUDE_DIRECTORIES( . ) -#This is probably no longer needed, but I will leave it in for Win machines for the moment -IF(QT_QTSQL_FOUND) - FIND_LIBRARY(QT_QTSQL_LIBRARY NAMES QtSql QtSql4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) - SET(QT_LIBRARIES ${QT_LIBRARIES} ${QT_QTSQL_LIBRARY}) -ENDIF(QT_QTSQL_FOUND) - TARGET_LINK_LIBRARIES(timtut1 - ${QT_LIBRARIES} + Qt5::Core + Qt5::Widgets + Qt5::Xml ${QGIS_CORE_LIBRARY} ${QGIS_GUI_LIBRARY} - ${GEOS_LIBRARY} + ${GEOS_LIBRARY} + ${GDAL_LIBRARY} ) @@ -109,5 +107,3 @@ ENDIF (MSVC) ######################################################## # Install - - diff --git a/1_hello_world_qgis_style/cmake_find_rules/FindGDAL.cmake b/1_hello_world_qgis_style/cmake/FindGDAL.cmake similarity index 100% rename from 1_hello_world_qgis_style/cmake_find_rules/FindGDAL.cmake rename to 1_hello_world_qgis_style/cmake/FindGDAL.cmake diff --git a/1_hello_world_qgis_style/cmake/FindGEOS.cmake b/1_hello_world_qgis_style/cmake/FindGEOS.cmake new file mode 100644 index 0000000..f7ef380 --- /dev/null +++ b/1_hello_world_qgis_style/cmake/FindGEOS.cmake @@ -0,0 +1,187 @@ +# Find GEOS +# ~~~~~~~~~ +# Copyright (c) 2008, Mateusz Loskot +# (based on FindGDAL.cmake by Magnus Homann) +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +# +# CMake module to search for GEOS library +# +# If it's found it sets GEOS_FOUND to TRUE +# and following variables are set: +# GEOS_INCLUDE_DIR +# GEOS_LIBRARY +# + +INCLUDE (${CMAKE_SOURCE_DIR}/cmake/MacPlistMacros.cmake) + +IF(WIN32) + + IF (MINGW) + FIND_PATH(GEOS_INCLUDE_DIR geos_c.h "$ENV{LIB_DIR}/include" /usr/local/include /usr/include c:/msys/local/include) + FIND_LIBRARY(GEOS_LIBRARY NAMES geos_c PATHS "$ENV{LIB_DIR}/lib" /usr/local/lib /usr/lib c:/msys/local/lib) + ENDIF (MINGW) + + IF (MSVC) + FIND_PATH(GEOS_INCLUDE_DIR geos_c.h $ENV{LIB_DIR}/include $ENV{INCLUDE}) + FIND_LIBRARY(GEOS_LIBRARY NAMES geos_c_i geos_c PATHS + "$ENV{LIB_DIR}/lib" + $ENV{LIB} + ) + ENDIF (MSVC) + +ELSEIF(APPLE AND QGIS_MAC_DEPS_DIR) + + FIND_PATH(GEOS_INCLUDE_DIR geos_c.h "$ENV{LIB_DIR}/include" ) + FIND_LIBRARY(GEOS_LIBRARY NAMES geos_c PATHS "$ENV{LIB_DIR}/lib" ) + +ELSE(WIN32) + + IF(UNIX) + # try to use framework on mac + # want clean framework path, not unix compatibility path + IF (APPLE) + IF (CMAKE_FIND_FRAMEWORK MATCHES "FIRST" + OR CMAKE_FRAMEWORK_PATH MATCHES "ONLY" + OR NOT CMAKE_FIND_FRAMEWORK) + SET (CMAKE_FIND_FRAMEWORK_save ${CMAKE_FIND_FRAMEWORK} CACHE STRING "" FORCE) + SET (CMAKE_FIND_FRAMEWORK "ONLY" CACHE STRING "" FORCE) + FIND_LIBRARY(GEOS_LIBRARY GEOS) + IF (GEOS_LIBRARY) + # they're all the same in a framework + SET (GEOS_INCLUDE_DIR ${GEOS_LIBRARY}/Headers CACHE PATH "Path to a file.") + # set GEOS_CONFIG to make later test happy, not used here, may not exist + SET (GEOS_CONFIG ${GEOS_LIBRARY}/unix/bin/geos-config CACHE FILEPATH "Path to a program.") + # version in info.plist + GET_VERSION_PLIST (${GEOS_LIBRARY}/Resources/Info.plist GEOS_VERSION) + IF (NOT GEOS_VERSION) + MESSAGE (FATAL_ERROR "Could not determine GEOS version from framework.") + ENDIF (NOT GEOS_VERSION) + STRING(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\1" GEOS_VERSION_MAJOR "${GEOS_VERSION}") + STRING(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\2" GEOS_VERSION_MINOR "${GEOS_VERSION}") + IF (GEOS_VERSION_MAJOR LESS 3) + MESSAGE (FATAL_ERROR "GEOS version is too old (${GEOS_VERSION}). Use 3.0.0 or higher.") + ENDIF (GEOS_VERSION_MAJOR LESS 3) + ENDIF (GEOS_LIBRARY) + SET (CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK_save} CACHE STRING "" FORCE) + ENDIF () + ENDIF (APPLE) + + IF(CYGWIN) + FIND_LIBRARY(GEOS_LIBRARY NAMES geos_c PATHS /usr/lib /usr/local/lib) + ENDIF(CYGWIN) + + IF (NOT GEOS_INCLUDE_DIR OR NOT GEOS_LIBRARY OR NOT GEOS_CONFIG) + # didn't find OS X framework, and was not set by user + SET(GEOS_CONFIG_PREFER_PATH "$ENV{GEOS_HOME}/bin" CACHE STRING "preferred path to GEOS (geos-config)") + FIND_PROGRAM(GEOS_CONFIG geos-config + ${GEOS_CONFIG_PREFER_PATH} + $ENV{LIB_DIR}/bin + /usr/local/bin/ + /usr/bin/ + ) + #MESSAGE("DBG GEOS_CONFIG ${GEOS_CONFIG}") + + IF (GEOS_CONFIG) + + EXEC_PROGRAM(${GEOS_CONFIG} + ARGS --version + OUTPUT_VARIABLE GEOS_VERSION) + STRING(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\1" GEOS_VERSION_MAJOR "${GEOS_VERSION}") + STRING(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\2" GEOS_VERSION_MINOR "${GEOS_VERSION}") + + IF (GEOS_VERSION_MAJOR LESS 3 OR (GEOS_VERSION_MAJOR EQUAL 3 AND GEOS_VERSION_MINOR LESS 3) ) + MESSAGE (FATAL_ERROR "GEOS version is too old (${GEOS_VERSION}). Use 3.3.0 or higher.") + ENDIF (GEOS_VERSION_MAJOR LESS 3 OR (GEOS_VERSION_MAJOR EQUAL 3 AND GEOS_VERSION_MINOR LESS 3) ) + + # set INCLUDE_DIR to prefix+include + EXEC_PROGRAM(${GEOS_CONFIG} + ARGS --prefix + OUTPUT_VARIABLE GEOS_PREFIX) + + FIND_PATH(GEOS_INCLUDE_DIR + geos_c.h + ${GEOS_PREFIX}/include + /usr/local/include + /usr/include + ) + + ## extract link dirs for rpath + EXEC_PROGRAM(${GEOS_CONFIG} + ARGS --libs + OUTPUT_VARIABLE GEOS_CONFIG_LIBS ) + + ## split off the link dirs (for rpath) + ## use regular expression to match wildcard equivalent "-L*" + ## with is a space or a semicolon + STRING(REGEX MATCHALL "[-][L]([^ ;])+" + GEOS_LINK_DIRECTORIES_WITH_PREFIX + "${GEOS_CONFIG_LIBS}" ) + #MESSAGE("DBG GEOS_LINK_DIRECTORIES_WITH_PREFIX=${GEOS_LINK_DIRECTORIES_WITH_PREFIX}") + + ## remove prefix -L because we need the pure directory for LINK_DIRECTORIES + + IF (GEOS_LINK_DIRECTORIES_WITH_PREFIX) + STRING(REGEX REPLACE "[-][L]" "" GEOS_LINK_DIRECTORIES ${GEOS_LINK_DIRECTORIES_WITH_PREFIX} ) + ENDIF (GEOS_LINK_DIRECTORIES_WITH_PREFIX) + + ### XXX - mloskot: geos-config --libs does not return -lgeos_c, so set it manually + ## split off the name + ## use regular expression to match wildcard equivalent "-l*" + ## with is a space or a semicolon + #STRING(REGEX MATCHALL "[-][l]([^ ;])+" + # GEOS_LIB_NAME_WITH_PREFIX + # "${GEOS_CONFIG_LIBS}" ) + #MESSAGE("DBG GEOS_CONFIG_LIBS=${GEOS_CONFIG_LIBS}") + #MESSAGE("DBG GEOS_LIB_NAME_WITH_PREFIX=${GEOS_LIB_NAME_WITH_PREFIX}") + SET(GEOS_LIB_NAME_WITH_PREFIX -lgeos_c CACHE STRING INTERNAL) + + ## remove prefix -l because we need the pure name + + IF (GEOS_LIB_NAME_WITH_PREFIX) + STRING(REGEX REPLACE "[-][l]" "" GEOS_LIB_NAME ${GEOS_LIB_NAME_WITH_PREFIX} ) + ENDIF (GEOS_LIB_NAME_WITH_PREFIX) + #MESSAGE("DBG GEOS_LIB_NAME=${GEOS_LIB_NAME}") + + IF (APPLE) + IF (NOT GEOS_LIBRARY) + # work around empty GEOS_LIBRARY left by framework check + # while still preserving user setting if given + # ***FIXME*** need to improve framework check so below not needed + SET(GEOS_LIBRARY ${GEOS_LINK_DIRECTORIES}/lib${GEOS_LIB_NAME}.dylib CACHE STRING INTERNAL FORCE) + ENDIF (NOT GEOS_LIBRARY) + ELSE (APPLE) + FIND_LIBRARY(GEOS_LIBRARY NAMES ${GEOS_LIB_NAME} PATHS ${GEOS_LIB_DIRECTORIES}/lib) + ENDIF (APPLE) + #MESSAGE("DBG GEOS_LIBRARY=${GEOS_LIBRARY}") + + ELSE(GEOS_CONFIG) + MESSAGE("FindGEOS.cmake: geos-config not found. Please set it manually. GEOS_CONFIG=${GEOS_CONFIG}") + ENDIF(GEOS_CONFIG) + ENDIF(NOT GEOS_INCLUDE_DIR OR NOT GEOS_LIBRARY OR NOT GEOS_CONFIG) + ENDIF(UNIX) +ENDIF(WIN32) + +IF(GEOS_INCLUDE_DIR AND NOT GEOS_VERSION) + FILE(READ ${GEOS_INCLUDE_DIR}/geos_c.h VERSIONFILE) + STRING(REGEX MATCH "#define GEOS_VERSION \"[0-9]+\\.[0-9]+\\.[0-9]+" GEOS_VERSION ${VERSIONFILE}) + STRING(REGEX MATCH "[0-9]+\\.[0-9]\\.[0-9]+" GEOS_VERSION ${GEOS_VERSION}) +ENDIF(GEOS_INCLUDE_DIR AND NOT GEOS_VERSION) + +IF (GEOS_INCLUDE_DIR AND GEOS_LIBRARY) + SET(GEOS_FOUND TRUE) +ENDIF (GEOS_INCLUDE_DIR AND GEOS_LIBRARY) + +IF (GEOS_FOUND) + + IF (NOT GEOS_FIND_QUIETLY) + MESSAGE(STATUS "Found GEOS: ${GEOS_LIBRARY} (${GEOS_VERSION})") + ENDIF (NOT GEOS_FIND_QUIETLY) + +ELSE (GEOS_FOUND) + + MESSAGE(GEOS_INCLUDE_DIR=${GEOS_INCLUDE_DIR}) + MESSAGE(GEOS_LIBRARY=${GEOS_LIBRARY}) + MESSAGE(FATAL_ERROR "Could not find GEOS") + +ENDIF (GEOS_FOUND) diff --git a/1_hello_world_qgis_style/cmake_find_rules/FindQGIS.cmake b/1_hello_world_qgis_style/cmake/FindQGIS.cmake similarity index 100% rename from 1_hello_world_qgis_style/cmake_find_rules/FindQGIS.cmake rename to 1_hello_world_qgis_style/cmake/FindQGIS.cmake diff --git a/1_hello_world_qgis_style/cmake/MacPlistMacros.cmake b/1_hello_world_qgis_style/cmake/MacPlistMacros.cmake new file mode 100644 index 0000000..b123872 --- /dev/null +++ b/1_hello_world_qgis_style/cmake/MacPlistMacros.cmake @@ -0,0 +1,12 @@ +# Mac Plist Macros + +FUNCTION (GET_VERSION_PLIST PLISTFILE OUTVAR) + SET (PVERSION "") + IF (EXISTS ${PLISTFILE}) + FILE (READ "${PLISTFILE}" info_plist) + STRING (REGEX REPLACE "\n" "" info_plist "${info_plist}") + STRING (REGEX MATCH "CFBundleShortVersionString[ \t]*([0-9\\.]*)" PLISTVERSION "${info_plist}") + STRING (REGEX REPLACE "CFBundleShortVersionString[ \t]*([0-9\\.]*)" "\\1" PVERSION "${PLISTVERSION}") + ENDIF (EXISTS ${PLISTFILE}) + SET (${OUTVAR} ${PVERSION} PARENT_SCOPE) +ENDFUNCTION (GET_VERSION_PLIST) diff --git a/1_hello_world_qgis_style/cmake_find_rules/FindGEOS.cmake b/1_hello_world_qgis_style/cmake_find_rules/FindGEOS.cmake deleted file mode 100644 index 520ba36..0000000 --- a/1_hello_world_qgis_style/cmake_find_rules/FindGEOS.cmake +++ /dev/null @@ -1,45 +0,0 @@ - -# CMake module to search for GEOS library -# -# If it's found it sets GEOS_FOUND to TRUE -# and following variables are set: -# GEOS_INCLUDE_DIR -# GEOS_LIBRARY - - -FIND_PATH(GEOS_INCLUDE_DIR geos.h - /usr/local/include - /usr/include - #MSVC - "$ENV{LIB_DIR}/include" - #mingw - c:/msys/local/include - ) - -FIND_LIBRARY(GEOS_LIBRARY NAMES geos PATHS - /usr/local/lib - /usr/lib - #MSVC - "$ENV{LIB_DIR}/lib" - #mingw - c:/msys/local/lib - ) - -IF (GEOS_INCLUDE_DIR AND GEOS_LIBRARY) - SET(GEOS_FOUND TRUE) -ENDIF (GEOS_INCLUDE_DIR AND GEOS_LIBRARY) - - -IF (GEOS_FOUND) - - IF (NOT GEOS_FIND_QUIETLY) - MESSAGE(STATUS "Found GEOS: ${GEOS_LIBRARY}") - ENDIF (NOT GEOS_FIND_QUIETLY) - -ELSE (GEOS_FOUND) - - IF (GEOS_FIND_REQUIRED) - MESSAGE(FATAL_ERROR "Could not find GEOS") - ENDIF (GEOS_FIND_REQUIRED) - -ENDIF (GEOS_FOUND) diff --git a/1_hello_world_qgis_style/main.cpp b/1_hello_world_qgis_style/main.cpp index dae6692..ed99c99 100644 --- a/1_hello_world_qgis_style/main.cpp +++ b/1_hello_world_qgis_style/main.cpp @@ -1,35 +1,39 @@ // +// Qt Includes +// +#include +#include +#include +#include +#include +// // QGIS Includes // #include #include #include -#include +#include #include +#include #include -// -// Qt Includes -// -#include -#include -#include + int main(int argc, char ** argv) { // Start the Application QgsApplication app(argc, argv, true); - QString myPluginsDir = "/home/timlinux/apps/lib/qgis"; - QString myLayerPath = "/home/timlinux/gisdata/brazil/BR_Cidades/"; - QString myLayerBaseName = "Brasil_Cap"; + QString myPluginsDir = "/usr/lib/qgis/"; + QString myLayerPath = "/home/thomasg/ne_10m_admin_0_countries.shp"; + QString myLayerBaseName = "Countries"; QString myProviderName = "ogr"; // Instantiate Provider Registry QgsProviderRegistry::instance(myPluginsDir); // create a maplayer instance QgsVectorLayer * mypLayer = new QgsVectorLayer(myLayerPath, myLayerBaseName, myProviderName); - QgsSingleSymbolRenderer *mypRenderer = new QgsSingleSymbolRenderer(mypLayer->geometryType()); - QList myLayerSet; + QgsSingleSymbolRenderer *mypRenderer = new QgsSingleSymbolRenderer(QgsSymbol::defaultSymbol(mypLayer->geometryType())); + QList layers; mypLayer->setRenderer(mypRenderer); if (mypLayer->isValid()) { @@ -41,23 +45,21 @@ int main(int argc, char ** argv) } // Add the Vector Layer to the Layer Registry - QgsMapLayerRegistry::instance()->addMapLayer(mypLayer, TRUE); + QgsProject::instance()->addMapLayer(mypLayer); // Add the Layer to the Layer Set - myLayerSet.append(QgsMapCanvasLayer(mypLayer, TRUE)); + layers.append(mypLayer); // Create the Map Canvas - QgsMapCanvas * mypMapCanvas = new QgsMapCanvas(0, 0); + QgsMapCanvas * mypMapCanvas = new QgsMapCanvas(); mypMapCanvas->setExtent(mypLayer->extent()); mypMapCanvas->enableAntiAliasing(true); mypMapCanvas->setCanvasColor(QColor(255, 255, 255)); mypMapCanvas->freeze(false); // Set the Map Canvas Layer Set - mypMapCanvas->setLayerSet(myLayerSet); + mypMapCanvas->setLayers(layers); mypMapCanvas->setVisible(true); mypMapCanvas->refresh(); // Start the Application Event Loop return app.exec(); } - -