QGIS二次开发第三讲

第三讲主要实现了矢量要素的标注(Label)功能,代码是在第二节的基础上进行修改

第一步:在qgis2.h文件中,增加相关头文件,主要三个头文件如下:qgslabel.h,qgslabelattribute.h qgsfield.h文件

具体代码如下所示:

[cpp]  view plain copy
  1. #include <QtGui/QMainWindow>  
  2. #include "ui_qgis2.h"  
  3. #include <qgsapplication.h>  
  4. #include <qgsproviderregistry.h>  
  5. #include <qgssinglesymbolrenderer.h>  
  6. #include <qgsmapcanvas.h>  
  7. #include <qgsvectorlayer.h>  
  8. #include <qgsmaptool.h>  
  9. #include <QtGui/QVBoxLayout>  
  10. #include <qgsmaplayerregistry.h>  
  11. #include <QtGui/QToolBar>  
  12. #include<qgsmaptoolpan.h>  
  13. #include <qgsmaptoolzoom.h>  
  14.   
  15. <span style="color:#ff0000;">#include <qgsvectordataprovider.h>  
  16.   
  17. //标注添加的头文件  
  18. #include <qgslabel.h>//一个用来渲染label的类,label渲染属性可以直接指定或者根据属性值动态指定  
  19. #include <qgslabelattributes.h>//此类保存了label渲染所需要的属性值,比如字大小,位置等属性  
  20. #include <qgsfield.h>//此类用于将字段包装成属性表或者是数据源的形式  
  21.   
  22. //添加QT 对话框的头文件  
  23. #include <qmessagebox.h>  
  24. #include <qstring.h></span>  


第二步:在qgis2.cpp文件,addlayer()函数增加代码,主要代码如下:

[cpp]  view plain copy
  1. void qgis2::addLayer()  
  2. {  
  3.     //读取矢量数据  
  4.     QString myLayerPath ="../data";  
  5.     QString myLayerBaseName = "test";  
  6.     QString myPoviderName="ogr";  
  7.     QList<QgsMapCanvasLayer> myLayerSet;  
  8.     QgsVectorLayer* myLayer = new QgsVectorLayer(myLayerPath,myLayerBaseName,myPoviderName);  
  9.     if (myLayer->isValid())  
  10.     {  
  11.   
  12.     QgsSingleSymbolRenderer *myRenderer = new QgsSingleSymbolRenderer(myLayer->geometryType());  
  13.     myLayer->setRenderer(myRenderer);  
  14.     <span style="color:#ff0000;">QgsLabel * mypLabel;  
  15.     //得到关联mylayer的label指针  
  16.     mypLabel=myLayer->label();  
  17.     QgsLabelAttributes * mypLabelAttributes;  
  18.     mypLabelAttributes = mypLabel->layerAttributes();  
  19.     //得到矢量图层的字段列表  
  20.     //typedef QMap<int,QgsField> QgsFieldMap  
  21.     QgsFieldMap myFields = myLayer->dataProvider()->fields();  
  22.     for (unsigned int i=0;i<myFields.size();i++)  
  23.     {  
  24.         QMessageBox::information(NULL,QString(tr("字段信息")),QString(myFields[i].name()).toLocal8Bit(),QMessageBox::Yes);  
  25.     }  
  26.     //在这里用最后一个字段作为标注的字段  
  27.     mypLabel->setLabelField(QgsLabel::Text,myFields.size()-1);  
  28.     //设置label的颜色,需要用到labelAttribute对象  
  29.     mypLabelAttributes->setColor(Qt::black);  
  30.     mypLabelAttributes->setBufferEnabled(true);  
  31.     mypLabelAttributes->setBufferColor(Qt::yellow);  
  32.     int myType = QgsLabelAttributes::PointUnits;  
  33.     mypLabelAttributes->setBufferSize(1,myType);  
  34.       
  35.     //启用标注  
  36.     myLayer->enableLabels(true);</span>  
  37.     //增加矢量数据到图层注册  
  38.     QgsMapLayerRegistry::instance()->addMapLayer(myLayer,true);  
  39.     //设置画布的extent  
  40.     mpMapCanvas->setExtent(myLayer->extent());  
  41.     //设置画布的图层数据集  
  42.     myLayerSet.append(QgsMapCanvasLayer(myLayer));  
  43.     mpMapCanvas->setLayerSet(myLayerSet);  
  44.     }  
  45.     else  
  46.     {  
  47.         return;  
  48.     }  
  49. }  
第三步:修改main.cpp文件,使其支持中文显示,具体代码如下:

[cpp]  view plain copy
  1. int main(int argc, char *argv[])  
  2. {  
  3.     QgsApplication a(argc, argv,TRUE);  
  4.     <span style="color:#ff0000;">//设置支持中文显示  
  5.     QTextCodec *codec=QTextCodec::codecForName("System");  
  6.     QTextCodec::setCodecForLocale(codec);  
  7.     QTextCodec::setCodecForCStrings(codec);  
  8.     QTextCodec::setCodecForTr(codec);</span>  
  9.     qgis2 w;  
  10.     w.show();  
  11.     return a.exec();  
  12. }  
最后程序执行效果如下图所示:

QGIS二次开发第三讲_第1张图片

你可能感兴趣的:(开源gis)