2017-06-17 299 views
0

我想开发一个使用QGIS API的QT C++应用程序,但我无法管理Qt Creator来编译代码。我已经阅读了gis.stackexchange和其他来源的几个主题。信息大多是过时的,我还没有找到解决方案。我需要的是关于以下项目的兼容性的总体指导方针,帮助我找到正确的组合:解决:使用QGIS API的QT C++应用程序

  • 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 64位。 OSGeo4W或OSGeo4W64。

的Qt工程确定在它自己的图书馆每一个案件,但是当我尝试导入QGIS库它给建筑物时,即使智能感知工作正常,因为它承认QgsApplication作为qgsapplication成员的“未定义的引用”错误。H。

以下只是一个测试我无法工作。我的亲文件是:

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造物主我卡在他开始。

+0

它只是一个C++的问题,它意味着没有定义类的类型。这需要包括在内。如果这不在qgsapplication.h中,那么我们不知道。也许有一个需要提供的名称空间。这是一个编程语言的问题层面。除此之外,没有人应该提供项目的绝对路径。 – AlexanderVX

回答

0

我发现上述项目的正确组合,以使人们有可能对Qt的进口QGIS库和构建应用程序:

  • 的Qt 4.8.6 MSVC2010
  • Qt Creator的4.3.0(从Qt 5.9.0安装)。 Qt Creator 3.0也可以使用。
  • 的Visual C++快讯2010年 - 包括Windows套件/ SDK中安装
  • OSGeo4W - 安装QGIS-LTR-dev的所有库
  • 的CMake 2.8.2

要启动Qt Creator中我用这个。蝙蝠:

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 

为主。CPP文件(改编自Tim Sutton's examples

// 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 &的运行配置。