这篇文章是基于已经正确编译并且生成二次开发所需的库文件的基础上的,如果你还没有得到开发的库文件,请参见我的上一篇博文,点击这里查看。
OK,要进行二次开发首先就是环境配置。这里使用的QGis版本为1.8。打开Visual Studio 2010,新建一个Qt application(如果你没有这个项目模板说明你没有正确安装Qt for vs add-in插件),这样做可以避免我们手动去添加Qt的库文件目录。出现如下界面:
注意将 XML library勾上,这个非常重要,不然后面会报错。因为QgsMapCanvas需要用到QDomNode文件,而QDomNode是一个XML文件,包含在Qt的XML library中。
点击Finish之后,生成解决方案。在工程项目上点击右键—属性,出现工程属性配置对话框,在这里我们需要配置QGis的开发库路径,分别包含4个设置步骤,分别是:
1、添加附加包含目录:
选中C/C++选项卡的“常规”选项,在附加包含目录当中加入编译QGis生成的include文件夹路径,如:
2、添加预处理命令:
选中C/C++选项卡下的“预处理器”命令,添加预处理定义,输入下图中的三行预处理命令:
3、添加附加库目录
在链接器选项卡下,打开“常规”,添加附加库目录,将QGis开发库中的lib文件夹添加进来,例如:
4、输入附加依赖项
选择链接器选项卡中的“输入”选项,添加附加依赖项,将下图所示三行个lib文件名称添加进来:
OK,大功告成,下面就是写测试代码了。
我将QGis官方文档中的一段代码贴过来,大家可以用此来测试自己的环境是否正确搭建。非常简单,把你的main.cpp文件中的代码替换为下面的代码:
-
#include<QtGui/QApplication>
-
#include<qgsapplication.h>
-
#include<qgsproviderregistry.h>
-
#include<qgssinglesymbolrenderer.h>
-
#include<qgsmaplayerregistry.h>
-
#include<qgsvectorlayer.h>
-
#include<qgsmapcanvas.h>
-
#include<QString>
-
#include<QApplication>
-
#include<QWidget>
-
int main( intargc, char *argv[] )
-
{
-
QgsApplication a( argc, argv ,true);
-
//
-
//注意这三行代码需要更改路径;
-
QString myPluginsDir ="D:/3rd_Party/qgis1.8vs2008/plugins";//插件路径(编译好的qgis文件夹下的plugins文件夹);
-
QString myLayerPath ="E:/Jacory/Work/Clip.shp";//图层路径,必须设置为你电脑里面shp文件的路径,不然打不开数据;
-
QStringmyLayerBaseName = "Clip";//图层名称;
-
//
-
QgsProviderRegistry::instance( myPluginsDir); //初始化插件的目录;
-
QgsVectorLayer * mypLayer = newQgsVectorLayer( myLayerPath, myLayerBaseName, "ogr" ); //初始化矢量图层;
-
QgsSingleSymbolRenderer *mypRenderer = newQgsSingleSymbolRenderer( mypLayer->geometryType() );
-
QList <QgsMapCanvasLayer> myLayerSet;
-
mypLayer->setRenderer( mypRenderer );
-
QgsMapLayerRegistry::instance()->addMapLayer( mypLayer, TRUE );
-
myLayerSet.append( QgsMapCanvasLayer(mypLayer, TRUE ) );
-
QgsMapCanvas * mypMapCanvas = newQgsMapCanvas( 0, 0 );
-
mypMapCanvas->setExtent(mypLayer->extent() );
-
mypMapCanvas->enableAntiAliasing( true);
-
mypMapCanvas->setCanvasColor( QColor(255, 255, 255 ) );
-
mypMapCanvas->freeze( false );
-
mypMapCanvas->setLayerSet( myLayerSet);
-
mypMapCanvas->setVisible( true );
-
mypMapCanvas->refresh();
-
return a.exec();
-
}
这里要注意的是上面标注出来的三行路径代码需要更改。
OK,非常简单,将QGis安装目录中的bin文件夹下各种dll文件拷贝过来就能够调试运行了,注意,不是QGis开发包路径,是QGis Desktop安装的路径下面的bin文件夹。当然,你不想安装QGis也可以将OSGeo4W的bin文件夹下的dll和QGis开发库目录的bin文件夹下的dll文件,以及所有用到的第三方库的dll文件都拷贝到VS工程目录的文件夹下也可以。dll文件如下图:
我没有去研究到底哪些需要,哪些不需要,我采取了最简单的办法,把这些dll全部复制过去。。。
最后,调试运行,出现下图所示界面,恭喜你,你成功了!Enjoy!
补充一点:如果你运行时出现“无法找到QDomDocument(或者QDomNode)”的错误,说明你的Qt没有包含XML library,我上面已经讲过了。这里你还是可以在VS菜单栏里面选择Qt菜单—Project Settings进行设置,如下图:
最后,有用QGis进行二次开发的朋友,我非常希望与大家交流,互相学习,请大家指教!谢谢!
2015年12月26日 更新:
上面的测试代码从2.0开始已经不能用了,鉴于很多同学反应,将新版本的测试代码贴上来,如下:
-
#include<QtGui/QApplication>
-
#include<qgsapplication.h>
-
#include<qgsproviderregistry.h>
-
#include<qgssinglesymbolrendererv2.h>
-
#include<qgsmaplayerregistry.h>
-
#include<qgsvectorlayer.h>
-
#include<qgsmapcanvas.h>
-
#include<QString>
-
#include<QApplication>
-
#include<QWidget>
-
#include <QStringList>
-
#include<QMessageBox>
-
#include<QObject>
-
#include <QList>
-
#include <QFileInfoList>
-
#include <QDir>
-
#include <QLibrary>
-
#include <QDebug>
-
int main( int argc, char *argv[] )
-
{
-
QgsApplication myApp( argc, argv, true );
-
QgsApplication::setPrefixPath( "C:/Program Files/qgis2.9.0", true );
-
QString pluginPath = QgsApplication::pluginPath();
-
QgsApplication::initQgis();
-
QgsProviderRegistry* provider = QgsProviderRegistry::instance();
-
QString myLayerPath = "D:/Data/qgis_sample_data/shapefiles/airports.shp";
-
QString myLayerBaseName = "airports"; //图层名称;
-
QList<QgsMapLayer*> myList;
-
QgsVectorLayer* mypLayer = new QgsVectorLayer( myLayerPath, myLayerBaseName, "ogr", false );
-
if ( !mypLayer )
-
{
-
return 0;
-
}
-
if ( mypLayer->isValid() )
-
{
-
QMessageBox::information( 0, "", "layer is valid" );
-
mypLayer->setProviderEncoding( "System" );
-
myList << mypLayer;
-
}
-
QgsMapLayerRegistry::instance()->addMapLayer( mypLayer );
-
QList<QgsMapCanvasLayer> myLayerSet;
-
myLayerSet.append( QgsMapCanvasLayer( mypLayer ) );
-
QgsMapCanvas* mypMapCanvas = new QgsMapCanvas( 0, 0 );
-
mypMapCanvas->setExtent( mypLayer->extent() );
-
mypMapCanvas->enableAntiAliasing( true );
-
mypMapCanvas->setCanvasColor( QColor( 255, 255, 255 ) );
-
mypMapCanvas->freeze( false );
-
mypMapCanvas->setLayerSet( myLayerSet );
-
mypMapCanvas->setVisible( true );
-
mypMapCanvas->refresh();
-
return myApp.exec();
-
}
暂无评论内容