昨天在程序里添加了编辑矢量图层符号的功能,右键LayerTree的矢量图层,选择“Edit Symbol”,便可以选择或编辑图层的渲染符号。
实现方法很简单,首先参照http://blog.csdn.net/deirjie/article/details/50428179,实现自定义的右键菜单类,具体代码可参考源码中的QgsAppLayerTreeViewMenuProvider类。源码里有一个editVectorSymbol()方法,原封不动地copy到自己的代码里就行了。
1 void QgsAppLayerTreeViewMenuProvider::editVectorSymbol() 2 { 3 QAction* action = qobject_cast< QAction*>( sender() ); 4 if ( !action ) 5 return; 6 7 QString layerId = action->property( "layerId" ).toString(); 8 QgsVectorLayer* layer = dynamic_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( layerId ) ); 9 if ( !layer ) 10 return; 11 12 QgsSingleSymbolRendererV2* singleRenderer = dynamic_cast< QgsSingleSymbolRendererV2* >( layer->rendererV2() ); 13 if ( !singleRenderer ) 14 return; 15 16 QScopedPointer< QgsSymbolV2 > symbol( singleRenderer->symbol() ? singleRenderer->symbol()->clone() : nullptr ); 17 QgsSymbolV2SelectorDialog dlg( symbol.data(), QgsStyleV2::defaultStyle(), layer, mView->window() ); 18 dlg.setMapCanvas( mCanvas ); 19 if ( dlg.exec() ) 20 { 21 singleRenderer->setSymbol( symbol.take() ); 22 layer->triggerRepaint(); 23 mView->refreshLayerSymbology( layer->id() ); 24 } 25 }
以下为点状的Symbol Selector实现效果:
由于QGIS线状符号库里没有箭头符号,中午时使用QGIS桌面版自定义了一个带箭头的线状符号。线型为Marker Line,Marker placement为“on last vertex only”;Marker的类型为SVG marker,使用的箭头svg图标路径是开发包路径下的/svg/arrows/Arrow_05.svg;在设置一下点和线的尺寸、偏移、角度等参数便可以得到了。
跟ArcGIS中的箭头符号对比一下:
出乎我意料的是,在运行自己的代码时,发现程序的Symbol Selector跟桌面版的一样,也多了这个新定义的“GPS Arrow”符号。也就是说,这个符号设置应该是配置到了一个QGIS的类似环境变量的地方,经过一番探索发现,用户文件夹下有一个.qgis2的文件夹(我的是C:\Users\FangZhe\.qgis2)里面存放的应该是QGIS的配置数据。文件夹下有一个symbology-ng-style.db二进制文件。测试了一下,将此文件移走,再次打开符号编辑对话框,里面的符号样式就只剩默认符号了,此时.qgis2文件夹下又生成了一个新的symbology-ng-style.db文件。由此看来,此文件确实就是QGIS的符号库文件。日后发布程序时,应该只需要设置将此文件预先添加到配置文件夹之中就可以了,如此便可以省去用代码自定义符号的工作。
现在对.qgis2文件夹还是不甚了解,不过暂时不想多花力气研究它,日后用到时再说吧。
感谢博主Jacory_Gao的博客,对我的开发工作帮助巨大。关于如何使用代码自定义符号样式,可参考这篇文章:http://blog.csdn.net/deirjie/article/details/50464768