簡體   English   中英

使用QGIS API的QT C ++應用程序

[英]QT C++ application using QGIS API

我正在嘗試開發使用QGIS API的QT C ++應用程序,但是我無法管理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編譯的。 我嘗試使用MinGW從源代碼編譯QGIS,但沒有成功(再次,存在版本兼容性問題)。
  • Windows版本:我正在使用Windows 10 64bit。 OSGeo4W或OSGeo4W64。

Qt在每種情況下都可以使用其自己的庫工作,但是,當我嘗試導入QGIS庫時,即使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相當陌生,所以我一開始就陷入了困境。

我發現上述項目的正確組合,使Qt可以導入Qgis庫並構建應用程序:

  • 適用於MSVC2010的Qt 4.8.6
  • Qt Creator 4.3.0(來自Qt 5.9.0安裝)。 也可以使用Qt Creator 3.0。
  • Visual C ++ Express 2010-安裝中包含Windows套件/ 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文件(改編自Tim Sutton的示例

// 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&Run配置的鏈接和屏幕截圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM