前言
1、QGIS二次开发只需要相关的:头文件(.h)、库文件(.lib和.dll)即可。本教程基于QGIS 2.14.16版本,如果对源码编译感兴趣,可在木君的博文:《QGIS 2.14编译(QGIS 2.14.16 && Qt-4.8.6 && VS2010 )》中一探详情。
2、本教程仅适合Release版本的开发。
具体过程
1、在完成源码编译的基础上,进行二次开发前,木君建议将生成的依赖文件(头文件.h、库文件.lib和.dll)组织到一起,便于调用。例如,木君的组织如下图所示,其中头文件置于include文件夹中,静态库文件置于lib文件夹中,动态链接库文件置于bin文件夹下。
各文件夹中的依赖项如下:
2、在VS2010中,新建Qt Application工程,工程名如“qgis_killer”,然后直接点击“finish”即可完成创建。对应生成的文件主要有3个,分别是:“QgisKiller.h”(大小写在创建工程时可指定)、“QgisKiller.cpp”和“main.cpp”。
3、添加工程依赖项。首先在“调试”中配置依赖的dll路径:
然后配置依赖的头文件路径,木君的配置可供参考:
然后在“C++/预处理器”中添加:
最后是配置相关的lib文件路径:
4、按照上述步骤配置完成后,编辑项目的UI文件:
双击打开后,作如图所示编辑,添加两个功能菜单,一个是“添加矢量图层”,另一个是“添加栅格图层”,对应的菜单控件名称分别为:action_addShp和action_addRaster。
然后即可在“QgisKiller.h”和“QgisKiller.cpp”中添加相应的槽函数,实现添加图层功能。
5、“QgisKiller.h”中的代码如下:
#ifndef QGISKILLER_H
#define QGISKILLER_H
#include <QtGui/QMainWindow>
#include "ui_qgiskiller.h"
#include <QList>
#include <QTextCodec>
#include <qgsmapcanvas.h>
#include <qgsmaplayer.h>
class QgisKiller : public QMainWindow
{
Q_OBJECT
public:
QgisKiller(QWidget *parent = 0, Qt::WFlags flags = 0);
~QgisKiller();
public slots:
// 添加矢量图层集
void slotAddVectorLayerSet();
// 添加栅格图层集
void slotAddRasterLayerSet();
private:
Ui::QgisKillerClass ui;
// 定义地图画布
QgsMapCanvas* m_pMapCanvas;
// 定义地图画布上的图层集(一个画布可以对应多个图层)
QList<QgsMapCanvasLayer> m_MapCanvasLayerSet;
};
#endif // QGISKILLER_H
6、“QgisKiller.cpp”中的代码如下:
#include "QgisKiller.h"
#include <QDialog>
#include <QFileDialog>
#include <QMessageBox>
#include <qgsvectorlayer.h>
#include <qgsmaplayerregistry.h>
#include <qgsrasterlayer.h>
QgisKiller::QgisKiller(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
QTextCodec *codec = QTextCodec::codecForName("gbk");
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);
m_pMapCanvas = new QgsMapCanvas();
setCentralWidget( m_pMapCanvas );
m_pMapCanvas->enableAntiAliasing( true );
m_pMapCanvas->setCanvasColor( QColor( 255, 255, 255 ) );
m_pMapCanvas->setVisible( true );
connect(ui.action_addShp, SIGNAL(triggered()), this, SLOT(slotAddVectorLayerSet()));
connect(ui.action_addRaster, SIGNAL(triggered()), this, SLOT(slotAddRasterLayerSet()));
}
QgisKiller::~QgisKiller()
{
}
void QgisKiller::slotAddVectorLayerSet()
{
// 选择矢量文件
QString strShpFilePath = QFileDialog::getOpenFileName(this, "加载矢量图层", "", "*.shp");
QString src = strShpFilePath.trimmed();
QFileInfo fi( src );
QString strBaseFileName = fi.completeBaseName();
QgsDebugMsg( "completeBaseName: " + strBaseFileName );
// 创建矢量图层
QgsVectorLayer* pVectorLayer = new QgsVectorLayer( strShpFilePath, strBaseFileName, "ogr", false);
Q_CHECK_PTR( pVectorLayer );
if ( !pVectorLayer )
{
m_pMapCanvas->freeze(false);
return;
}
if ( !pVectorLayer->isValid() )
{
QMessageBox::critical(this, "错误", "图层非法");
delete pVectorLayer;
return;
}
QgsMapLayerRegistry::instance()->addMapLayer( (QgsMapLayer*)pVectorLayer, true );
m_MapCanvasLayerSet.append( QgsMapCanvasLayer(pVectorLayer, true) );
m_pMapCanvas->setExtent( pVectorLayer->extent() );
m_pMapCanvas->setLayerSet( m_MapCanvasLayerSet );
m_pMapCanvas->freeze( false );
m_pMapCanvas->setVisible( true );
m_pMapCanvas->refresh();
}
void QgisKiller::slotAddRasterLayerSet()
{
// 选择栅格文件
QString strShpFilePath = QFileDialog::getOpenFileName(this, "加载栅格图层", "", "*.tif");
QStringList strItemList = strShpFilePath.split( "/" );
QString strBaseFileName = strItemList.at(strItemList.size() - 1);
// 创建栅格图层
QgsRasterLayer* pRasterLayer = new QgsRasterLayer( strShpFilePath, strBaseFileName, "gdal");
if(!pRasterLayer->isValid())
{
QMessageBox::critical(this, "错误", "图层非法");
return;
}
QgsMapLayerRegistry::instance()->addMapLayer( pRasterLayer );
m_MapCanvasLayerSet.append( pRasterLayer );
m_pMapCanvas->setExtent( pRasterLayer->extent() );
m_pMapCanvas->setLayerSet( m_MapCanvasLayerSet );
m_pMapCanvas->setVisible( true );
m_pMapCanvas->freeze( false );
m_pMapCanvas->refresh();
}
7、“main.cpp”中的代码如下:
#include "QgisKiller.h"
#include <QtGui/QApplication>
#include<QApplication>
#include<QWidget>
#include <qgsapplication.h>
#include <qgsproviderregistry.h>
int main(int argc, char *argv[])
{
QTextCodec *codec=QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);
QgsApplication qgsApp(argc, argv, true);
QString strMyPluginDir = QString::fromLocal8Bit("D:/qgis_2_14_master/src/build/output/plugins/RelWithDebInfo");
QgsProviderRegistry::instance(strMyPluginDir);
QgsApplication::initQgis();
QgisKiller w;
w.show();
return qgsApp.exec();
}
8、运行效果如图:
(1)添加矢量图层:
(2)添加栅格图层:
1958

被折叠的 条评论
为什么被折叠?



