[Qgis-developer] How do I change the symbol and its size from a provider?

Ken Roser kroser at roser.us
Wed Jan 23 16:36:08 EST 2008


This was very helpful.  I noticed the layer map was actually a std::map 
instead of a QMap, so I had to change to code to adjust to that.  I can 
now display my custom symbol on the map, but I noticed the graphic for 
the symbol you see on the stack of layers on the left pane of QGIS 
doesn't show my new symbol.  How would I update that symbol also?

Tim Sutton wrote:
> Hi
>
> You would need to create a modified version of the delimited text
> plugin (the gui not the provider). After the gui creates the
> vectorlayer based on the delimited text provider, you would apply your
> symbology using code similar to my last post, and then return control
> to the user interface. Here is the logic trail:
>
> http://svn.qgis.org/trac/browser/trunk/qgis/src/plugins/delimited_text/qgsdelimitedtextplugingui.cpp
> 107 	    emit drawVectorLayer(uri,txtLayerName->text(),"delimitedtext");
>
> http://svn.qgis.org/trac/browser/trunk/qgis/src/plugins/delimited_text/qgsdelimitedtextplugin.cpp
> 131 	void QgsDelimitedTextPlugin::drawVectorLayer(QString thePathNameQString,
> 132 	    QString theBaseNameQString, QString theProviderQString)
> 133 	{
> 134 	  qGisInterface->addVectorLayer( thePathNameQString,
> 135 	      theBaseNameQString, theProviderQString);
> 136 	}
>
> From there things get a bit tricky because addVectorLayer returns bool
> so you dont at that point have a handle for the actual layer. So next
> you need to trawl the registry and find your layer from the layers
> map:
>
> QMap<QString, QgsMapLayer*> myMapLayers =
>      QgsMapLayerRegistry::instance()->mapLayers();
> QMap<QString, QgsMapLayer*>::const_iterator myIterator;
> QgsMapLayer * mypLayer;
> while (myIterator.hasNext())
> {
>   mypLayer = myIterator.value();
>   if (mypLayer->source() == theFileNameYouUsedToLoadTheLayer)
>  {
>      //layer is found
>      break;
>   }
> }
>
> Now you can cast the layer to a vector layer:
>
> QgsVectorLayer *mypVectorLayer  =
>             dynamic_cast<QgsVectorLayer *> ( mypLayer );
>     if ( mypVectorLayer )
>     {
>         const QgsRenderer* mypRenderer = mypVectorLayer->renderer();
>         //now set symbology etc...
>      }
>
>
> Writing this makes me wonder if we shouldnt make addVectorLayer return
> the registry layer id, but the above describes how you can achieve
> your desired result.
>
> Hope that helps!
>
> Regards
>
> Tim
>
>
>
>
> 2008/1/23, Ken Roser <kroser at roser.us>:
>   
>> Sorry if I wasn't too clear.  Let me try to present the problem just a
>> bit differently.
>>
>> Let's say I'm using the delimited text plugin and provider, as is, in
>> the source code, but I want to modify it so that the points are
>> displayed as triangles instead of squares and at size 20 instead of the
>> default.  These choices would be built into the software, i.e., not user
>> selectable.  How would I do that?
>>
>> Tim Sutton wrote:
>>     
>>> Hi Ken
>>>
>>> I'm not sure that it makes sense to set symbology in your provider
>>> itself so Im hoping you are trying to do it from some kind of add
>>> layer gui, but you havent provided much information for me to know
>>> whats really going on. That said here is how you can set the symbol on
>>> a new vector layer instance programmatically:
>>>
>>>  1572           QgsSymbol *  mypSymbol = new
>>> QgsSymbol(mypVectorLayer->vectorType());
>>>  1573           QColor
>>> myPresenceColor(mySettings.value("mapping/presenceColour",QColor(Qt::green).name()).toString());
>>>  1574           mypSymbol->setFillColor(myPresenceColor);
>>>  1575           mypSymbol->setColor(Qt::black); //outline
>>>  1576           mypSymbol->setPointSize(mySymbolSize);
>>>  1577           mypSymbol->setFillStyle(Qt::SolidPattern);
>>>  1578           QgsSingleSymbolRenderer *mypRenderer = new
>>> QgsSingleSymbolRenderer(mypVectorLayer->vectorType());
>>>  1579           mypRenderer->addSymbol(mypSymbol);
>>>  1580           mypVectorLayer->setRenderer(mypRenderer);
>>>
>>> The above is a single symbol renderer take from one of my cpp
>>> projects. The same project also implements a unigue value renderer -
>>> see the original source at http://tinyurl.com/3xystm for more info.
>>>
>>> I hope that helped!
>>>
>>> Regards
>>>
>>> Tim
>>>
>>> 2008/1/23, Ken Roser <kroser at roser.us>:
>>>
>>>       
>>>> I'm writing a plugin/provider that's similar in functionality to the
>>>> delimited text plug in.  Things are working well, but I need to change
>>>> the size, color and possibly the symbol itself when I add a point to the
>>>> map.  I've been unable to determine a method of doing so other than
>>>> going to the symbology tab on the layer properties dialog.  I want the
>>>> change to happen automatically via the provider code.  Can anyone help out?
>>>> _______________________________________________
>>>> Qgis-developer mailing list
>>>> Qgis-developer at lists.qgis.org
>>>> http://lists.qgis.org/cgi-bin/mailman/listinfo/qgis-developer
>>>>
>>>>
>>>>         
>>>
>>>       
>>     
>
>
>   




More information about the Qgis-developer mailing list