Приложение QT C ++ с использованием API QGIS

Я пытаюсь разработать приложение QT C ++, которое использует QGIS API, и я не могу управлять Qt Creator для компиляции кода. Я прочитал несколько тем на gis.stackexchange и из других источников. Информация в основном устарела, и я не нашел решения. Что мне нужно, так это общее руководство по совместимости следующих элементов, которые помогут мне найти правильную комбинацию:

  • Версия Qt: пробовал 4.8.6 и 5.9.
  • Компилятор Qt: пробовал MinGW, VS2008 Express (Qt 4.8.6) и VS Community 2017 (Qt 5.9)
  • Версия QGIS: пробовал с 2.14 до 2.18.
  • Компиляция QGIS: я использую только обычный установщик OSGeo4w, а AFAIK QGIS скомпилирован с Qt4 и MSVC. Я пытался скомпилировать QGIS из исходного кода, используя MinGW, но безуспешно (опять же, проблемы совместимости версий).
  • Версия для Windows: я использую Windows 10 64bit.
    OSGeo4W или OSGeo4W64.

Qt работает нормально в каждом случае со своими собственными библиотеками, но когда я пытаюсь импортировать библиотеки QGIS, он выдает ошибку ‘undefined reference’ при сборке, даже если intellisense работает нормально, так как распознает QgsApplication как член qgsapplication.h.

Следующее — просто тест, с которым я не могу работать. Мой Pro файл:

QT       += core gui xml

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = QgisWindow
TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += \
main.cpp \
mainwindow.cpp

HEADERS += \
mainwindow.h

FORMS += \
mainwindow.ui

# QGIS
INCLUDEPATH +=  "C:/OSGeo4W64/apps/qgis-rel-dev/include"INCLUDEPATH +=  "C:/OSGeo4W64/include"
LIBS += -L"C:/OSGeo4W64/apps/qgis-rel-dev/lib" -lqgis_core -lqgis_gui

DEFINES+=CORE_EXPORT=
DEFINES+=GUI_EXPORT=
# QGIS

main.cpp является:

#include <QApplication>
#include <qgsapplication.h>int main(int argc, char *argv[])
{
QgsApplication app(argc, argv, true);
QgsApplication::setPrefixPath("C:/OSGeo4W64/apps/qgis-dev", true);

int retval = app.exec();
QgsApplication::exitQgis();
return retval;
}

Тогда это не в состоянии собирать / компилировать с этой ошибкой:

main.cpp:20: error: undefined reference to `QgsApplication::QgsApplication(int&, char**, bool, QString const&, QString const&)'

Я на самом деле портирую приложение PyQgis, которое я сделал два года назад, и, поскольку я довольно новичок в Qt Creator, я застрял в его начале.

0

Решение

Я нашел правильную комбинацию вышеупомянутых элементов, чтобы Qt мог импортировать библиотеки Qgis и собрать приложение:

  • Qt 4.8.6 для MSVC2010
  • Qt Creator 4.3.0 (из установки Qt 5.9.0). Qt Creator 3.0 также может быть использован.
  • Visual C ++ express 2010 — Включить Windows Kits / SDK в установку
  • OSGeo4W — установлен qgis-ltr-dev и все библиотеки
  • Cmake 2.8.2

Для запуска Qt Creator я использую этот .bat:

Creator.bat:

ECHO Setting up QGIS DEV ENV

set PYTHONPATH=

set OSGEO4W_ROOT=C:\OSGeo4W
call "%OSGEO4W_ROOT%\bin\o4w_env.bat"
@set QMAKESPEC=win32-msvc2010

@set PATH=%OSGEO4W_ROOT%\bin;%OSGEO4W_ROOT%\apps\qgis-ltr-dev\bin;%PATH%

@set INCLUDE=%INCLUDE%;%OSGEO4W_ROOT%\include;%OSGEO4W_ROOT%\apps\qgis-ltr-dev\include

@set LIB=%LIB%;%OSGEO4W_ROOT%\lib;%OSGEO4W_ROOT%\apps\qgis-ltr-dev\lib

path %OSGEO4W_ROOT%\bin;%SYSTEMROOT%\System32;%SYSTEMROOT%;%SYSTEMROOT%\System32\wbem;C:\Program Files (x86)\Git\bin;C:\Tools\QtCreator\bin;%PATH%

set VS100COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools
call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86

start "Qt Creator" /B C:\Qt\Qt5.9.0\Tools\QtCreator\bin\qtcreator.exe %*

PRO файл:

QT       += core gui xml

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = 1_hello_world_qgis_style
TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += main.cpp

## QGIS
INCLUDEPATH +=  "C:/OSGeo4W/include"INCLUDEPATH +=  "C:/OSGeo4W/apps/qgis-ltr-dev/include"
LIBS += -L"C:/OSGeo4W/apps/qgis-ltr-dev/lib" -lqgis_core -lqgis_gui

DEFINES+=CORE_EXPORT=
DEFINES+=GUI_EXPORT=
## QGIS

main.cpp файл (адаптировано из Примеры Тима Саттона)

// Qt Includes
#include <QApplication>

// QGIS Includes
#include <qgsapplication.h>
#include <qgsproviderregistry.h>
#include <qgssinglesymbolrendererv2.h>
#include <qgsmaplayerregistry.h>
#include <qgsvectorlayer.h>
#include <qgsmapcanvas.h>

int main(int argc, char ** argv)
{

// Start the Application
QgsApplication app(argc, argv, true);

app.setPrefixPath("D:/GIS");

QString myPluginsDir        = "<path to Qgis plugins dir>";
QString myLayerPath1         = "<path to shapefile 1>";
QString myLayerBaseName1     = "Layer1";
QString myLayerPath2         = "<path to shapefile 2>";
QString myLayerBaseName2     = "Layer2";
QString myProviderName      = "ogr";

// Instantiate Provider Registry
QgsProviderRegistry::instance(myPluginsDir);
// create maplayer instances
QgsVectorLayer * mypLayer1 = new QgsVectorLayer(myLayerPath1, myLayerBaseName1, myProviderName);
QgsVectorLayer * mypLayer2 = new QgsVectorLayer(myLayerPath2, myLayerBaseName2, myProviderName);
QgsSingleSymbolRendererV2 *mypRenderer1 = new QgsSingleSymbolRendererV2(QgsSymbolV2::defaultSymbol(mypLayer1->geometryType()));
QgsSingleSymbolRendererV2 *mypRenderer2 = new QgsSingleSymbolRendererV2(QgsSymbolV2::defaultSymbol(mypLayer2->geometryType()));
QList <QgsMapCanvasLayer> myLayerSet;
mypLayer1->setRendererV2(mypRenderer1);
mypLayer2->setRendererV2(mypRenderer2);

// Add Vector Layers to the Layer Registry
QgsMapLayerRegistry::instance()->addMapLayer(mypLayer1, true);
QgsMapLayerRegistry::instance()->addMapLayer(mypLayer2, true);
// Add Layers to the Layer Set
myLayerSet.append(QgsMapCanvasLayer(mypLayer1, true));
myLayerSet.append(QgsMapCanvasLayer(mypLayer2, true));

// Create the Map Canvas
QgsMapCanvas * mypMapCanvas = new QgsMapCanvas(0, 0);
mypMapCanvas->setExtent(QgsRectangle(-63.50, -28.10, -58.33, -24.00));  // Chaco
mypMapCanvas->setWheelAction(QgsMapCanvas::WheelAction(2) , 1.2);
mypMapCanvas->enableAntiAliasing(true);
mypMapCanvas->setCanvasColor(QColor(255, 255, 255));
mypMapCanvas->freeze(false);
// Set the Map Canvas Layer Set
mypMapCanvas->setLayerSet(myLayerSet);
mypMapCanvas->setVisible(true);
mypMapCanvas->setWindowTitle("GIS DSH");
mypMapCanvas->refresh();

// Start the Application Event Loop
int retval = app.exec();

app.exitQgis();

return retval;
}

Пути жестко закодированы (плохая практика программирования), но только для этого теста.

И теперь все работает хорошо. Пожалуйста, смотрите мой пост на gis.stackexchange.com для ссылок и скриншотов Qt Creator Build & Запустите конфигурации.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]