【问题标题】:QT C++ application using QGIS API使用 QGIS API 的 QT C++ 应用程序
【发布时间】:2023-03-03 01:39:01
【问题描述】:

我正在尝试开发一个使用 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 64 位。 OSGeo4W 或 OSGeo4W64。

Qt 在任何情况下都可以使用它自己的库,但是当我尝试导入 QGIS 库时,它会在构建时给出“未定义的引用”错误,即使 intellisense 工作正常,因为它将 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

ma​​in.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 还很陌生,所以我一开始就卡住了。

【问题讨论】:

  • 这只是一个 C++ 问题,这意味着未定义类类型。这需要包括在内。如果那不在 qgsapplication.h 中,那么我们不知道。也许需要提供一个命名空间。这是一个编程语言级别的问题。除此之外,任何人都不应在项目中提供绝对路径。

标签: c++ qt open-source qgis windows-10-desktop


【解决方案1】:

我找到了上述项目的正确组合,使 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

ma​​in.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 构建和运行配置的链接和屏幕截图。

【讨论】:

    猜你喜欢
    • 2017-07-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多