QT C++使用 QGIS API 的应用程序
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 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
主.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库并构建应用程序:
- Qt 4.8.6 用于MSVC2010
- 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:
创建者.bat:
ECHO Setting up QGIS DEV ENV
set PYTHONPATH=
set OSGEO4W_ROOT=C:OSGeo4W
call "%OSGEO4W_ROOT%bino4w_env.bat"
@set QMAKESPEC=win32-msvc2010
@set PATH=%OSGEO4W_ROOT%bin;%OSGEO4W_ROOT%appsqgis-ltr-devbin;%PATH%
@set INCLUDE=%INCLUDE%;%OSGEO4W_ROOT%include;%OSGEO4W_ROOT%appsqgis-ltr-devinclude
@set LIB=%LIB%;%OSGEO4W_ROOT%lib;%OSGEO4W_ROOT%appsqgis-ltr-devlib
path %OSGEO4W_ROOT%bin;%SYSTEMROOT%System32;%SYSTEMROOT%;%SYSTEMROOT%System32wbem;C:Program Files (x86)Gitbin;C:ToolsQtCreatorbin;%PATH%
set VS100COMNTOOLS=C:Program Files (x86)Microsoft Visual Studio 10.0Common7Tools
call "C:Program Files (x86)Microsoft Visual Studio 10.0VCvcvarsall.bat" x86
start "Qt Creator" /B C:QtQt5.9.0ToolsQtCreatorbinqtcreator.exe %*
专业文件:
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配置的链接和屏幕截图。
相关文章:
- 如何在不破坏现有应用程序的情况下更改 API 中 stl 容器的数据类型?
- 设置我的应用程序 API 感知并防止系统使其模糊和错误定位
- 如何使用 ALSA API 在应用程序中在单声道和立体声之间切换声音输出?
- 当某些应用程序处于全屏模式时,DesktopDuplication API会产生黑帧
- 如果在 DLL 和调用应用程序中使用 GPGPU API,会发生什么情况
- Windows 应用程序中的谷歌地图 API
- QT C++使用 QGIS API 的应用程序
- 检查任务栏中的当前应用程序吗?(C ,Windows API)
- 如何监视应用程序进行的Windows系统API调用?
- 如何在应用程序正在运行的系统上查看所需的Windows API函数
- 在 API 和应用程序线程之间共享数据
- 需要知道 Windows API 才能在我的应用程序激活时获取回调
- 如何从Qt应用程序访问UWP API
- 调试Win32 API应用程序以进行内存泄漏
- 如何从Windows上的Windows API上的另一个应用程序获得应用程序宽度和高度
- 如何以编程方式为应用程序创建文件夹,以使用 BOX REST API 在其中上传内容
- 如何在控制台应用程序中使用GetMessage()使用Windows API识别C++中的键盘输入
- C++:使用 API 的应用程序体系结构
- 带有API的WinRT应用程序,该应用程序使用共享的MFC dll
- 检索应用程序提供的所有Python API的列表