昨天在程序里添加了編輯矢量圖層符號的功能,右鍵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